有没有通过命令行来实现的方法?man tcp告诉我需要设置tcp_nodelay=1,但是我无法在/proc/sys/net/ipv4下创建tcp_nodelay文件。请告诉我是否有在Linux中禁用Nagle的方法。
这个标记(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_NODELAY
标志选项设置到套接字 sock
上,有效地禁用 Nagle 算法。这在任何支持 TCP 标准的操作系统上都是有效的。TCP_NODELAY
标志,类似于 这段代码。后一选项应该在系统创建新的 TCP 连接时执行。echo 1 > /proc/sys/net/ipv4/tcp_low_latency
更新: tcp_low_latency已在内核v4.14及以上版本中删除。
这将为TCP堆栈提供提示,以便做出哪些决策以降低延迟(我猜这就是通过禁用Nagle算法来实现的)。默认情况下,它被设置为优化带宽(从/proc/sys/net/ipv4/tcp_low_latency
读取“0”)。
&flag
转换为char *
? setsockopt
需要一个const void *
值指针,因此不需要强制转换到某个类型(每种类型都可以隐式转换为void *
):http://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html 实际上,您甚至违反了C标准,因为将类型A的指针强制转换为类型B的指针,在其中没有一种类型是void *
实际上是未定义行为,按照ISO-C来说。 您有一个指向int的指针,但您声称它是指向char *
的指针(在几乎所有系统上都可以工作,但在技术上是未定义的)。 - Mecki作为
flag参数。只要有可信的
setsockopt()`原型和执行所需操作的代码示例的参考,我不介意改变答案。 - Soravux