TCP四次挥手

1、什么是TCP四次挥手?
  TCP链接在关闭时,会进行四次通信,此时客户端或者服务端都可以主动发起,这就是所谓的四次挥手,在这四次通信后,TCP链接就会正在断开,否则仅仅只是半链接而已。
2、TCP四次挥手流程详解
  TCP四次挥手,具体要分四个步骤来分析,具体如下:
   1、A端向先向其TCP发出释放链接的请求报文,此时FIN=1,seq=x,且开始停止发送数据给B端,主动开始关闭A端的TCP链接,进行FIN-WAIT-1阶段;
  2、B端收到了A端的关闭请求后,发出确认报文。此时ACK1,ack=x+1,seq=y,且B也开始进入Close-WAIT阶段,此时TCP已经进入半关闭状态,A->B的链接已经被释放。
  3、A端接收到了B端的确认报文后进入FIN-WAIT-2状态,等待B再次发出链接释放请求报文。B再次发送释放链接的报文。此时FIN=1,ACK=1,seq=z,ack=x+1,B进入LAST-ACK状态,等待A的确认。
   4、A再次收到B的链接释放报文后,再次对该请求报文发出确认报文,此时ACK=1,ack=z+1,seq=x+1。A也进入了最终的时间等待TIME_WAIT阶段。这里的等待时间是2MSL,之后A就会进入Closed阶段。

3、为什么要进行2MSL的等待
  这里为什么要进行2MSL的等待,主要还是因为要假设网络是不可靠的,有可能最后一个ACK会丢失。这里的TIME-WAIT时间段主要是用来让对端进行消息重传的。这里的2MSL也是有讲究的。叫做2个最大报文段生存时,。刚好用来配合重传。
4、四次挥手的图解
TCP四次握手

### 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()) # 第四次挥手 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值