一、TCP三次握手(连接建立)
过程:
-
客户端 → 服务器:发送SYN=1,seq=x(随机序列号),进入SYN_SENT状态
-
服务器 → 客户端:回复SYN=1,ACK=1,ack=x+1(确认号),seq=y(随机序列号),进入SYN_RCVD状态
-
客户端 → 服务器:发送ACK=1,ack=y+1,seq=x+1,双方进入ESTABLISHED状态
关键点:
-
每次握手都携带序列号(seq)和确认号(ack)
-
第三次握手可携带应用层数据
意义:
-
确认双向通信能力:验证客户端和服务器双方的发送和接收能力
-
同步初始序列号:为后续可靠传输奠定基础
-
防止历史连接干扰:避免网络延迟导致的旧连接请求造成混乱
-
协商关键参数:如MSS(最大报文段大小)、窗口大小等
二、TCP四次挥手(连接释放)
过程:
-
主动方 → 被动方:发送FIN=1,seq=u,进入FIN_WAIT_1状态
-
被动方 → 主动方:回复ACK=1,ack=u+1,进入CLOSE_WAIT状态(此时被动方可继续发送数据)
-
被动方 → 主动方:发送FIN=1,ACK=1,seq=v,ack=u+1,进入LAST_ACK状态
-
主动方 → 被动方:发送ACK=1,ack=v+1,进入TIME_WAIT状态(等待2MSL后关闭)
关键点:
-
挥手次数比握手多一次是因为TCP的全双工特性
-
TIME_WAIT状态持续2MSL(报文最大生存时间)
意义:
-
可靠释放连接:确保双方都能完整结束数据传输
-
处理延迟报文:TIME_WAIT状态让网络中残余报文失效
-
保证最后ACK到达:若丢失,被动方可重传FIN报文
-
允许数据收尾:被动方可能有剩余数据需要发送
三、高频追问
Q1:为什么不能两次握手?
A:无法防止历史连接请求干扰,且无法确认客户端的接收能力。
Q2:为什么挥手需要四次?
A:因为TCP是全双工的,FIN和ACK需要分开发送,且被动方可能需要时间处理未发送完的数据。
Q3:TIME_WAIT为什么是2MSL?
A:1MSL确保最后一个ACK到达对端,另1MSL确保对端重传的FIN能被处理。
Q4:大量TIME_WAIT状态有什么问题?
A:会占用端口资源,可通过调整内核参数(如tcp_tw_reuse)或修改协议超时时间优化。
建议回答方式:
-
先清晰描述过程(可用画图辅助)
-
再解释每个环节的意义
-
最后补充常见问题的标准答案
-
可适当结合实际场景(如HTTP连接、数据库连接等)说明