本文目录导读:

在 Linux 系统中,tcp_delack_time 并不是一个直接的 sysctl 内核参数,控制 TCP 延迟确认(Delayed ACK)行为的主要参数是 tcp_delack_min 和 tcp_delack_max(在较新内核中引入),或者间接通过 tcp_slow_start_after_idle 等参数影响。
核心参数:tcp_delack_min 和 tcp_delack_max
从 Linux 内核 4.13 左右开始,引入了更精细控制的 tcp_delack_min 和 tcp_delack_max:
-
tcp_delack_min:定义延迟确认的最小超时时间。默认值:40ms(或 20ms)
这是发送 ACK 之前可能等待的最短时间(除非有数据要发送或收到第二个数据段)。 -
tcp_delack_max:定义延迟确认的最大超时时间。默认值:200ms
这是发送 ACK 之前可能等待的最长时间(即绝对超时,无论是否收到数据,超过这个时间必须发 ACK)。
如何调整?
直接修改 /proc/sys/net/ipv4/ 下的文件(临时)或写入 /etc/sysctl.conf(永久):
# 查看当前值 sysctl net.ipv4.tcp_delack_min sysctl net.ipv4.tcp_delack_max # 临时修改(单位:毫秒) echo 100 > /proc/sys/net/ipv4/tcp_delack_min # 最小延迟设为 100ms echo 300 > /proc/sys/net/ipv4/tcp_delack_max # 最大延迟设为 300ms
旧版内核(或仅一个参数)的情况
在某些早期或精简内核中,只有一个固定的 tcp_delack_time 常量(硬编码在 net/ipv4/tcp_input.c 或 tcp.h 中),默认是 40ms(HZ=100 情况下为 4 个 jiffies)。
如果是这种情况,你无法通过 sysctl 动态修改,只能重新编译内核或使用 setsockopt() 手动控制每个 socket。
更高层次的延迟控制
如果你无法直接修改内核参数,或者希望影响更大范围的延迟确认行为,可以考虑:
-
调整
TCP_QUICKACK选项(应用层)
在每个 TCP socket 上设置setsockopt(fd, IPPROTO_TCP, TCP_QUICKACK, &val, sizeof(val)),将val设为 1 可立即发送 ACK(禁用延迟确认),设为 0 恢复延迟。 -
设置
tcp_slow_start_after_idlesysctl -w net.ipv4.tcp_slow_start_after_idle=0
虽然主要影响慢启动,但会间接改变长空闲连接后的 ACK 行为。
-
使用
tcp_delack_min = 0或极低值
在内核允许的最小值基础上设置(通常是 0 或 1 个 jiffie,约 10ms),但可能导致网络拥塞。
修改永久生效
# 写入 /etc/sysctl.conf 或 /etc/sysctl.d/99-custom.conf echo "net.ipv4.tcp_delack_min = 100" >> /etc/sysctl.conf echo "net.ipv4.tcp_delack_max = 500" >> /etc/sysctl.conf sysctl -p
注意事项
- 延迟确认的时间不是精确的,受内核时钟(jiffies 或 hrtimer)影响。
- 增大延迟会减少 ACK 数量,降低 CPU 和网络负载,但会增加 RTT 感知,影响实时性。
- 在大多数场景(如 Web 服务、数据库连接)中,默认值已经较好,通常不建议手动修改,除非你明确知道对吞吐量或延迟有要求。
- 直接控制:
sysctl net.ipv4.tcp_delack_min和sysctl net.ipv4.tcp_delack_max。 - 应用层控制:
setsockopt()设置TCP_QUICKACK。 - 注意事项:内核版本不同,旧版可能只有固定 40ms 常量,不可调。
标签: TCP延迟确认