15

有没有办法通过命令行来做到这一点?man tcp 告诉我需要设置 tcp_nodelay=1,但是我无法在 /proc/sys/net/ipv4 下创建 tcp_nodelay 文件。请让我知道是否有任何方法可以在 Linux 中禁用 Nagle。

4

1 回答 1

39

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

要为给定的套接字禁用它,您可以按照此处和C中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_NODELAYflag 选项设置为 socket sock,从而有效地禁用 Nagle 算法。这在任何带有支持 TCP 标准的套接字的操作系统上都是有效的。

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

激活 TCP 的低延迟模式会更简洁一些:

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

更新:在内核 v4.14 及更高版本中删除了 tcp_low_latency。

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

于 2013-07-24T19:34:31.407 回答