计算机网络——TCP释放连接的4次挥手

TCP连接释放过程比较复杂。

数据传输结束后,通信的双方都可释放连接。

TCP连接释放过程是四次挥手。

TCP报文段首部

上篇【计算机网络】TCP为什么需要3次握手

上篇中讲解了这四个字段的作用:

  • seqseqseq:序号
  • ackackack:确认号
  • SYNSYNSYN:同步位(释放连接不需要)
  • ACKACKACK:确认位

因为在TCP释放连接,所以不需要用到同步位 SYNSYNSYN 字段,而要用到一个新的字段:

  • FINFINFIN:终止位

    ➢ 当终止位被置为 111 时,说明数据已发送完毕,请求释放连接

    ➢ 当终止位被置为 000 时,说明还有数据正在发送

TCP建立连接

AAA 为客户端 (Client)(Client)(Client),BBB 为服务端 (Server)(Server)(Server)。

在TCP释放连接的四次挥手中,我们只需要关注这两个标志位:FIN、ACKFIN、ACKFIN、ACK

谁发出 FINFINFIN 的报文,就代表着它接下来不再发送任何数据,申请关闭连接通道。

而 ACKACKACK 报文就是一个回包的意思,用来确认对方发送连接的通道已经成功关闭了。

第一次挥手

假设本次TCP连接,AAA 先把数据发完了:

  1. 终止位 FIN=1FIN=1FIN=1 被置为 111,表示我在发起释放连接的请求。
  2. 序号 seq=useq=useq=u,我最后给你发的数据序号从 uuu 开始(只要发数据 就一定会有序号)

第二次挥手

BBB 同意了 AAA 的释放连接请求,所有数据都已接收完毕,此时会把服务端的接收缓存中剩下的所有数据都交给上层应用进程;

服务端接收窗口客户端发送窗口此时都不需要了。

  1. BBB 收到了 AAA 发的请求,并回复确认号 ack=u+1ack=u+1ack=u+1。
  2. 有确认号,肯定有确认位 ACK=1ACK=1ACK=1。
  3. 本次传输自己的序号 seq=vseq=vseq=v。

此时,从 AAA 到 BBB 这个方向的连接就释放了,TCP连接处于半关闭状态。

BBB 若发送数据,AAA 仍要接收,所以此时用到的是:服务端发送窗口客户端接受窗口

第三次挥手

第三次请求还是 BBB 向 AAA 发出的,在第二次请求与第三次请求中,这两个连续的请求包之间存在着隔断时间,因为对于 BBB 来说可能还有一些还未处理完的数据,此时需要一些异步等待时间;

我们抽象一下:
A:B啊,我不想玩了。
B:哦,你不想玩了啊,我知道了。
B:A啊,好吧,我也不玩了,拜拜。
A:好的,拜拜。

等服务端的数据都处理完成后,此时 BBB 给 AAA 发送的请求只是单纯确认的请求:

  1. 终止位 FIN=1FIN=1FIN=1,表示我的数据全部处理完了,我也申请释放连接。
  2. 确认号 ack=u+1ack=u+1ack=u+1,表示你发送的 u+1u+1u+1 之前的数据我全部收到了。
  3. 确认位 ACK=1ACK=1ACK=1。
  4. 我本次请求的数据携带的序号字段为 seq=wseq=wseq=w。

第四次挥手

AAA 收到了 BBB 的释放连接请求,并回复确认。

  1. 确认号 ack=w+1ack=w+1ack=w+1,表示你你发送的 w+1w+1w+1 之前的数据我全部收到了。
  2. 确认位 ACK=1ACK=1ACK=1。
  3. 自己本次数据的序号字段 seq=u+1seq=u+1seq=u+1 对应你上次请求的确认号。

至此,AAA 和 BBB 的连接释放完成。

