基础篇:TCP 连接的建立和断开主要受哪些系统配置影响?
TCP 连接的建立(三次握手)和断开(四次挥手)虽然看起来是协议本身的行为,但实际上在 Linux 系统中会受到内核参数的强烈影响。下面列出最重要、最常见会影响建立/断开过程的系统配置参数(2025-2026 主流视角):
| 阶段 | 主要影响参数 | 典型默认值 | 实际影响说明 | 常见修改场景 |
|---|---|---|---|---|
| 建立连接 | net.ipv4.tcp_syn_retries | 6 | 客户端 SYN 重试次数(约 3 分钟) | 快速失败场景调小(2~4) |
net.ipv4.tcp_synack_retries | 5 | 服务端收到 SYN 后 SYN-ACK 重试次数 | 防 SYN Flood 调小(2~3) | |
net.ipv4.tcp_max_syn_backlog | 128~1024(视内存) | 半连接队列(SYN Queue)最大长度 | 高并发服务端必须调大(4096~65535) | |
net.core.somaxconn | 128 或 4096 | 全连接队列(accept Queue)最大长度 | 高并发服务端必须调大(≥65535) | |
net.ipv4.tcp_syncookies | 1(大多数现代内核) | 是否开启 SYN Cookie 防 SYN Flood | 高风险暴露服务建议开启 | |
net.ipv4.tcp_abort_on_overflow | 0 | 全连接队列满时是否直接 RST 掉新连接 | 一般保持 0(排队等待) | |
| 建立后维持 | net.ipv4.tcp_keepalive_time | 7200 秒(2小时) | 空闲多久后开始发送第一个 keepalive 探测包 | 长连接建议调小(300~1800秒) |
net.ipv4.tcp_keepalive_intvl | 75 秒 | 连续探测包之间的间隔 | 一般不动 | |
net.ipv4.tcp_keepalive_probes | 9 | 连续发几次探测无回应就认为连接已断 | 长连接建议 3~5 次 | |
| 关闭连接 | net.ipv4.tcp_fin_timeout | 60 秒 | FIN_WAIT_2 状态超时时间(被动关闭方) | 高并发服务建议调小(15~30秒) |
net.ipv4.tcp_tw_reuse | 0 | 是否允许重用 TIME_WAIT 里的端口(客户端) | 高频短连接强烈建议打开(1) | |
net.ipv4.tcp_tw_recycle | 0(现代内核已移除) | 老参数,已被废弃(NAT 环境下有严重问题) | 永远不要开(已删除) | |
net.ipv4.tcp_max_tw_buckets | 180000(或更大) | 系统最多能同时存在的 TIME_WAIT 数量 | 高并发短连接必须调大(50w~200w) | |
net.ipv4.tcp_rfc1337 | 0 | 是否严格遵守 RFC 1337 处理 TIME_WAIT(保护 TIME_WAIT 连接) | 一般保持 0 | |
| 通用影响 | net.core.netdev_max_backlog | 1000~3000 | 网卡接收队列长度(影响新连接进入) | 高流量建议调大(10000~30000) |
net.ipv4.tcp_max_orphans | 32768 或更高 | 最大孤儿 socket 数量(无文件描述符的 socket) | 高并发建议调大 |
最常被问到的几个“生死攸关”参数总结(高并发服务必调)
# 高并发短连接服务端(Nginx/Envoy/网关类)推荐配置
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535
net.ipv4.tcp_max_tw_buckets = 1000000
net.core.netdev_max_backlog = 16384
# 长连接服务端(RPC、数据库连接池、推送服务)推荐
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_fin_timeout = 30
快速记忆口诀(背下来就基本会用了)
建立连接看“三队列”
SYN Queue(tcp_max_syn_backlog) → 半连接
Accept Queue(somaxconn) → 全连接
网卡队列(netdev_max_backlog) → 进队前缓冲
关闭连接看“三板斧”
fin_timeout(被动方 FIN_WAIT_2 超时)
tcp_tw_reuse(主动方快速回收 TIME_WAIT)
tcp_max_tw_buckets(TIME_WAIT 总数上限)
长连接看“三保镖”
keepalive_time / intvl / probes
把这三组记住了,绝大部分 TCP 建立/断开相关的系统调优问题就都能应对了。
需要的话可以把你当前业务场景(短连接多?长连接多?QPS多少?)说一下,我可以帮你给出一套更针对性的推荐参数组合~