在 Linux 中,“TCP_NODELAY” 是一个 socket 选项,用来控制是否启用 Nagle 算法。开启 TCP_NODELAY 能立即将小包发送出去,降低交互延迟;关闭则开启 Nagle 算法,对小包做合并以减少网络拥塞。Linux 下并没有全局开关,必须在应用层对每个 socket 单独配置。
1. 在 C/C++ 代码中设置
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <errno.h>
#include <stdio.h>
// 假设 sockfd 是已创建并 connect()/bind() 的 TCP socket
int enable = 1;
if (setsockopt(sockfd,
IPPROTO_TCP,
TCP_NODELAY,
&enable,
sizeof(enable)) < 0) {
perror("setsockopt TCP_NODELAY failed");
// 处理错误
}
enable = 1
表示禁用Nagle 算法(立即发送小包)。- 若要恢复合并行为,可将
enable = 0
并再次调用。
2. 在 Python 中设置
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('example.com', 80))
# 禁用 Nagle 算法
sock.setsockopt(socket.IPPROTO_TCP,
socket.TCP_NODELAY,
1)
3. 在 Java 中设置
Socket socket = new Socket("example.com", 80);
// 禁用 Nagle 算法
socket.setTcpNoDelay(true);
4. 验证 TCP_NODELAY 是否生效
可以用 ss
或 netstat
查看 socket 详细信息,检查 nodelay
标志:
ss -t -i state established
输出示例(关注 TCP: flags):
ESTAB 0 0 10.0.0.1:12345 10.0.0.2:80
cubic wscale:5,6 rto:204 rtt:0.057/0.004 ato:40 mss:1448 cwnd:10 bytes_sent:1024 bytes_acked:1024
TCP: nodelay ack:(none)...
如果看到 nodelay
,说明已禁用 Nagle。
5. 系统级“低延迟”提示
虽然没有全局 TCP_NODELAY,但 Linux 提供了一个辅助的 sysctl 参数,可优化内核对延迟敏感的场景:
# 临时开启
sysctl -w net.ipv4.tcp_low_latency=1
# 永久生效,编辑 /etc/sysctl.conf:
# net.ipv4.tcp_low_latency = 1
tcp_low_latency=1
会稍微降低对吞吐的追求,优先照顾延迟。
小结
- TCP_NODELAY 必须在套接字层面通过
setsockopt()
(或各语言的等效接口)单独配置; - 检查生效可用
ss -ti
或类似命令,观察nodelay
标志; - 如需系统级低延迟支持,可考虑
net.ipv4.tcp_low_latency
。