四次挥手TCP连接的各个状态

  • ESTAB−LISHEDESTAB-LISHEDESTAB−LISHED:已确认连接状态
  • FIN−WAIT−1FIN-WAIT-1FIN−WAIT−1:主动关闭方的第一个等待状态(此时在等待 BBB 的确认)
  • FIN−WAIT−2FIN-WAIT-2FIN−WAIT−2:主动关闭方的第二个等待状态(此时在等待 BBB 处理未处理完的一些资源)
  • CLOSE−WAITCLOSE-WAITCLOSE−WAIT:半关闭状态(对于被动关闭方 BBB 可能还需要处理内部的一些资源)
  • LAST−ACKLAST-ACKLAST−ACK:等待最后一次确认状态
  • TIME−WAITTIME-WAITTIME−WAIT:等待计时状态(等待计时器)
  • CLOSEDCLOSEDCLOSED:关闭状态

一个 FINFINFIN 对应一个 ACKACKACK。

注意:只有主动关闭连接的,才有 TIME−WAITTIME-WAITTIME−WAIT 状态。

TIME-WAIT状态解释

为什么会有这个状态(等待计时器)存在?

对于客户端 AAA 和服务端 BBB,都存在着一个超时计时器;

对于最后一次挥手,AAA 怎么知道 BBB 是否收到了呢?因为最后一次请求 BBB 不会给 AAA 回复,按以前的超时计时器来判断的话,AAA 会一直给BBB 发 NNN 个请求,直到 BBB 给 AAA 回复确认请求,这显然是不可以的。

如果不设置超时计时器,万一对方真的没有收到呢?

所以此时就有一个 TIME−WAITTIME-WAITTIME−WAIT(等待计时器)状态,为了确保我最后的一次请求 BBB 一定收到了。

假设我第四次请求丢失了,那么 BBB 的超时计时器发现后,会重新发送第三次请求,当 AAA 处在 TIME−WAITTIME-WAITTIME−WAIT 状态时,又收到了第三次请求,则证明我发送的第四次请求丢失了,BBB 没有收到,此时 AAA 会重新发送第四次请求。

这样双方就都可以判断最后一次挥手有没有完成,判断依据是:在这 2MSL2MSL2MSL 的等待时间中,对方都没有再给我发任何重复的数据包过来,那么我就可以认为对方收到了最后一次请求。

MSL(MaximumSegmentLifetime)MSL(Maximum\ Segment\ Lifetime)MSL(Maximum Segment Lifetime) 是报文最大生存时间

AAA 必须等待 2MSL2MSL2MSL 的时间:

  • 第一,为了保证 AAA 发送的最后一个 ACKACKACK 报文段能够到达 BBB。

  • 第二,防止 “已失效的连接请求报文段” 出现在本连接中。

    AAA 在发送完最后一个 ACKACKACK 报文段后,再经过时间 2MSL2MSL2MSL,就可以使本连接持续的时间内产生的所有报文段,都从网络中消失。

    这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

更详细的分析可参考小林coding的TCP面试题

TIME_WAIT 过多有什么危害?如何优化 TIME_WAIT?

还是挺详细的。

