TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)
- 一、TCP三次握手(Three-way Handshake)
- 二、TCP四次挥手(Four-way Wave)
- 三、常见问题解答
- 总结
- 为什么三次握手不能减少到两次?
- 为什么三次握手不能增加到四次?
- 为什么四次挥手不能减少到三次?
- 总结:
以下是关于TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)的详细整理:
一、TCP三次握手(Three-way Handshake)
目的:建立可靠的TCP连接,确保双方同步序列号并确认通信能力。
过程(分3步):
- 第一次握手(SYN请求)
- 客户端发送TCP报文,设置标志位
SYN=1
,随机生成初始序列号Seq=X
,表示请求连接。 - 客户端进入
SYN_SENT
状态,等待服务器响应。
- 客户端发送TCP报文,设置标志位
- 第二次握手(SYN+ACK响应)
- 服务器收到请求后,发送TCP报文:
- 标志位
SYN=1, ACK=1
,确认号Ack=X+1
,自身生成初始序列号Seq=Y
。
- 标志位
- 服务器进入
SYN_RCVD
状态,表示已准备好连接。
- 服务器收到请求后,发送TCP报文:
- 第三次握手(ACK确认)
- 客户端收到服务器的响应后,发送TCP报文:
- 标志位
ACK=1
,确认号Ack=Y+1
,序列号Seq=X+1
。
- 标志位
- 双方进入
ESTABLISHED
状态,连接正式建立,开始数据传输。
- 客户端收到服务器的响应后,发送TCP报文:
关键点:
- 通过序列号与确认号机制确保双方同步,防止旧连接数据干扰。
- 第二次握手合并
SYN
与ACK
,提高效率(服务器确认客户端的连接能力并同步自身序列号)。
二、TCP四次挥手(Four-way Wave)
目的:优雅关闭TCP连接,确保双方数据完全传输并释放资源。
过程(分4步):
- 第一次挥手(FIN请求关闭)
- 客户端发送TCP报文,设置标志位
FIN=1
,序列号Seq=U
,表示停止发送数据。 - 客户端进入
FIN_WAIT_1
状态,等待服务器确认。
- 客户端发送TCP报文,设置标志位
- 第二次挥手(ACK确认关闭请求)
- 服务器收到
FIN
后,发送TCP报文:- 标志位
ACK=1
,确认号Ack=U+1
,序列号Seq=V
(当前发送数据的序列号)。
- 标志位
- 服务器进入
CLOSE_WAIT
状态,通知应用层处理关闭请求,但仍可向客户端发送剩余数据。
- 服务器收到
- 第三次挥手(FIN请求反向关闭)
- 服务器发送完剩余数据后,发送TCP报文:
- 标志位
FIN=1, ACK=1
,确认号Ack=U+1
,序列号Seq=W
(可能为V+1
)。
- 标志位
- 服务器进入
LAST_ACK
状态,等待客户端最终确认。
- 服务器发送完剩余数据后,发送TCP报文:
- 第四次挥手(ACK确认反向关闭)
- 客户端收到服务器的
FIN
后,发送TCP报文:- 标志位
ACK=1
,确认号Ack=W+1
,序列号Seq=U+1
。
- 标志位
- 客户端进入
TIME_WAIT
状态(持续2MSL时间),确认服务器收到后正式关闭。
- 客户端收到服务器的
关键点:
- 四次挥手而非三次:因TCP是全双工模式,双方需独立关闭数据流。
- 2MSL(Maximum Segment Lifetime)等待:
- 确保最后一个
ACK
可靠到达服务器,防止连接异常中断。 - 允许网络中未送达的数据包自然消亡,避免新旧连接混淆。
- 确保最后一个
三、常见问题解答
- 为什么建立连接是三次握手,而关闭是四次挥手?
- 三次握手:服务器收到客户端的
SYN
请求后,可同时发送SYN
(同步序列号)和ACK
(确认),因此合并为一次响应。 - 四次挥手:服务器收到
FIN
后需先确认(ACK
),但可能仍有数据待发送,需延迟发送FIN
,导致分两步。
- 三次握手:服务器收到客户端的
- TIME_WAIT状态的作用?
- 防止延迟的重复
FIN
或ACK
干扰新连接(若立即关闭,可能误认为新连接数据是旧数据)。 - 确保网络中的旧数据包彻底消失(2MSL通常是数据包的生存周期)。
- 防止延迟的重复
总结
三次握手通过“请求-响应-确认”机制建立可靠连接,而四次挥手通过双向独立关闭确保数据完整性。理解这些机制是网络编程和故障排查的基础,尤其在处理连接延迟、丢包等问题时至关重要。
- SYN 请求连接
- ACK 已正确接收数据
- FIN 是一种停止请求信号
- Seq 是 序列号(Sequence Number)的缩写
- Seq=X 中X是一个变量,
- Ack 是 确认号 他也有自己的变量
TCP/IP协议中的三次握手和四次挥手是确保可靠连接建立与关闭的核心机制,其步骤数量经过精心设计,不能随意增减。以下是具体原因:
为什么三次握手不能减少到两次?
- 双向确认需求:
○ 第一次握手(客户端发SYN):服务器确认客户端的发送能力。
○ 第二次握手(服务器发SYN+ACK):客户端确认服务器的接收和发送能力。
○ 第三次握手(客户端发ACK):服务器确认客户端的接收能力。
○ 若减少为两次(如省略第三次握手):
■ 服务器无法确认客户端的接收能力,可能导致连接建立后,客户端无法接收服务器的数据,造成通信失败。 - 序列号同步:
○ 三次握手通过交换Seq和Ack号,确保双方初始序列号同步,避免后续数据传输混乱。
○ 两次握手无法完成双向同步,可能导致数据丢失或重复。
为什么三次握手不能增加到四次?
- 效率与资源消耗:
○ 三次握手已满足可靠性和同步需求,额外步骤会增加延迟和资源消耗(如TCP报文的传输和处理)。 - 无实际增益:
○ 第三次握手的ACK已确认双方状态,再次确认不会提升可靠性,反而可能引入更多潜在问题(如超时重传机制复杂性增加)。
为什么四次挥手不能减少到三次?
- 全双工特性:
○ TCP连接支持双向数据传输(如客户端和服务器可同时发送数据)。
○ 关闭需独立处理两个方向的数据流:
■ 第一次挥手:客户端停止发送数据(FIN)。
■ 第三次挥手:服务器停止发送数据(FIN)。
○ 若合并为三次(如服务器收到FIN后立即发FIN+ACK):
■ 服务器可能仍有数据未发送完,导致数据丢失。
■ 客户端无法区分FIN和ACK的合并响应,可能误判连接状态。 - 确保数据完整性:
○ 第二次挥手(ACK)确认客户端的关闭请求,允许服务器继续发送剩余数据。
○ 第三次挥手(FIN)通知客户端服务器已无数据发送,触发客户端进入TIME_WAIT状态等待确认。
○ 若减少步骤,可能无法保证所有数据已被传输和确认。
总结:
● 三次握手:通过三次交互确保双向通信能力和序列号同步,减少或增加步骤都会破坏可靠性或效率。
● 四次挥手:因TCP全双工特性,必须分别关闭两个方向的数据流,合并步骤可能导致数据丢失或未完成关闭。
这种设计平衡了可靠性、效率和复杂性,是TCP/IP协议核心机制的关键组成部分。