在TCP四次挥手中,为什么客户端发送FIN后,还可以发送报文

首先回顾下四次挥手的过程。

  • 第一次挥手:客户端停止发送数据,主动关闭 TCP 连接,处于FIN_WAIT1状态,等待服务端确认。
  • 第二次挥手:服务端发送 ACK 报文,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态,等待从本地用户发来的连接中断请求。此时的 TCP 处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待 2)状态,等待服务端发出的连接释放报文段。
  • 第三次挥手:如果服务端也想断开连接了(没有要向客户端发出的数据),和客户端的第一次挥手一样,发送 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态,等待客户端的确认。
  • 第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答(ack = w+1),且把服务端的序列值 +1 作为自己 ACK 报文的序号值(seq=u+1),此时客户端处于 TIME_WAIT (时间等待)状态。

注意 !!!这个时候由服务端到客户端的 TCP 连接并未释放掉,客户端需要经过时间等待计时器设置的时间 2MSL(MSL是报文在网络上可以存活的最长时间,这个值会根据实际网络情况动态变化) 后才会进入 CLOSED 状态,这样做的目的是确保服务端收到客户端发送的 ACK 报文。如果服务端在规定时间内没有收到客户端发来的 ACK 报文的话,服务端会重新发送 FIN 报文给客户端,客户端再次收到 FIN 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文给服务端。服务端收到 ACK 报文之后,就关闭连接了,处于 CLOSED 状态。

在第二次挥手后,TCP 处于半关闭状态,客户端到服务端的连接释放,但是第四次握手仍需客户端给服务端发送报文,所以半关闭状态和发送报文是不冲突的。因为 FIN 状态位表示发送后,当前客户端仍然会接收服务器的数据,但是不会接收他本地服务的数据(应用层的数据),所以客户端在发送 FIN 后仍然能发送 ack 是不矛盾的,因为 ack 不是本地服务的数据,是放在 tcp 头部的,而不是body中。

在TCP四次挥手中,为什么客户端发送FIN后,还可以发送报文的更多相关文章

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

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

  2. TCP 三次握手和四次挥手中的ACK 为什么总是SYN + 1 或者 FIN +1 而不是+ 其他数值?

    TCP 三次握手的时候 1.客户端 向服务端发起连接请求,这个时候客户端将发送一个SYN分节(假设其值为J),它告诉服务端我发送数据的初始序列号将是J. 2.服务端收到这个请求后,必须确认(ACK) ...

  3. 对四次挥手中的TIME_WAIT状态的学习

    TIME_WAIT状态不必多说    是属于四次挥手中的一种特殊状态 作用有两点简单明了  不废话 (1)可靠的实现TCP全双工连接的终止 (2)允许老的重复的.迟到的分节在网络中消逝        ...

  4. tcp四次撒手

    转自:http://www.cnblogs.com/cy568searchx/p/3711670.html 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭.这个原则是当一方完成它的数据发送任 ...

  5. TCP四次挥手客户端关闭链接为什么要等待2倍MSL

    最长报文寿命 在TCP协议中,当发送方发送释放连接报文收到确认报文后,只是在一个方向上断开了TCP连接,然后,接收方发送释放连接的报文,发送方回复确认.此时,连接还没有释放,发送方要等待2MSL(ma ...

  6. TCP三次握手中SYN,ACK,seq ack的含义

    转至:https://www.cnblogs.com/muyi23333/articles/13841268.html 1.TCP 为什么三次握手而不是两次握手 1.防止已失效的连接请求又传送到服务器 ...

  7. python 网络编程(四)---UDP服务端客户端

    1.服务器端 UDP服务器建立与TCP相类似,具体比较如下: 补充下,第四步:不必使用listen还有accept函数. 具体代码如下:(设置socket选项省略) import socket fro ...

  8. TCP四次挥手

    TCP 四次挥手      TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake).客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close ...

  9. 解读TCP 四种定时器

    TCP 是提供可靠的传输层,它使用的方法之一就是确认从另一端收到的数据.但是数据和确认都可能会丢失.TCP 通过在发送时设置一个定时器来解决这个问题.如果当定时器溢出时还没收到确认,它就会重传该数据. ...

  10. TCP为什么是三次握手,为什么不是两次或者四次 && TCP四次挥手

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

随机推荐

  1. C语言下载minGW地址

    https://sourceforge.net/projects/mingw-w64/files/ 下载红框内即可

  2. 52条SQL语句,性能优化!

    52条SQL语句,性能优化! SQL语句性能优化 1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2,应尽量避免在 where 子句中对 ...

  3. ENVI+ERDAS实现Hyperion叶绿素含量反演:经验比值法、一阶微分法

    本文介绍基于ENVI与ERDAS软件,依据Hyperion高光谱遥感影像,采用经验比值法.一阶微分法等,对叶绿素含量等地表参数加以反演的具体操作. 目录 1 前期准备与本文理论部分 1.1 几句闲谈 ...

  4. CTFshow misc1-10

    小提示:需要从图片上提取flag文字,可以通过截图翻译或者微信发送图片,这两个的ai图像识别挺好用的. misc1: 解压打开就能看见flag,提取出来就行 misc2: 记事本打开,看见 ng字符, ...

  5. CodeForces-1278B-A-and-B

    题意 对于\(t(1\leq t\leq 100)\)个测试点,给两个数\(a\)和\(b\),作如下操作: 第一次挑一个数使其加\(1\),第二次挑一个数使其加\(2\),以此类推,最后两个数相等, ...

  6. Pycharm包推荐|自动检查shell脚本问题的包

    如图,这个包自动会检测出哪块代码编写有问题,自动提示,这里可以根据提示进行修改,快速高效!!! 包的名字如图:Shell script formatter 太香了

  7. Skynet:Debug Console的扩展

    起因 最近上线服务器遇到了一些问题,上个月CPU暴涨的问题,那个经查验是死循环导致endless loop了. 这周又遇到了mem占用达到96%的问题,在debug console里调用了gc之后,跌 ...

  8. 01.前后端分离中台框架后端 Admin.Core 学习-介绍与配置说明

    中台框架后端项目 Admin.Core 的介绍与配置说明 中台admin是前后端分离权限管理系统,Admin.Core为后端项目,基于.NET 7.0开发. 支持多租户.数据权限.动态 Api.任务调 ...

  9. oracle问题:ORA-09817及解决办法

    某天以管理员身份登录公司测试库报ORA-09817错误,查了网上的文章说是审计文件没有存储空间造成的.我的这问题也证实了这一点,现将解决步骤分享: 1.发现问题:报ORA-09817 oracle@l ...

  10. AcWing - 闫氏DP分析法

    核心思想:从集合角度来分析DP问题 在我们遇到的DP问题中,一般都是求在一个有限集内的最值,但是这些方案数量一般都是指数级别的,想要一个一个查找出来不太可能.所以DP方法是用来优化这种寻找最优方案的过 ...