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

Jas*_*rks 10 linux nagle

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

Sor*_*vux 30

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

要为给定套接字禁用它,您可以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 ...
Run Code Online (Sandbox Code Playgroud)

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

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

有点清洁的是激活TCP的低延迟模式:

echo 1 > /proc/sys/net/ipv4/tcp_low_latency
Run Code Online (Sandbox Code Playgroud)

这将为TCP堆栈提供一个提示,以确定要做出哪些决定以降低延迟(我猜这是你试图通过禁用Nagle算法来实现的).默认情况下,它设置为优化带宽(将读取"0" /proc/sys/net/ipv4/tcp_low_latency).

  • 请注意,从内核 v4.14 开始, tcp_low_latency 不再执行任何操作。https://github.com/torvalds/linux/commit/b6690b14386698ce2c19309abad3f17656bdfaea#diff-ebf8916b6537cea0d23e1e0cd6abab61R356 (6认同)