TCP的四次挥手

TCP连接的终止通过四次挥手完成。首先客户端发送FIN进入FIN_WAIT_1状态,服务器响应ACK进入CLOSE_WAIT。接着服务器发送FIN,客户端回ACK进入FIN_WAIT_2,服务器最后收到ACK进入CLOSED状态。客户端在TIME_WAIT状态等待2MSL后变为CLOSED。TIME_WAIT状态的作用是确保可靠终止连接及避免新旧连接混淆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCP连接的终止需要进行四次挥手才能完成,它的过程如下图
(这里假设终止有客户端发起,但是无论是客户端还是服务器都可以发起因为TCP是全双工(全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)),
即下图中客户端和服务器的位置对调也是可以的):
这里写图片描述
第一次挥手
客户端发送FIN给服务器,客户端状态由 ESTABLISHED 变为 FIN_WAIT_1。

第二次挥手
服务器收到FIN且发送ACK给客户端,服务器状态由 ESTABLISHED 变为 CLOSE_WAIT。
服务器将缓存中没发送的数据完继续发送给客户端
客户端收到ACK后状态由FIN_WAIT_1变为FIN_WAIT_2.

第三次挥手
服务器发送FIN给客户端,这时服务器的状态由CLOSE_WAIT变为 LAST_ACK。

第四次握手
客户端收到FIN后返回ACK给服务器,然后客户端的状态由FIN_WAIT_2变为TIME_WAIT,TIME_WAIT = 2MSL (maximum segement lifetime 分节在网络中最长生存时间,30秒到2分钟,根据系统实现不同而不同) 2MSL 范围是 1分钟到4分钟。
服务器收到ACK后,状态由LAST_ACK变为CLOSED。
而客户端再经过TIME_WAIT时间后变为CLOSED状态。

为什么会有TIME_WAIT状态
1.可靠地实现TCP全双工连接的终止。
假设最后一次ACK在网络中丢失了,然而主动关闭的那一端(上图是客户端)却没有维护状态信息(即没有TIME_WAIT就直接CLOSED),被动关闭端就会再次发来FIN,但是客户端没有维护状态信息,那么就返回一个RST给

### TCP 四次挥手过程详解 TCP四次挥手(Four-Way Wave)是用于释放已建立的连接的过程,确保通信双方能够安全地终止连接。以下是四次挥手的具体过程和原理: #### 第一挥手 客户端发送一个 `FIN` 报文给服务端,表示客户端已经没有数据需要发送,并进入 `FIN_WAIT_1` 状态[^3]。此时,客户端主动发起断开连接的请求。 #### 第二挥手 服务端收到 `FIN` 报文后,发送一个 `ACK` 报文给客户端,确认序号为收到序号加一,服务端进入 `CLOSE_WAIT` 状态[^3]。此时,TCP 连接处于半关闭状态,即客户端不再发送数据,但服务端仍可继续发送数据。 #### 第三挥手 服务端在完成所有数据发送后,发送一个 `FIN` 报文给客户端,表示服务端也没有数据需要发送,并进入 `LAST_ACK` 状态[^3]。此时,服务端也发起了断开连接的请求。 #### 第四次挥手 客户端收到 `FIN` 报文后,进入 `TIME_WAIT` 状态,并发送一个 `ACK` 报文给服务端,确认序号为收到序号加一。服务端收到 `ACK` 报文后,进入 `CLOSED` 状态,完成四次挥手。客户端在 `TIME_WAIT` 状态下等待一段时间(通常是两倍的最大段生命周期,2MSL),以确保网络中没有遗留的报文,之后也进入 `CLOSED` 状态。 #### 原理分析 - **确保数据完整传输**:四次挥手通过两 `FIN` 和两 `ACK`,确保了通信双方的数据都已完整传输完毕。 - **防止连接异常**:客户端在 `TIME_WAIT` 状态下等待 2MSL 时间,可以避免旧的连接报文对新连接产生干扰[^3]。 - **重传机制**:如果主机 B 没有收到主机 A 的 `ACK`,它会按照 TCP 的重传机制定期重传 `FIN` 报文,直到达到设定的上限[^4]。 ```python # 模拟TCP四次挥手过程的状态变化 class TCPConnection: def __init__(self): self.client_state = "ESTABLISHED" self.server_state = "ESTABLISHED" def client_first_wave(self): self.client_state = "FIN_WAIT_1" return "Client sends FIN to Server." def server_second_wave(self): self.server_state = "CLOSE_WAIT" return "Server sends ACK to Client." def server_third_wave(self): self.server_state = "LAST_ACK" return "Server sends FIN to Client." def client_fourth_wave(self): self.client_state = "TIME_WAIT" return "Client sends ACK to Server and enters TIME_WAIT state." connection = TCPConnection() print(connection.client_first_wave()) # 第一挥手 print(connection.server_second_wave()) # 第二挥手 print(connection.server_third_wave()) # 第三挥手 print(connection.client_fourth_wave()) # 第四次挥手 ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值