社区编辑申请
注册/登录
你需要知道的 TCP 四次挥手
开发 前端
和 TCP 三次握手不同。TCP 关闭连接的挥手足足有四次。这是因为第二次挥手和第三次挥手之间可能有一些服务端需要发送的处理比较慢的数据要返回,所以没有将这两次挥手合并。

大家好,我是前端西瓜哥。今天给大家说说 TCP 的四次挥手。

建立 TCP 连接一段时间后,如果要断开 TCP 连接,就会进行 TCP 四次挥手过程完成断开操作。

TCP 四次的过程有点像 TCP 建立连接的三次握手。

下图为 TCP 头部的结构,我们的 TCP 四次挥手主要用到其中的标黄的部分。

和三次握手的发起者必须是客户端不同,断开 TCP 连接的发起方可以是任何一方。为了方便讲解,下面我们以客户端作为发起者进行描述。

TCP 四次挥手过程

我们先看示意图。

第一次挥手,客户端向服务端发送 TCP 请求,将 TCP 头部中的。

  1. FIN 设置为 1。
  2. seq 设置为一个随机数 x。

FIN 是一个标志位,表示结束(finish)的意思,1 等同于 true。

seq 是个序列号,一个装数据的地方,我们这里给他设置为一个随机数,用于给服务端做确认,好对应上这个 TCP 请求。

第二次挥手,服务端发送 TCP,并将 TCP 头部中的。

  1. ACK 设置为 1(acknowledge,表示 “收到” 的意思)。
  2. ack 确认号设置为 x+1(x 来自第一次挥手)。

当客户端收到这个 TCP 请求时,表示从客户端到服务端的通道已经关闭,你不能再向服务端发正常的数据请求了。

此时服务端到客户端还是可以发送数据的。如果服务端有一些之前的 TCP 请求没来得及响应,在第二次挥手和第三次挥手期间还是可以去返回的。

第三次挥手,服务端向客户端发送 TCP 请求:

  1. FIN 设置为 1。
  2. seq 设置为一个随机数 y。

类似第一次挥手,只是这次发送方为服务端。

第四次挥手,客户端向服务端发送 TCP 请求:

  1. ACK 设置为 1。
  2. ack 确认号设置为 y+1。

服务端接收到这个请求后,服务端就能成功变成关闭(CLOSE)状态。客户端则会等一段时间再进入关闭状态,因为第四次挥手不一定能成功发给服务端,所以要等一下,看看服务端会不会因为没收到第四次挥手,而重发第三次挥手。

结尾

和 TCP 三次握手不同。TCP 关闭连接的挥手足足有四次。这是因为第二次挥手和第三次挥手之间可能有一些服务端需要发送的处理比较慢的数据要返回,所以没有将这两次挥手合并。

责任编辑:姜华 来源: 今日头条
相关推荐

2022-07-07 09:00:17

TCP 连接HTTP 协议

2022-07-08 10:04:57

2019-06-12 11:26:37

TCP三次握手四次挥手

2020-01-10 08:01:00

TCP四次挥手三次握手

2021-10-14 20:33:16

2019-07-16 11:06:09

TCP四次挥手半关闭

2021-01-29 06:11:08

TCP通信三次握手

2020-01-10 09:51:23

2020-02-13 21:30:23

TCP三次握手四次挥手

2020-02-17 10:10:43

TCP三次握手四次挥手

2019-07-26 07:02:05

2018-08-10 09:23:19

2015-10-13 09:42:52

2019-12-13 07:31:04

TCP三次握手四次挥手

2021-05-18 12:27:40

TCP控制协议

2020-04-08 10:03:00

2020-06-29 14:50:47

TCP状态ACK

2021-05-28 09:08:20

2014-09-19 09:46:46

2017-09-25 21:27:07

TCP协议数据链

同话题下的热门内容

如何创建一个无代码的自助客户聊天机器人Java 服务 Docker 容器化优秀实践程序员不得不知道的 API 接口常识如何提高 TypeScript 的代码质量?聊聊 13 种锁的实现方式11个 ES2022(ES13)中惊人的 JavaScript 新特性使用 Vite 和 TypeScript 带你从零打造一个属于自己的 Vue3 组件库Hooks时代,如何写出高质量的react和vue组件?

编辑推荐

太厉害了,终于有人能把TCP/IP协议讲的明明白白了!牛人5次面试腾讯不成功的经验HBase原理–所有Region切分的细节都在这里了Javascript如何监听页面刷新和关闭事件如何搭建一个HTTPS服务端
我收藏的内容
点赞
收藏

51CTO技术栈公众号