4

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

使用我的 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 足够快地接收到这些数据包,有时可能会将它们聚集在一起,这就是为什么有时它们会以多个形式到达。

4

1 回答 1

1

126 的一部分是由于 TCP 标头本身,即 20 个字节。

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

这是一种减少进入每个完整数据集的处理量的常用技术(为什么要对三个单独的数据运行三次处理,而对于更大的现有数据集可以执行一次),但是在窗口的情况下- 涉及协商,它可能导致所谓的“傻窗综合症”(窗口缩小到要传递的数据小于标头本身的程度,从而使传输效率极低)。但是,如果您遇到了这个问题,您可能应该重新考虑发送和接收数据的方式。

于 2012-08-31T15:47:35.980 回答