这只是一个基于好奇心的问题,但我可能会学到一些有用的东西. 使用我的Node.js服务器,当我通过net.Server接收数据时,我打印出每个数据“数据包”的大小(以字节为单位). socket.on 'data', (
使用我的Node.js服务器,当我通过net.Server接收数据时,我打印出每个数据“数据包”的大小(以字节为单位).
socket.on 'data', (data) -> console.log data.length
我注意到大多数时候它是1374字节.所有其他时间它是1374的倍数.我从大约200个数据事件中获得的最高值是17,862.
这个1374号码来自哪里?为什么数据长度偶尔是它的倍数?
我最好的猜测是,对于TCP,1500字节是以太网最常见的MTU,其他126个字节构成TCP数据包的标头.如果它们足够快地接收它们,Node.js有时可能会将这些数据包聚集在一起,这就是有时它们以倍数到达的原因.
126的一部分是由于TCP头本身,即20字节.数据还由服务器库强加的“标题”填充,这是因为你所描述的原因:当收到多个数据包足够接近时,“聚集”数据.当数据包快速连续时,包含的额外信息用于确定正确的数据包顺序并连接返回的数据.
这是一种减少进入每个完整数据集的处理量的常用技术(为什么在三个独立的数据上运行三次,当一个较大的现有数据集可以执行一次时),但是在窗口的情况下 – 涉及协商,它可以促成所谓的“愚蠢的窗口综合症”(窗口被减少到传递的数据小于头部本身的点,使得传输非常低效).但是,如果您遇到此问题,则应该重新考虑发送和接收数据的方式.