当TCP引擎决定发送一个ACK?

在我的局域网中,我有一台运行Samba服务器的路由器,我的电脑连接到路由器。

我在上传到服务器和从服务器上下载的过程中发出了疑问。

wireshar结果显示:

  • 在上传过程中,服务器每隔0.6ms发送一个ACK
  • 在下载过程中,我的电脑每隔0.025ms发送一个ACK

结果,下载产生大约120000帧,而上传仅产生70000帧。 下载速率约为12.7Mbytes / s,上传速度为20Mbyte / s。

所以我想弄清楚这个可能的原因。

主要有两种机制来减less返回的ACK数据包数量 – Naglealgorithm和Delayed ACKs(均在RFC 1122中描述)。 两者都是可选的,所以会有主机被configuration为不使用它们或缺less适当的实现。 特别是可以指示Samba通过在configuration中使用socket options = TCP_NODELAY来禁用Naglealgorithm 。

您在SMB文件副本的上游/下游数据速率方面的差异很可能是除了大量的TCP ACK数据包之外的其他原因。

TCP实现确认每隔一个数据包。 所以通常应该看到收到两个数据包,然后发送一个ACK。 发送方当然不会等待ACK。 即使在没有ACK的情况下,它也会继续传输,直到窗口满了。

这里还有其他一些潜在的因素,比如Nagle和延迟ACK。 但是看起来你并没有看到它们的影响。