你需要知道的 TCP 四次挥手
大家好,我是前端西瓜哥。今天给大家说说 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 关闭连接的挥手足足有四次。这是因为第二次挥手和第三次挥手之间可能有一些服务端需要发送的处理比较慢的数据要返回,所以没有将这两次挥手合并。
我是前端西瓜哥,欢迎关注我,掌握更多前端知识。
你需要知道的 TCP 四次挥手相关推荐
- 为什么只有三次挥手_TCP为什么是三次握手,为什么不是两次或四次,TCP四次挥手...
这是一个很有意思的问题~ 首先,我们要知道TCP是全双工的,即客户端在给服务器端发送信息的同时,服务器端也可以给客户端发送信息.而半双工的意思是A可以给B发,B也可以给A发,但是A在给B发的时候,B不 ...
- tcp 四次挥手_TCP三次握手和四次挥手
名词解释 SYN:发起一个新连接 ACK:确认序号有效 FIN:释放一个连接 1,TCP三次握手 第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认: 第 ...
- tcp当主动发出syn_一文读懂TCP四次挥手工作原理及面试常见问题汇总
简述 本文主要介绍TCP四次挥手的工作原理,以及在面试中常见的问题. 字段含义 seq序号:Sequence Number,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行 ...
- (三)深入浅出TCPIP之再识TCP,理解TCP四次挥手(上)
目录 1.TCP四次挥手过程 2.挥手连环发问 专栏其他文章: 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三) ...
- 经典面试题之 TCP三次握手 和 TCP四次挥手过程----详解
TCP三次握手过程: 第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认:SYN:同步序列编号(Synchronize Sequence Nu ...
- 被面试官问懵:TCP 四次挥手收到乱序的 FIN 包会如何处理?
摘要:收到个读者的问题,他在面试的时候,被搞懵了,因为面试官问了他这么一个网络问题. 本文分享自华为云社区<TCP 四次挥手收到乱序的 FIN 包会如何处理?>,作者:小林coding . ...
- 计算机网络之TCP四次挥手
文章目录 计算机网络之TCP四次握手 1.TCP四次挥手过程 2.任何一方执行close()操作即可产生挥手操作为什么要等待呢 3.说说 TCP 四次挥手过程 4.TCP挥手为什么需要四次呢 5. T ...
- TCP四次挥手及原因
一.TCP四次挥手 MSL是TCP报文里面最大生存时间,它是任何报文段被丢弃前在网络内的最长时间. 第一次挥手:A->B,A向B发出释放连接请求的报文,其中FIN(终止位) = 1,seq(序列 ...
- 灵魂拷问:TCP 四次挥手,可以变成三次吗?
上周有位读者面试时,被问到:TCP 四次挥手中,能不能把第二次的 ACK 报文, 放到第三次 FIN 报文一起发送? 虽然我们在学习 TCP 挥手时,学到的是需要四次来完成 TCP 挥手,但是在一些情 ...
最新文章
- ProxylessNAS pytorch
- Ubuntu14.04安装QQ2013
- python处理数据库_python操作数据库
- Sqoop拒绝连接错误
- 使用MongoDB的MapReduce
- antd 能自适应吗_Antd表格滚动 宽度自适应 不换行的实例
- gridview 默认编辑按钮改成图片
- Android开发笔记(十二)测量尺寸与下拉刷新
- jqgrid 横向滚动条
- win7为什么打开桌面上的计算机很卡很慢,如何解决win7系统电脑反应慢
- 深入理解Python中的yield和send
- DRL前沿之:Benchmarking Deep Reinforcement Learning for Continuous Control
- mysql res.body_请帮我找一下错吧:body ?php $link=mysql_connect('localhost','root','123') or die (不能连接数据库...
- ffmpeg 分辨率 压缩_ffmpeg 视频压缩
- 教大家一个免费复制粘贴百度文库文字的方法
- Flash动画制作实例教程
- MIPS架构与指令简介
- 每日问答——PMP题库训练2
- python里raise是什么意思_Python中raise与raise...from之间有何区别?
- Grid-Based Route (Re-)Planning
热门文章
- Python基础教程-第6章-函数
- linux是手机端还是电脑端,判断浏览器用户端是PC还是移动设备的方法
- popstate的bug解决方案
- “青春碰撞,寻找合伙人“创业项目对接会
- Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]
- 2008企业即时通讯三大特点
- The order of a Tree hdu3999 二叉搜索树
- android调用微信程序,Android如何测试微信小游戏小程序?
- interrupt用法C语言,interrupt
- C++ 标准库之iomanip