TCP连接四次挥手的过程,为什么是四次?
在 TCP 协议中,四次挥手是终止连接的过程,用于确保双方都能够正常、安全地关闭连接并释放资源。四次挥手的过程保证了数据的完整传输,防止数据丢失或误处理。
TCP 四次挥手的过程:
- 第一次挥手(FIN) - 主动关闭方请求关闭连接:
- 在四次挥手的开始,主动关闭方(通常是客户端)发送一个 FIN(Finish)报文段,表示它已经没有数据要发送了,希望关闭连接。
- 原因:主动方发送 FIN 是为了通知对方,自己已经完成了数据传输,准备关闭连接。此时,客户端进入 FIN_WAIT_1 状态。
- 第二次挥手(ACK) - 被动关闭方确认关闭请求:
- 接收到 FIN 报文段的 被动关闭方(通常是服务器)会回复一个 ACK(确认)报文段,确认收到关闭请求。此时,服务器会进入 CLOSE_WAIT 状态,表示它已经准备好关闭连接,但还可能需要处理剩余的数据。
- 原因:ACK 报文段确认了主动方的关闭请求,但是连接尚未完全断开,服务器可能还有数据要发送。
- 第三次挥手(FIN) - 被动关闭方请求关闭连接:
- 在处理完剩余数据后,被动关闭方(服务器)发送一个 FIN 报文段,表示服务器也没有数据要发送了,请求关闭连接。
- 原因:被动方完成数据传输后,发送 FIN 请求关闭连接,表明它已经没有数据要发送,可以关闭连接。
- 第四次挥手(ACK) - 主动关闭方确认关闭:
- 主动关闭方(客户端)收到被动方的 FIN 请求后,发送一个 ACK 报文段确认关闭请求。此时,客户端进入 TIME_WAIT 状态,连接关闭正式完成。
- 原因:客户端确认收到被动方的 FIN 请求,并告知对方连接关闭完成。此时,客户端处于等待状态,稍后会彻底释放连接资源。
TIME-WAIT 状态和 2MSL 等待期的作用:
在第四次挥手的过程中,客户端进入 TIME-WAIT 状态,并等待 2MSL(Maximum Segment Lifetime)时间。这个状态和时间段对于可靠性和连接的正确终止至关重要。
1. TIME-WAIT 状态的作用:
-
确保最后的 ACK 被正确接收:当客户端发送最后的 ACK 确认报文段后,必须保证被动方能够收到这个确认。由于网络中可能存在丢包或者延迟,客户端需要保留连接状态并继续监听网络,确保最后的 ACK 能够到达被动方。如果被动方没有收到 ACK,它会重新发送 FIN 请求,客户端则需要重新确认。
-
防止旧的重复报文影响新连接:由于网络中可能存在延迟或者数据包会被缓存,如果相同的端口和 IP 地址再次建立连接,旧的重复数据包可能会干扰新的连接。TIME-WAIT 状态确保所有的旧数据包在 2MSL 时间内都已经过期,不会影响新的连接。
-
为什么TIME-WAIT是2MSL:
- 1MSL确保主动方的
ACK
可到达被动方; - 另1MSL确保被动方重传的
FIN
可到达主动方(极端情况下,FIN
可能在1MSL内到达)。
- 1MSL确保主动方的
2. 2MSL(最大报文生命周期)的作用:
- MSL(Maximum Segment Lifetime) 是一个报文在网络中可能存在的最大时间。2MSL 就是指在网络中一个数据包经过的最大时间周期的两倍。TCP 在连接关闭后进入 TIME-WAIT 状态并保持 2MSL 时间,确保:- 所有的数据包(即使是丢失后重传的)都能在 2MSL 时间内到达并被处理。
- 防止在新的连接中,旧的重复数据包被错误地接受和处理,造成混乱。
这个 2MSL 的时间通常是 4 分钟(具体取决于操作系统的配置和网络环境),确保了在一个连接关闭后,所有延迟的报文都能清理完毕。
3.为什么需要四次握手:
TCP
是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。 当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后才会完全关闭 TCP
连接。因此两次挥手可以释放一端到另一端的TCP
连接,完全释放连接一共需要四次挥手。
只有通过四次挥手,才可以确保双方都能接收到对方的最后一个数据段的确认,主动关闭方在发送完最后一个ACK
后进入TIME-WAIT
状态,这是为了确保被动关闭方接收到最终的ACK
,如果被动关闭方没有接收到,它可以重发FIN
报文,主动关闭方可以再次发送ACK
。
而如果使用三次挥手,被动关闭方可能在发送最后一个数据段后立即关闭连接,而主动关闭方可能还没有接收到这个数据段的确认。