如何在Linux中禁用Nagle的算法?

时间:2013-07-24 18:48:27

标签: linux nagle

有没有办法通过命令行执行此操作? man tcp告诉我,我需要设置tcp_nodelay = 1,但我无法在/ proc / sys / net / ipv4下创建tcp_nodelay文件。如果有任何方法可以在Linux中禁用Nagle,请告诉我。

1 个答案:

答案 0 :(得分:29)

此标志(TCP_NODELAY)是一个可以基于每个套接字启用的选项,并在创建TCP套接字时应用。这样做是为了一个目的:Nagle的算法通常很有用,有助于处理网络拥塞。我怀疑你想在系统范围内禁用它,因为你的系统可能会受到这种停用的影响。

要为给定套接字禁用它,您可以在C中应用herehere中的解释TCP_NODELAY选项:

int flag = 1;
int result = setsockopt(sock,            /* socket affected */
                        IPPROTO_TCP,     /* set option at TCP level */
                        TCP_NODELAY,     /* name of option */
                        (char *) &flag,  /* the cast is historical cruft */
                        sizeof(int));    /* length of option value */
 if (result < 0)
    ... handle the error ...

您可能必须适应您的编程语言,但基本上它会将TCP_NODELAY标志选项设置为套接字sock,从而有效地禁用Nagle的算法。这在任何支持TCP标准的套接字的操作系统上都有效。

如果您仍想在系统范围内禁用Nagle算法,可以使用两个选项。首先,您可以使用相应的标志重新编译内核(请参阅您的分发手册)。第二个选项是创建一个软件,在每个现有连接上设置TCP_NODELAY标志,类似于this code。每次在系统上创建新的TCP连接时,都应执行后一个选项。

激活TCP的低延迟模式会更加清晰:

echo 1 > /proc/sys/net/ipv4/tcp_low_latency

这将提示TCP堆栈关于做出哪些决定以降低延迟(我猜这是你试图通过禁用Nagle算法实现的)。默认情况下,它设置为优化带宽(“{0”将从/proc/sys/net/ipv4/tcp_low_latency读取)。