TCP 引擎何时决定发送 ACK?

TCP 引擎何时决定发送 ACK?

在我的局域网中,我有一个运行 Samba 服务器的路由器,我的 PC 连接到该路由器。

我在向服务器上传和从服务器下载过程中使用了 wireshark。

wireshark结果显示:

  • 上传过程中,服务器平均每0.6ms发送一次ACK
  • 在下载过程中,我的电脑平均每 0.025 毫秒发送一次 ACK

因此,下载产生了约12万帧,而上传只产生了7万帧。下载速率约为12.7Mbytes/s,而上传速率为20Mbytes/s。

所以我想找出造成这种情况的可能原因。

答案1

TCP 实现每隔一个数据包都会确认一次。因此,您通常会看到收到两个数据包,然后发送一个 ACK​​。当然,发送方无论如何都不会等待 ACK。即使没有 ACK,它也会继续传输,直到窗口已满。

这里可能还有其他因素在起作用,例如 Nagle 和延迟 ACK。但您似乎没有看到它们的影响。

答案2

主要有两种机制可以减少返回的 ACK 数据包数量 - Nagle 算法和延迟 ACK - 均在RFC 1122。两者都是可选的,因此有些主机要么配置为不使用它们,要么缺少适当的实现。socket options = TCP_NODELAY特别是,可以通过在配置中使用以下命令指示 Samba 禁用 Nagle 算法

不过,SMB 文件复制的上行/下行数据速率的差异很可能有除 TCP ACK 数据包过多之外的其他原因。

相关内容