【计算机网络】TCP为什么需要4次挥手相关推荐

  1. 计算机网络-tcp连接常见异常

    计算机网络-tcp连接常见异常 目标端口未在监听:(操作系统参与) 解决:TCP的服务端实际上就是从网卡的寄存器中读取数据,然后进行解析.对于TCP自然会解析出目的端口这个关键信息,然后根据这个信息查 ...

  2. 计算机网络-TCP协议

    目录 1 概述 2 TCP的主要特点 3 TCP的连接 4 可靠传输的工作原理 4.1 停止等待协议 4.1.1 无差错情况 4.1.2 出现差错 4.2 自动重传请求ARQ 4.3 连续 ARQ 协 ...

  3. 简单了解下 TCP,学习握手和挥手以及各种状态到底是怎么样的

    一口气真的吃不下 TCP,对着资料整理好多天,滑动窗口.重传等留到下一次博客,这里先简单认识下 TCP 以及其连接与断开 内容比较干,如果认真看完一定对您有一定帮助. TCP基本认识 TCP头格式 序 ...

  4. 计算机网络TCP拥塞控制窗口大小变化、重传、滑动窗口、流量控制等

    转载自:[计算机网络] - TCP 重传.滑动窗口.流量控制.拥塞控制_3000~3500的数据早已被接收了,因为 ack 都到了 4000 了,已经意味着 4000 之前__浮生_的博客-CSDN博 ...

  5. [计算机网络] - TCP三次握手和四次挥手

    转载自:https://blog.csdn.net/qq_34827674/article/details/105331617 1.TCP基本认识 TCP头部格式: ​​​​ 序列号:在建立连接时由计 ...

  6. 计算机网络 —— TCP的三次握手四次挥手

    TCP的6个标志位 SYN -- synchronous :建立联机. ACK -- acknowledgement :确认. PSH -- push :传输. FIN -- finish :结束. ...

  7. 计算机网络-TCP的运输连接管理(三次握手,四次挥手)补充一下为什么不能将四次挥手改为三次挥手

    hello,朋友们.今天咱们分享一下TCP连接建立与释放问题(三次握手与四次挥手问题) 1.简单介绍 基础知识了解(仅代表个人简单理解) SYN        同步(一个信号   代表自己的状态) F ...

  8. 的udp的接收端如何看速率_计算机网络 TCP与UDP

    本文记录了阅读<图解TCP/IP>的<TCP与UDP>章节的笔记. 一.传输层的作用 当IP协议根据IP地址发送数据到了目标计算机上,但是具体要发给哪个应用程序还没有确定.传输 ...

  9. 计算机网络——TCP 协议原理总结

    目录 1.网络是不可靠的 2.TCP 概念和特点 3.可靠传输机制 1.一问一答的方式 2.流水线传输的方式 1.回退 N 重传 2.选择重传 4.TCP 滑动窗口机制 数据包序号 确认号和累计确认 ...

最新文章

  1. FreeBSD下安装配置Hadoop集群(一)
  2. python中x=x+1的读法-python中xrange和range的区别
  3. Nginx配置Basic Auth登录认证的实现方法
  4. MyBatis 插件原理与自定义插件-需求实现
  5. linux 下 storm环境搭建,Storm在Ubuntu环境下的单机部署
  6. Linux和Windows下查看、设置环境变量的比较
  7. BugkuCTF-Crypto题小山丘的秘密
  8. 用css实现星级评分效果
  9. mysql的几种模式_MYSQL复制的几种模式
  10. linux docker自动启动命令行,docker容器内服务随容器自启动
  11. html checkbox 多选 根据数据库来显示选取和未选取,前端框架(2)DIV多选复选框框的封装和MySql数据库存取...
  12. python写邮箱验证工具_python应用POP3、IMAP、SMTP 协议,获取邮箱验证码
  13. lumion室内渲染二6.3
  14. 红帽子安装oracle,红帽子AS4安装oracle9i
  15. 12c 新特性-统一审计(Unified Auditing)
  16. matlab求两向量夹角_高考数学解题技巧:专题21 平面向量中最值、范围问题高中数学黄金解题模板...
  17. 直通车推广有哪些容易被忽略的地方
  18. 负雪明烛开通公众号啦~ 欢迎关注「负雪明烛」
  19. c语言中 if(x) 、if(0) 、if(1)
  20. # 吴恩达 · 机器学习笔记(① Introduction to Machine Learning)

热门文章

  1. jQuery动画实现、each迭代器、自定义动画、json简介
  2. 串口工具推荐——串口监视精灵v4.0
  3. 讲座报名 | 清华大学副教授刘知远:大模型十问
  4. shell脚本遍历目录下的所有文件并进行操作
  5. 行业生态重塑中,新氧如何逆风翻盘
  6. Amazon后台模拟登陆
  7. C# FIR滤波器(含低通、高通、带通、带阻)
  8. 那些年我们玩过的Spark下的Standalone集群模型
  9. 【电子基础】总结·嵌入式硬件基础
  10. Kafka实践(八):Kafka的控制器controller