当前位置:网站首页>你需要知道的 TCP 四次挥手
你需要知道的 TCP 四次挥手
2022-08-01 00:30:00 【前端西瓜哥】
大家好,我是前端西瓜哥。今天给大家说说 TCP 的四次挥手。
建立 TCP 连接一段时间后,如果要断开 TCP 连接,就会进行 TCP 四次挥手过程完成断开操作。
TCP 四次的过程有点像 TCP 建立连接的三次握手。关于三次握手,可以看我的这篇文章:《你需要知道的 TCP 三次握手》
下图为 TCP 头部的结构,我们的 TCP 四次挥手主要用到其中的标黄的部分。
和三次握手的发起者必须是客户端不同,断开 TCP 连接的发起方可以是任何一方。为了方便讲解,下面我们以客户端作为发起者进行描述。
TCP 四次挥手过程
我们先看示意图。
第一次挥手,客户端向服务端发送 TCP 请求,将 TCP 头部中的
FIN 设置为 1
seq 设置为一个随机数 x
FIN 是一个标志位,表示结束(finish)的意思,1 等同于 true。
seq 是个序列号,一个装数据的地方,我们这里给他设置为一个随机数,用于给服务端做确认,好对应上这个 TCP 请求。
第二次挥手,服务端发送 TCP,并将 TCP 头部中的
ACK 设置为 1(acknowledge,表示 “收到” 的意思)
ack 确认号设置为 x+1(x 来自第一次挥手)
当客户端收到这个 TCP 请求时,表示从客户端到服务端的通道已经关闭,你不能再向服务端发正常的数据请求了。
此时服务端到客户端还是可以发送数据的。如果服务端有一些之前的 TCP 请求没来得及响应,在第二次挥手和第三次挥手期间还是可以去返回的。
第三次挥手,服务端向客户端发送 TCP 请求:
FIN 设置为 1
seq 设置为一个随机数 y
类似第一次挥手,只是这次发送方为服务端。
第四次挥手,客户端向服务端发送 TCP 请求:
ACK 设置为 1
ack 确认号设置为 y+1
服务端接收到这个请求后,服务端就能成功变成关闭(CLOSE)状态。客户端则会等一段时间再进入关闭状态,因为第四次挥手不一定能成功发给服务端,所以要等一下,看看服务端会不会因为没收到第四次挥手,而重发第三次挥手。
结尾
和 TCP 三次握手不同。TCP 关闭连接的挥手足足有四次。这是因为第二次挥手和第三次挥手之间可能有一些服务端需要发送的处理比较慢的数据要返回,所以没有将这两次挥手合并。
我是前端西瓜哥,欢迎关注我,掌握更多前端知识。
边栏推荐
- 博弈论(Depu)与孙子兵法(42/100)
- 编写方法将一个数组扁平化并且去重和递增排序
- pycaret源码分析:下载数据集\Lib\site-packages\pycaret\datasets.py
- Exam preparation plan
- 信奥学习规划 信息学竞赛之路(2022.07.31)
- 简单的vim配置
- 精心总结十三条建议,帮你创建更合适的MySQL索引
- How to Design High Availability and High Performance Middleware - Homework
- 【1161. 最大层内元素和】
- ECCV2022 Workshop | 复杂环境中的多目标跟踪和分割
猜你喜欢
Southern University of Science and Technology: Xiaoying Tang | AADG: Automatic Enhancement for Generalization in the Field of Retinal Image Segmentation
pycaret source code analysis: download dataset\Lib\site-packages\pycaret\datasets.py
MYSQL索引解析
2022-07-31:给出一个有n个点,m条有向边的图, 你可以施展魔法,把有向边,变成无向边, 比如A到B的有向边,权重为7。施展魔法之后,A和B通过该边到达彼此的代价都是7。 求,允许施展一次魔法
Classes and Objects: Above
力扣二叉树
[Microservice] Distributed Transaction Solution - Seata
/etc/sysconfig/network-scripts 配置网卡
NIO programming
[微服务]分布式事务解决方案-Seata
随机推荐
Keil nRF52832下载失败
助力数字政府建设,中科三方构建域名安全保障体系
NgRx 里 first 和 take(1) 操作符的区别
2022年CSP-J1 CSP-S1 第1轮初赛 报名指南
Classes and Objects: Medium
NIO programming
The difference between /usr/local/bin and /usr/bin
如何撰写出一篇优质的数码类好物推荐文
MYSQL查询截取优化分析
SVN server construction + SVN client + TeamCity integrated environment construction + VS2019 development
When can I use PushGateway
微信小程序之小程序页面语法
/usr/local/bin和/usr/bin的区别
Kyoto University:Masaki Waga | 黑箱环境中强化学习的动态屏蔽
Redis五种数据类型简介
虚继承的原理
Force buckle 2326, 197
什么是动态规划,什么是背包问题
lua入门案例实战1234定义函数与标准函数库功能
Carefully summarize thirteen suggestions to help you create more suitable MySQL indexes