1. TCP 握手(三次握手)超时
(1) SYN 发送超时(主动连接方)
状态:客户端发送 SYN 后进入 SYN_SENT,等待 SYN+ACK
tcp_syn_retries(2) SYN+ACK 接收超时(服务端)
状态:服务端发送 SYN+ACK 后进入 SYN_RECV,等待 ACK
tcp_synack_retries
2. TCP 挥手(四次挥手)超时
- (1) FIN_WAIT1 超时(主动关闭方)
状态:主动方发送 FIN 后进入 FIN_WAIT1,等待 ACK 或 FIN+ACK。
无直接可调参数,依赖 tcp_retries2(默认 15 次,约 924秒),超时后强制关闭连接 - (2) FIN_WAIT2 超时(主动关闭方)
状态:收到 ACK 后进入 FIN_WAIT2,等待对端 FIN
tcp_fin_timeout - (3) CLOSE_WAIT 超时(被动关闭方)
状态:被动方收到 FIN 后进入 CLOSE_WAIT,等待应用调用 close()
由应用控制,无内核超时。若应用未关闭,连接会一直挂起(需代码层面解决) - (4) LAST_ACK 超时(被动关闭方)
状态:被动方发送 FIN 后进入 LAST_ACK,等待最终 ACK
依赖 tcp_retries2 - (5) TIME_WAIT 超时(主动关闭方)
状态:主动方发送最终 ACK 后进入 TIME_WAIT
固定值:2 * MSL(默认为 60秒,MSL=30s),不可动态修改(需重新编译内核调整 MSL)
3. 可调与不可调参数总结
超时阶段 可调参数 默认值 是否可修改
SYN 重传 tcp_syn_retries 6次(约127秒) ✅ 可调
SYN+ACK 重传 tcp_synack_retries 5次(约180秒) ✅ 可调
FIN_WAIT2 超时 tcp_fin_timeout 60秒 ✅ 可调
LAST_ACK 重传 依赖 tcp_retries2 15次(约924秒) ✅ 可调
TIME_WAIT 时长 依赖 MSL 60秒(2*MSL) ❌ 需改内核常量
CLOSE_WAIT 超时 无 无限 ❌ 依赖应用层
4. 握手挥手
image.png