人人都会AI编程

TCP 连接参数、缓冲区、拥塞控制算法

更新时间:2026-07-12

在 Linux 上,TCP 的性能表现不仅取决于应用代码,更直接受内核中一系列参数的控制。理解并调整这些参数,能够在高并发、高延迟或高带宽场景下把服务器的吞吐量提升数倍,而不需要改动一行业务逻辑。

1. 关键 TCP 连接参数

这些参数定义了连接的行为边界,可以在 /proc/sys/net/ipv4/ 下查看和修改,或通过 /etc/sysctl.conf 永久设定。

  • tcp_tw_reuse

默认值通常为 2(内核 4.x 后)。允许将处于 TIME_WAIT 状态的套接字用于新的出站连接,对频繁发起短连接的客户端(如反向代理连接后端)至关重要。启用后可大幅减少“端口耗尽”的风险。

  • tcp_fin_timeout

控制 FIN-WAIT-2 状态的最长存活时间(秒)。如果本地关闭连接后迟迟未收到对端的 FIN,这个超时可以防止孤儿连接长期占用资源。默认为 60 秒,对繁忙的 Web 服务器可以调低到 15–30 秒。

  • tcp_keepalive_time / tcp_keepalive_intvl / tcp_keepalive_probes

这三个参数控制 TCP keepalive 探测的节奏:第一个参数设定连接空闲多久后开始探测(默认 7200 秒),第二个设定探测间隔(默认 75 秒),第三个设定探测失败几次后判定连接死亡(默认 9 次)。对于需要及时感知对端死机的应用,通常将空闲时间降到 600 秒左右。

  • tcp_max_syn_backlog

指定半连接队列(SYN_RECV)的最大长度。当服务器面对突发流量或 SYN 泛洪攻击时,如果该队列过小,新连接会被直接丢弃。增大此值可以在一定程度上缓解问题(但真正的防护需要 tcp_syncookies 配合)。

  • tcp_syncookies

开启后(设为 1),当半连接队列满时,系统会通过加密 Cookie 验证后续 ACK 的合法性,从而在不占用队列资源的情况下完成三次握手。这是防御 SYN Flood 的第一道廉价而有效的屏障。

2. TCP 缓冲区:发送与接收的“水库”

每个 TCP 连接在内核中存在发送缓冲区(sk_wmem_alloc)和接收缓冲区(sk_rcvbuf),它们决定了连接能暂存多少未确认或未读取的数据。如果缓冲区太小,高速网络或高延迟链路的吞吐量会急剧下降。

内核提供了自动调整机制,通过三个以 tcp_rmemtcp_wmem 命名的参数控制:

  • tcp_rmem(接收):最小值 默认值 最大值,单位为字节

例如:4096 131072 6291456

  • 最小值:系统为每个连接保证的最小接收缓冲区;
  • 默认值:应用未显式设置 socket 缓冲区时使用的初始值;
  • 最大值:自动调整可以增长到的上限。
  • tcp_wmem(发送):结构与上述相同。
  • tcp_mem(全局内存压力阈值):pages 为单位,控制整个系统的 TCP 内存总量。当已用内存超过第三个值时,内核将开始限制缓冲区分配,以救回整体内存压力。

实用建议

  • 如果运行于 10GbE 及以上的高速网络,或者用于跨地域的长肥管道(高带宽、高延迟),需要显著增大 tcp_rmemtcp_wmem 的最大值(例如 16777216)。
  • 应用也可以在自己的代码中通过 setsockopt() 设置 SO_RCVBUFSO_SNDBUF,但不得小于内核允许的最小值,也不得超过最大值。

3. 拥塞控制算法:控制发送节奏的核心策略

拥塞控制算法决定了 TCP 在网络出现拥堵时如何降低发送速率,以及恢复时如何提升速率。Linux 支持多种算法,模块会被编译进内核(ls /lib/modules/$(uname -r)/kernel/net/ipv4/tcp_*.ko 查看可用模块)。

  • cubic(当前默认)

适合大多数场景。它以三次函数方式探测可用带宽,在高速长距离网络上能够较快达到高吞吐量。但对丢包敏感,在网络不稳定的无线环境可能性能一般。

  • reno(经典)

快速恢复/快速重传的鼻祖,行为稳定但收敛速度较慢,不适用于高带宽时延网络。

  • bbr(Google 开发,目前推荐)

基于瓶颈带宽和往返时间模型,不再以“丢包”作为拥堵信号,而是实时估算可用带宽。在有随机丢包的环境(如 Wi-Fi、移动网络)或高延迟的网络(如国际专线)中,bbr 通常能显著提高吞吐并降低延迟。生产环境切换时建议先在测试环境验证,因早期版本曾在某些场景下造成公平性问题,但内核 4.9 以上的稳定版本已相当成熟。

切换算法(需要 root):

# 查看当前使用的算法
sysctl net.ipv4.tcp_congestion_control

# 临时切换到 bbr(可能需先 modprobe tcp_bbr)
echo bbr > /proc/sys/net/ipv4/tcp_congestion_control

若要永久生效,可在 /etc/sysctl.conf 中添加:

net.ipv4.tcp_congestion_control = bbr

然后执行 sysctl -p

总结

这三个层面——连接参数、缓冲区规模和拥塞控制算法——是 Linux TCP 调优的三大支柱。实际工作流通常是:

  1. 观察异常指标(连接超时、握手失败、带宽跑不满),先检查连接队列和超时参数;
  2. 若存在长肥网络或突发大流量,逐步放宽缓冲区限制;
  3. 最后,对于高丢包但并非真实拥塞的环境,果断尝试 bbr 等现代算法。

每次只改一项,改后联合 ssnetstat -siperf3 等工具验证效果,是安全可靠的优化路径。