运输层:TCP四次挥手
TCP四次挥手
- 四次挥手介绍
- 为什么第四次挥手后客户端还要等待2MSL的时间才释放连接
- 为什么要四次挥手,三次挥手不行吗?
- 如果已经建立连接,但客户端出现故障了怎么办?
四次挥手介绍
首先可以发现,数据传输结束后,客户端A和服务端B都处于ESTABLISHED状态,通信的双方都可以释放连接,也可以同时关闭连接,但是较为常见的一种情况是由客户端发起关闭请求。
第一次挥手:图中客户端A第一次挥手,发送一个长度为1的报文给服务端,里面的关键位FIN置为1,代表结束终止的意思,请求释放连接,并且起始字节序号seq为u,注意这里的seq和服务器端的seq并不一样。并且A由ESTABLISHED状态进入FIN-WAIT-1(终止状态1)。
第二次挥手:服务器B收到A的请求关闭报文之后,做出反应,确认收到了来自A的请求关闭报文,所以这里的ACK确认为1,相应的确认号u+1生效,并且本身的起始字节序号seq为v,B由ESTABLISHED状态进入CLOSE-WAIT(等待关闭)状态,A收到了来自B的确认报文后由FIN-WAIT-1(终止状态1)变为FIN-WAIT-2(终止状态2)。并且这个时候TCP连接还是处于半关闭状态,也就是B可以给A发送数据,A要接收,但是A不能给B发送数据。
第三次挥手:上面也说到了第二次挥手后TCP还是处于半关闭状态,所以等服务端B确认了没有数据再发送了,就进行第三次挥手,里面的关键字段FIN=1代表请求释放连接,ACK=1且ack=u+1代表回应收到的第一次挥手中客户端发来的起始字节序号。并且本机的起始字节序号为w,而不是v+1,因为第二次挥手到第三次挥手期间服务端B有可能给A发送了消息,已经用掉了一部分字节序号,所以这里就断开了,如果中途没有发送数据的话w=v+1,因为每次报文都是1字节的长度。然后B由CLOSE-WAIT(等待关闭)状态变为了LAST-ACK状态。客户端在收到B的第三次挥手的报文时,状态由FIN-WAIT-2(终止状态2)变为TIME-WAIT(时间等待状态)。
第四次挥手:客户端A在收到第三次挥手的报文时,就立马给服务端B发送了第四次挥手的报文,内容其实是和第二次挥手一样的,确认收到了报文,并且给出了相应正确的确认号,本机的一个报文的起始字节序列号。然后服务端B收到了第四次挥手的报文,就进入了关闭状态,客户端A在等待2MSL之后,也进入了关闭状态。
为什么第四次挥手后客户端还要等待2MSL的时间才释放连接
2MSL是报文段最长寿命时长的2倍,即报文段在TCP连接中可以存活的最长时间。
MSL(Maximum Segment Life最长报文段寿命)
一个确认报文(第四次挥手)+一个请求报文(第三次挥手)
解释:
客户端发送出ACK=1报文后,开始维护2MSL计时器,假设客户端最后发送ACK=1确认收到服务器关闭连接的报文,在网络中滞留没有到达服务器,服务器在一段时间没有收到客户端的ACK=1回复,会重发第三次挥手的连接释放报文。客户端接到此报文,重置2MSL计时器,再次向服务器发送ACK=1报文,如果直到2MSL计时器到时间都没有收到服务器重发的连接释放报文,则客户端释放TCP连接
如果此时客户端已经释放了TCP连接,没有等待2MSL的时间,则不能接到服务器重发的连接释放报文,重发的报文找不到对应的连接,如果再向服务器发送TCP连接请求,此时无法保证两次连接的端口号不同,则可能出现这样的问题:前一次的连接某些数据滞留在网络中,这些延迟数据在建立新连接后到达客户t端,由于新老连接的端口号和IP都一样,TCP协议就认为延迟数据是属于新连接的,新连接就会接收到脏数据,这样就会导致数据包混乱。
为什么要四次挥手,三次挥手不行吗?
因为TCP连接是全双工通信,即客户端、服务器都可以收发数据,则在断开连接时,需要服务器和客户端都确定对方不再发送数据。
解释:
第一次挥手,客户端向服务器发送,服务器得知客户端将不再发送数据
第二次挥手,服务器向客户端发送,客户端得知服务器已经知道客户端不再发送数据
第三次挥手,服务器向客户端发送,客户端得知服务器将不再发送数据
第四次挥手,客户端向服务器发送,服务器得知客户端已经知道服务器不再发送数据
第一、二次挥手时,服务器可能还在向客户端发送数据,所以第二次挥手和第三次挥手不能合并。
如果已经建立连接,但客户端出现故障了怎么办?
采用心跳机制保活
解释:服务器维护一个计时器,每次服务器接到客户端的请求,都会重新复位计时器,如果超过一定时间没有接收到客户端的数据,服务器会向客户端发送一个探测报文,每隔一定时间发送一次,若连续发送一定数量的探测报文没有回应的话,服务器就认为客户端出了故障,关闭连接。
参考博客:https://blog.csdn.net/qq_37348221/article/details/114572978
参考书籍:《计算机网络(第七版)》谢希仁
运输层: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 挥手,但是在一些情 ...
- 深入浅出TCP四次挥手 (多图详解)
文章目录 前言 1.TCP的连接释放 2.TCP通过"四报文挥手"来释放连接 3.四次挥手图文详解 4.四次挥手文字总结 5.相关面试问题 前言 TCP三次握手和四次挥手是面试题的 ...
最新文章
- Django入门教程(二)
- odis工程师使用方法_开发区消防大队张立忠工程师莅临我校开展消防安全培训讲座...
- STL-容器库101--array【C11】
- 接口测试到底是什么?如何制造接口数据
- 剑指offer:50-53记录
- 查看java线程是否退出_[原创]IDA调试阻止java线程异常退出
- 判断手机机型和浏览器内核
- MySQL学习(五、数据操作语言DML和事务处理语言TCL)
- Silverlight开发中的疑难杂症-控件设计篇-如何实现一个NumericBox(下)
- airtest 不同目录下导入air文件方法
- 关于项目文档管理,现在开始就别揪心了!DOClever让你的项目文档纵享丝滑!
- win32 x64 x86 区别
- 如何在Apple Watch上关闭“嘿Siri”
- ASP站内搜索代码#
- coursera使用前准备
- java EE基础概念了解
- junit测试:异常测试
- 管理:身先士卒是必要的手段
- 苹果挺进“可折叠”手机赛道,柔性屏将迎来大发展
- loss曲线震荡(模型不收敛、acc震荡)