我们知道Nagle 算法。想知道如何更改默认的 200ms 超时。在 Linux 中有没有办法设置此设置?
答案1
那200毫秒不是来自 Nagle 算法,而是来自延迟的 ACK。
您可以按照 Mark 的建议使用 setsocketopt 或使用 ip routes 禁用延迟 ACK,例如:
ip route change ROUTE quickack 1
我不知道有什么方法可以在“正常”(大多数是非实时)内核中为延迟 ACK 设置绝对超时。
答案2
如果传输中的数据尚未确认,Nagle 算法会阻止发送小型非全尺寸数据包。一旦收到所有未完成数据的确认,或缓冲区中有足够的新数据来构成全尺寸数据包,就会发送新数据包。Nagle 算法不涉及超时。
你所描述的行为可能是延迟确认这允许在收到每 2 个数据包时发送 ACK。如果在超时时间内未收到 2 个数据包,则发送 ACK。或者可能是类似于 Nagle 的 TCP Corking,但 TCP Corking 不会无限期地等待未完成数据的 ACK 后再发送新的小数据包,而是会阻止发送新数据包,直到缓冲区已满或超时到期(200 毫秒)。
根据你运行的 Linux 发行版,你可能能够使用 sysctl 修改延迟确认超时值。例如,要减少红帽企业版:
echo 1 > /proc/sys/net/ipv4/tcp_delack_min
然而此选项可能在其他版本的 Linux 中不可用。
或者,如果您有编程访问权限,您可以修改您的应用程序以使用TCP_QUICKACK
tcp 手册这将有效关闭延迟 ACK 功能并强制应用程序为收到的每个数据包发送 ACK。
要关闭 TCP Corking,您需要修改套接字调用来设置参数 TCP_CORK
- 我不知道有任何方法可以全局启用此功能。