Node.js 在';数据';事件,为什么数据大小是1374的倍数?

Node.js 在';数据';事件,为什么数据大小是1374的倍数?,node.js,mtu,Node.js,Mtu,这只是一个基于好奇心的问题,但我可能会学到一些有用的东西 在Node.js服务器上,当我通过net.server接收数据时,我让它打印出每个数据“包”的大小(以字节为单位) 我注意到大部分时间它是1374字节。其他时间都是1374的倍数。在大约200个数据事件中,我得到的最高值是17862 这个1374号码是从哪里来的?为什么数据长度有时是它的倍数 我最好的猜测是,对于TCP,1500字节是以太网最常见的MTU,另外126个字节构成TCP数据包的报头。Node.js有时可能会在接收数据包足够快

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

在Node.js服务器上,当我通过net.server接收数据时,我让它打印出每个数据“包”的大小(以字节为单位)

我注意到大部分时间它是1374字节。其他时间都是1374的倍数。在大约200个数据事件中,我得到的最高值是17862

这个1374号码是从哪里来的?为什么数据长度有时是它的倍数



我最好的猜测是,对于TCP,1500字节是以太网最常见的MTU,另外126个字节构成TCP数据包的报头。Node.js有时可能会在接收数据包足够快的情况下将这些数据包聚集在一起,这就是为什么有时数据包会成倍到达的原因。

126的部分原因是TCP报头本身,即20字节

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


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

听起来是一个很好的假设。您是否检查过1374字节是否与您计算机上的巨型数据包大小相关?在Mac OS X上我将如何做?
socket.on 'data', (data) -> console.log data.length