协议簇: TCP 解析 - 连接断开

Oct 11, 2021

目录


简介


接前文 协议簇:TCP 解析 - 建立连接, 我们这篇文章来看看 TCP 连接断开的过程,也就是众所周知的”四次挥手“的具体流程.


系列文章



断开连接


通常情况


Normal Close Sequence

MSL: Maximum Segment Lifetime.

这里,我们假定 A 端为关闭连接的发起方.

  1. 初始状态下,通信双方均处于连接状态.

  2. 某一时刻,A 端发起断开连接请求(上层客户通过调用 TCP 的 Close 接口). 发起断开连接请求时A端发送 FIN 包, 之后A端的TCP 连接状态切换为 FIN-WAIT-1, 等待对方回应对应的 ACK。

    从此刻此,A 端发送的任何数据包都会被 B端拒绝,但是,与此同时 A 端可以正常接收 B端发送的数据

    处在这个状态的 A 端会重传FIN以及之前的数据包,直到接收到对方的 ACK.

  3. B端在收到 FIN 包后回复 ACK 确认收到 A 端发送的 FIN包,并把连接状态切换为 CLOSE-WAIT。 A 端收到对应的 ACK 之后状态切换为 FIN-WAIT-2.

    B 端在收到 A 端的 ACK 之后,不会立马发送 FIN 包. 只有当上层用户调用 TCP Close 接口时才会发送 FIN 包到 A 端.

  4. B 端收到 A 端的 FIN 包之后可以继续发送数据,知道某一时刻关闭 TCP。同A端一样,发送 FIN 包给 A端,然后等待 A 端回复 ACK。状态切换为 LAST-ACK。

  5. A 端收到 B 端发送的 FIN 后状态切换为 TIME-WAIT,并回复响应的 ACK。B 端收到 ACK 之后状态切换为 CLOSED

  6. 等待 2 MSL 时间hou,A端状态变为 CLOSED。c 此时,当前 TCP 已经完全关闭.

我们再使用 wireshark 抓包看看这个流程

在这里插入图片描述

上图中的四条记录便对应于上面流程中的 2-5 项. 至于数据包中各个字段的值,这里我们不关注.


双发同时发起关闭连接


Simultaneous Close Sequence

  1. 初始状态下,通信双方均处于连接状态.
  2. 某一时刻,双发均发起断开连接请求. 假设,A 端发送了 FIN,且还未收到 B 端发送的 FIN。 B端也发送了 FIN,且还未收到 A端发送的FIN. 发送完FIN之后,双方的状态均切换为 FIN-WAIT-1 稍后,双发均收到了对方发送的 FIN, 需要回复对应的 ACK 给对方 收到对方的 ACK 之后,双方状态切换为 CLOSING 状态.
  3. 此时,双发的 FIN 已经交换完成,只需要回复响应的 ACK,告知对方对方对方发送的 ACK(对应于之前发送的 FIN)己方已经收到便可.
  4. 稍后,双方均进入 TIME-WAIT 状态. 在经过 2 MSL 时间后,双方均进入 CLOSED状态。c 此时,当前 TCP 已经完全关闭.

END!!!


Tags