On this page
public
TCP三次握手与四次挥手
结合SYN、ACK标志位与序列号交换机制,详述TCP连接建立(三次握手)和断开(四次挥手)过程中客户端与服务端的状态迁移路径。说明TIME_WAIT状态存在的必要性。
考察点分析
该题目主要考察以下核心能力:
- TCP协议原理掌握:深入理解连接建立与断开机制在可靠传输中的作用
- 状态机转换能力:准确描述客户端与服务端在各阶段的TCP状态变迁
- 网络异常处理思维:理解TIME_WAIT状态的设计意图及网络可靠性保障机制
具体技术评估点:
- SYN/SYN-ACK/ACK标志位的交互逻辑
- 序列号同步机制与可靠性保障
- 四次挥手比三次握手多一次的根本原因
- TIME_WAIT状态的作用与MSL计算逻辑
- 状态迁移路径的正确性(如SYN_SENT到ESTABLISHED的转换条件)
技术解析
关键知识点
- 三次握手建立连接
- 四次挥手终止连接
- TIME_WAIT状态机制
原理剖析
三次握手过程(类比租房签约):
- 客户端发送SYN(SYN=1, seq=x)进入SYN_SENT状态
- 服务端返回SYN-ACK(SYN=1, ACK=1, seq=y, ack=x+1)进入SYN_RCVD
- 客户端发送ACK(ACK=1, ack=y+1)进入ESTABLISHED,服务端收到后同步进入ESTABLISHED
四次挥手过程(类比解约流程):
- 主动方发送FIN(FIN=1, seq=u)进入FIN_WAIT_1
- 被动方返回ACK(ACK=1, ack=u+1)进入CLOSE_WAIT
- 被动方发送FIN(FIN=1, seq=v)进入LAST_ACK
- 主动方返回ACK(ACK=1, ack=v+1)进入TIME_WAIT,等待2MSL后关闭
TIME_WAIT必要性:
- 确保被动方正确进入CLOSED状态(处理重传的FIN)
- 消除网络中残留报文(防止旧连接数据污染新连接)
- 默认等待2*MSL(Maximum Segment Lifetime),确保所有报文消亡
常见误区
- 误认为服务端不会出现TIME_WAIT(主动关闭方都会产生)
- 混淆FIN_WAIT_2与CLOSING状态的区别
- 错误理解序列号增长逻辑(ACK确认的是期望的下个序列号)
问题解答
TCP通过三次握手建立可靠连接:
- 客户端发送SYN(seq=x)进入SYN_SENT
- 服务端返回SYN-ACK(seq=y, ack=x+1)进入SYN_RCVD
- 客户端确认ACK(ack=y+1)后双方进入ESTABLISHED
连接终止需四次挥手:
- 主动方发送FIN(seq=u)进入FIN_WAIT_1
- 被动方ACK确认后进入CLOSE_WAIT,主动方进入FIN_WAIT_2
- 被动方发送FIN(seq=v)后进入LAST_ACK
- 主动方ACK确认并进入TIME_WAIT,2MSL超时后关闭
TIME_WAIT状态确保:
- 可靠终止连接(处理延迟的FIN重传)
- 避免旧连接报文干扰新连接(2MSL足以让网络报文过期)
- 保证被动关闭方能正常结束(防备最终ACK丢失)
深度追问
为什么SYN要消耗序列号? 确保后续数据顺序,防止历史SYN干扰
服务器出现大量TIME_WAIT说明什么? 服务端主动关闭连接过多,需检查连接复用策略
如何优化TIME_WAIT过多问题? 设置SO_REUSEADDR允许端口复用,调整MSL时间(需系统权限)
Last updated 06 Mar 2025, 13:07 +0800 .