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四次挥手相关推荐

  1. 为什么只有三次挥手_TCP为什么是三次握手,为什么不是两次或四次,TCP四次挥手...

    这是一个很有意思的问题~ 首先,我们要知道TCP是全双工的,即客户端在给服务器端发送信息的同时,服务器端也可以给客户端发送信息.而半双工的意思是A可以给B发,B也可以给A发,但是A在给B发的时候,B不 ...

  2. tcp 四次挥手_TCP三次握手和四次挥手

    名词解释 SYN:发起一个新连接 ACK:确认序号有效 FIN:释放一个连接 1,TCP三次握手 第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认: 第 ...

  3. tcp当主动发出syn_一文读懂TCP四次挥手工作原理及面试常见问题汇总

    简述 本文主要介绍TCP四次挥手的工作原理,以及在面试中常见的问题. 字段含义 seq序号:Sequence Number,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行 ...

  4. (三)深入浅出TCPIP之再识TCP,理解TCP四次挥手(上)

    目录 1.TCP四次挥手过程 2.挥手连环发问 专栏其他文章: 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三) ...

  5. 经典面试题之 TCP三次握手 和 TCP四次挥手过程----详解

    TCP三次握手过程: 第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认:SYN:同步序列编号(Synchronize Sequence Nu ...

  6. 被面试官问懵:TCP 四次挥手收到乱序的 FIN 包会如何处理?

    摘要:收到个读者的问题,他在面试的时候,被搞懵了,因为面试官问了他这么一个网络问题. 本文分享自华为云社区<TCP 四次挥手收到乱序的 FIN 包会如何处理?>,作者:小林coding . ...

  7. 计算机网络之TCP四次挥手

    文章目录 计算机网络之TCP四次握手 1.TCP四次挥手过程 2.任何一方执行close()操作即可产生挥手操作为什么要等待呢 3.说说 TCP 四次挥手过程 4.TCP挥手为什么需要四次呢 5. T ...

  8. TCP四次挥手及原因

    一.TCP四次挥手 MSL是TCP报文里面最大生存时间,它是任何报文段被丢弃前在网络内的最长时间. 第一次挥手:A->B,A向B发出释放连接请求的报文,其中FIN(终止位) = 1,seq(序列 ...

  9. 灵魂拷问:TCP 四次挥手,可以变成三次吗?

    上周有位读者面试时,被问到:TCP 四次挥手中,能不能把第二次的 ACK 报文, 放到第三次 FIN 报文一起发送? 虽然我们在学习 TCP 挥手时,学到的是需要四次来完成 TCP 挥手,但是在一些情 ...

  10. 深入浅出TCP四次挥手 (多图详解)

    文章目录 前言 1.TCP的连接释放 2.TCP通过"四报文挥手"来释放连接 3.四次挥手图文详解 4.四次挥手文字总结 5.相关面试问题 前言 TCP三次握手和四次挥手是面试题的 ...

最新文章

  1. Django入门教程(二)
  2. odis工程师使用方法_开发区消防大队张立忠工程师莅临我校开展消防安全培训讲座...
  3. STL-容器库101--array【C11】
  4. 接口测试到底是什么?如何制造接口数据
  5. 剑指offer:50-53记录
  6. 查看java线程是否退出_[原创]IDA调试阻止java线程异常退出
  7. 判断手机机型和浏览器内核
  8. MySQL学习(五、数据操作语言DML和事务处理语言TCL)
  9. Silverlight开发中的疑难杂症-控件设计篇-如何实现一个NumericBox(下)
  10. airtest 不同目录下导入air文件方法
  11. 关于项目文档管理,现在开始就别揪心了!DOClever让你的项目文档纵享丝滑!
  12. win32 x64 x86 区别
  13. 如何在Apple Watch上关闭“嘿Siri”
  14. ASP站内搜索代码#
  15. coursera使用前准备
  16. java EE基础概念了解
  17. junit测试:异常测试
  18. 管理:身先士卒是必要的手段
  19. 苹果挺进“可折叠”手机赛道,柔性屏将迎来大发展
  20. loss曲线震荡(模型不收敛、acc震荡)

热门文章

  1. 【GO语言编程】(二)
  2. java常见的网络异常
  3. php红包现金,php实现微信支付之现金红包
  4. oppoa9处理器怎么样_oppoa91参数处理器怎么样
  5. 药店不停业盘点操作流程,海典盘点机PDA操作使用说明
  6. 《玩透嵌入式C的角角落落》深入分析sprintf和printf函数
  7. 单片机c语言延时程序计算,单片机 计算延时子程序执行时间
  8. 如何创建您自己的I爱纽约T恤
  9. 计算机打表格图,快速填充/微图表/一秒制作打勾方框
  10. 等比矩阵求和-POJ3233