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

简介

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

系列文章

协议簇:TCP 解析:基础
协议簇:TCP 解析:建立连接
协议簇:TCP 解析:连接断开
协议簇:TCP 解析:Sequence Number
协议簇: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!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值