TCP连接建立(三次握手)和断开(四次挥手)过程中,Linux系统中有非常多的内核参数会直接或间接影响其行为、成功率、性能、超时时间、连接建立失败率等。
以下是实际生产环境中最常影响TCP连接建立与断开的系统配置参数,按重要程度和出现频率大致排序:
| 排名 | 参数名称 | 主要影响阶段 | 主要作用与常见调整场景 | 典型默认值 | 生产常见调整值 |
|---|---|---|---|---|---|
| 1 | net.core.somaxconn | 服务端三次握手 | listen() backlog队列最大长度(非常关键!) | 128 或 4096 | 1024~65535 |
| 2 | net.ipv4.tcp_max_syn_backlog | 服务端三次握手 | SYN队列(半连接队列)最大长度 | 1024~8192 | 4096~32768 |
| 3 | net.ipv4.tcp_synack_retries | 服务端三次握手 | SYN-ACK重传次数(影响被动连接建立超时) | 5 次 | 2~5 次 |
| 4 | net.ipv4.tcp_syn_retries | 客户端三次握手 | 客户端SYN包重传次数(影响主动连接建立超时) | 6 次 | 3~6 次 |
| 5 | net.ipv4.tcp_fin_timeout | 主动关闭方 | FIN_WAIT2状态超时时间(最常调小的参数之一) | 60 秒 | 15~30 秒 |
| 6 | net.ipv4.tcp_tw_reuse | 客户端/服务端 | 是否允许TIME_WAIT端口快速重用(对客户端短连接非常有用) | 0(关闭) | 1(开启) |
| 7 | net.ipv4.tcp_tw_recycle | 服务端(已废弃) | TIME_WAIT快速回收(5.10+内核已删除此参数) | 0 | —(不要依赖此参数) |
| 8 | net.ipv4.tcp_max_tw_buckets | TIME_WAIT状态 | 系统最多允许同时存在的TIME_WAIT数量 | 262144 | 524288~2097152 |
| 9 | net.ipv4.tcp_keepalive_time | 任意一方 | TCP保活探测开始前的空闲时间 | 7200 秒(2小时) | 300~900 秒 |
| 10 | net.ipv4.tcp_keepalive_intvl | 任意一方 | 保活探测包发送间隔 | 75 秒 | 30~60 秒 |
| 11 | net.ipv4.tcp_keepalive_probes | 任意一方 | 连续发送多少次保活探测无应答就认为连接已死 | 9 次 | 5~9 次 |
| 12 | net.ipv4.tcp_syncookies | 服务端三次握手 | SYN洪泛攻击防护(开启后会影响部分特殊场景的连接建立) | 1(大多数发行版) | 1(一般保持开启) |
| 13 | net.ipv4.tcp_abort_on_overflow | 服务端三次握手 | 半连接队列满时是否直接reset掉新连接 | 0 | 一般保持0 |
| 14 | net.ipv4.tcp_rfc1337 | TIME_WAIT | 是否严格遵守RFC1337处理TIME_WAIT中的数据包(极少动) | 0 | 基本不动 |
| 15 | net.ipv4.tcp_fastopen | 三次握手+数据 | TCP Fast Open(TFO),可在三次握手中携带数据 | 取决于内核 | 3(推荐开启) |
| 16 | net.core.netdev_max_backlog | 接收方向 | 网卡到内核协议栈的软中断队列长度(间接影响) | 1000 | 3000~10000 |
生产中最常调整的「黄金组合」(2024-2026主流推荐)
# 高并发短连接服务端(nginx、openresty、api gateway等)最常见调优组合
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0 # 新内核已删除此参数,设了也没用
net.ipv4.tcp_max_tw_buckets = 1048576
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_fastopen = 3
快速判断口诀(记住这几句基本够用)
连接建立慢/失败多 → 看 somaxconn、tcp_max_syn_backlog、syncookies
大量TIME_WAIT → 看 tcp_fin_timeout、tcp_tw_reuse、tcp_max_tw_buckets
客户端连接超时久 → 看 tcp_syn_retries
服务端响应SYN-ACK慢 → 看 tcp_synack_retries
大量FIN_WAIT2 → 调小 tcp_fin_timeout
长连接僵尸连接多 → 调小 keepalive_time + probes
需要针对你的具体场景(短连接/长连接、客户端/服务端、是否NAT环境、是否云服务器等)再做进一步精细化建议吗?可以告诉我更多业务背景~