在“数据”事件中,为什么数据大小是1374的倍数?

时间:2012-08-23 03:58:58

标签: node.js mtu

这只是一个基于好奇心的问题,但我可能会学到一些有用的东西。

使用我的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有时可能会将这些数据包聚集在一起,这就是有时它们以倍数到达的原因。

1 个答案:

答案 0 :(得分:1)

126的一部分是由TCP头本身引起的,即20字节。

数据还被服务器库强加的“标题”填充,这就是你所描述的原因:当收到多个数据包足够接近时,“聚集”数据。当数据包快速连续时,包含的额外信息用于确定正确的数据包顺序并连接数据以便返回。

这是减少进入每个完整数据集的处理量的常用技术(为什么在三个独立的数据上运行处理三次,当可以对较大的现有数据集执行一次时),但是在涉及窗口协商的情况下,它可能导致所谓的“愚蠢窗口综合症”(窗口被减少到传送的数据小于头部本身的点,使得传输效率极低)。但是,如果您已经遇到此问题,则应该重新考虑发送和接收数据的方式。