TCP连接的三次握手和四次挥手是建立和释放可靠连接的核心机制,下面通过流程、报文细节、状态变化和常见问题展开说明:
一、三次握手(Connection Establishment)
目的:同步双方的初始序列号(ISN),确认双方收发能力正常。
详细流程:
-
第一次握手(SYN=1, seq=x)
- 客户端发送
SYN报文(SYN=1,表示请求建立连接) - 随机生成初始序列号
seq=x(ISN,避免历史冲突) - 客户端状态:
CLOSED→SYN_SENT
- 客户端发送
-
第二次握手(SYN=1, ACK=1, seq=y, ack=x+1)
- 服务端收到
SYN后,回复SYN+ACK报文:SYN=1:服务端也发起同步ACK=1:确认客户端的SYNseq=y:服务端的初始序列号ack=x+1:期望下次收到客户端x+1号数据
- 服务端状态:
LISTEN→SYN_RCVD
- 服务端收到
-
第三次握手(ACK=1, seq=x+1, ack=y+1)
- 客户端确认服务端的
SYN:ACK=1:确认服务端的SYNseq=x+1(因第一次握手消耗一个序列号)ack=y+1:期望下次收到服务端y+1号数据
- 状态变化:
- 客户端:
SYN_SENT→ESTABLISHED - 服务端收到后:
SYN_RCVD→ESTABLISHED
- 客户端:
- 客户端确认服务端的
关键点:
- 为什么需要三次?
防止已失效的SYN请求突然到达服务端导致资源浪费(两次无法阻止历史重复报文)。 - ISN随机生成:避免预测序列号发动攻击。
二、四次挥手(Connection Termination)
目的:双方独立关闭数据通道,确保数据完整传输。
详细流程:
-
第一次挥手(FIN=1, seq=u)
- 主动关闭方(如客户端)发送
FIN报文(FIN=1) - 携带当前序列号
seq=u(等于已发送数据的最后一个字节+1) - 客户端状态:
ESTABLISHED→FIN_WAIT_1
- 主动关闭方(如客户端)发送
-
第二次挥手(ACK=1, ack=u+1)
- 被动关闭方(如服务端)回复
ACK确认:ack=u+1:期望下次收到u+1号数据
- 服务端状态:
ESTABLISHED→CLOSE_WAIT - 客户端状态:收到后
FIN_WAIT_1→FIN_WAIT_2 - 此时客户端→服务端方向连接关闭,但服务端仍可发送数据。
- 被动关闭方(如服务端)回复
-
第三次挥手(FIN=1, seq=v, ack=u+1)
- 服务端数据发送完毕后,发送
FIN报文:seq=v:服务端最终序列号ack=u+1:仍确认客户端的FIN
- 服务端状态:
CLOSE_WAIT→LAST_ACK
- 服务端数据发送完毕后,发送
-
第四次挥手(ACK=1, ack=v+1)
- 客户端确认服务端的
FIN:ack=v+1:确认服务端的关闭请求
- 客户端状态:
FIN_WAIT_2→TIME_WAIT(等待2MSL)→CLOSED - 服务端状态:收到后
LAST_ACK→CLOSED
- 客户端确认服务端的
关键点:
- 为什么需要四次?
TCP是全双工的,必须分别关闭两个方向的数据流。 - TIME_WAIT状态的作用:
- 确保最后一个
ACK能到达服务端(若丢失,服务端会重传FIN) - 让网络中残留的旧报文失效(等待2MSL,即2倍最大报文生存时间)。
- 确保最后一个
三、常见问题分析
1. 握手时SYN洪泛攻击(SYN Flood)如何防范?
- 原理:攻击者发送大量
SYN但不回复ACK,耗尽服务端资源。 - 解决方案:
- SYN Cookie技术(不保存半连接状态)
- 限制SYN并发速率
2. 为什么TIME_WAIT需要2MSL?
- MSL(Maximum Segment Lifetime):报文最大生存时间(通常30s-2min)
- 两个目的:
- 确保最后一个
ACK能重传到对端 - 让本连接的所有报文在网络中消失,避免影响新连接
- 确保最后一个
3. 出现大量CLOSE_WAIT状态怎么办?
- 原因:被动关闭方未调用
close()释放连接。 - 排查:检查应用程序是否漏了关闭Socket或线程阻塞。
四、抓包示例(Wireshark)
- 三次握手:
#1 [SYN] Seq=0 #2 [SYN, ACK] Seq=0, Ack=1 #3 [ACK] Seq=1, Ack=1 - 四次挥手:
#1 [FIN, ACK] Seq=1, Ack=1 #2 [ACK] Ack=2 #3 [FIN, ACK] Seq=1, Ack=2 #4 [ACK] Ack=2
五、协议设计思想
- 三次握手:最小化资源占用前提下保证可靠性。
- 四次挥手:优雅关闭全双工通道,兼顾效率与数据完整性。
如果需要进一步分析特定场景(如握手失败、RST报文等),可以继续探讨!
TCP三次握手四次挥手原理详解


被折叠的 条评论
为什么被折叠?



