当前位置:网站首页>你需要知道的 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 关闭连接的挥手足足有四次。这是因为第二次挥手和第三次挥手之间可能有一些服务端需要发送的处理比较慢的数据要返回,所以没有将这两次挥手合并。
我是前端西瓜哥,欢迎关注我,掌握更多前端知识。
边栏推荐
- Exam preparation plan
- date命令
- 逐步手撕轮播图3(保姆级教程)
- zeno使用方法笔记
- 声称AI存在意识,谷歌工程师遭解雇:违反保密协议
- MYSQL索引解析
- Southern University of Science and Technology: Xiaoying Tang | AADG: Automatic Enhancement for Generalization in the Field of Retinal Image Segmentation
- Carefully organize 16 MySQL usage specifications to reduce problems by 80% and recommend sharing with the team
- Key Points Estimation and Point Instance
- Matlab/ArcGIS processing GPM global monthly precipitation data
猜你喜欢

Kyoto University: Masaki Waga | Dynamic Masking for Reinforcement Learning in Black Box Environments

JVM面试题总结(持续更新中)

Team of Professor Chen Jianyu of Tsinghua University | Contact Safety Reinforcement Learning Framework Based on Contact-rich Robot Operation

一行代码解决CoreData托管对象属性变更在SwiftUI中无动画效果的问题

谷歌『云开发者速查表』;清华3D人体数据集;商汤『通用视觉框架』公开课;Web3极简入门指南;高效深度学习免费书;前沿论文 | ShowMeAI资讯日报

逐步手撕轮播图3(保姆级教程)

MYSQL二阶段提交

【云驻共创】【HCSD大咖直播】亲授大厂面试秘诀

Carefully summarize thirteen suggestions to help you create more suitable MySQL indexes

/etc/sysconfig/network-scripts 配置网卡
随机推荐
Force buckle 2326, 197
面试题:实现死锁
ECCV2022 Workshop | 复杂环境中的多目标跟踪和分割
Binary tree traversal non-recursive program -- using stack to simulate system stack
Carefully summarize thirteen suggestions to help you create more suitable MySQL indexes
类和对象:中
pycaret source code analysis: download dataset\Lib\site-packages\pycaret\datasets.py
如何撰写出一篇优质的数码类好物推荐文
硬件设备计算存储及数据交互杂谈
Likou Binary Tree
对象缓存服务的思考和实现
[MATLAB project combat] LDPC-BP channel coding
清华大学陈建宇教授团队 | 基于接触丰富机器人操作的接触安全强化学习框架
Kyoto University:Masaki Waga | 黑箱环境中强化学习的动态屏蔽
Matlab/ArcGIS processing GPM global monthly precipitation data
LeetCode--打家劫舍问题
Flutter教程之四年开发经验的高手给的建议
SQL injection Less54 (limited number of SQL injection + union injection)
Notes on how to use zeno
Flutter教程之 02 Flutter 桌面程序开发入门教程运行hello world (教程含源码)