TCP三次握手 中讲述了序列号和建立连接,这一篇来说说释放连接

标志位

TCP首部中在属性标志位,和建立连接、释放连接有关,位于保留窗口字段中间,其中三个标识与断开连接有关。

  • ACK: acknowledgment(确认)--- 为1时,确认号字段才有效
  • RST: reset(重置)--- 为1时,表示tcp连接中出现问题,要释放连接并重新建立连接
  • FIN: finish(终止连接)--- 为1时,表示要求释放连接

还有两个属性序号确认号,与发送数据有关。

  • 序号(Sequence Number) --- TCP传输过程中每一个字节都有编号,建立连接后,序号表示TCP数据部分的第一个字节编号
  • 确认号(Acknowledgment Number)--- 期望对方下一次传过来的TCP数据部分的第一个字节编号

四次挥手

当数据发送完毕,客户端或者服务器一方发起释放连接请求时,会经历四个步骤,这里演示客户端发起。

① 客户端 —> 服务器:FIN=1, ACK=1,ack = v,seq = u(客户端请求释放连接,此次发送数据的序号是 u,数据长度为0,希望对方发送数据的编号为 v)

② 服务器 —> 客户端:ACK=1,seq = v,ack = u+1(服务端表示接收到释放连接的请求,此时发送数据的序号是 v,希望服务器下一次发送数据以 u+1 开始,因为客户端上一条请求中序号是u,希望服务器响应数据以v开始)

③ 服务器 —> 客户端:FIN=1, ACK=1,seq = w,ack = u+1(服务端请求释放连接,此时发送数据的序号是 w,数据长度为0,希望对方下一次发送数据从 u+1 开始)

④ 客户端 —> 服务器:ACK=1,seq = u+1,ack = w+1(客户端接收到服务器也希望断开请求的消息,同时发送 u+1 的数据,希望对方发送数据为上一次客户端数据 w+1)

状态变化

这里发送方和接收方各自都有一些状态。

  • ESTABLISHED:表示连接已经建立
  • FIN-WAIT-1:表示想主动关闭连接,向对方发送了FIN报文,此时进入到FIN-WAIT-1状态
  • CLOSE-WAIT:表示在等待关闭,当对方发送FIN给自己,自己会回应一个ACK报文给对方,此时则进入到CLOSE-WAIT状态,在此状态下,需要考虑自己是否还有数据要发送给对方,如果没有,发送FIN报文给对方
  • FIN-WAIT-2:只要对方发送ACK确认后,主动方就会处于FIN-WAIT-2状态,然后等待对方发送FIN报文
  • LAST-ACK:被动关闭一方在发送FIN报文后,最后等待对方的ACK报文,当收到ACK报文后,即可进入CLOSED状态了
  • TIME-WAIT:表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可进入CLOSED状态
  • CLOSED:关闭状态

以上是完整四次挥手流程,但我们在抓包的时候,也有可能会看到三次挥手

当服务器接收到客户端的FIN时,如果服务器后面没有数据要发给客户端时,服务器有可能把第2、3次挥手合并(同时带FIN标志和ACK标志的报文),相当于同时告诉客户端两件事

  • 已经知道client没有数据要发
  • server已经没有数据要发

此时FIN-WAIT-1状态就不经过FIN-WAIT-2,直接到TIME-WAIT

为什么要四次挥手

四次挥手中存在客户端和服务器分别 发起断开请求确认收到对方的断开请求,那这里的四次是不是可以简化成两次,只要一方发起,另一方确认就行。

这样是不可以的,因为TCP是全双工通信,一方发送关闭请求,仍然可以继续接收消息。

① 客户端 —> 服务器:客户端告诉服务器没有数据要发送,但是客户端还可以接收

② 服务器 —> 客户端:服务器已经知道客户端没有数据发送,但是服务器仍可以发送

③ 服务器 —> 客户端:服务器告诉客户端,服务器没有数据要发送了

④ 客户端 —> 服务器:服务器已经知道客户端没有数据要发送,随后正式断开整个TCP连接

经过了四次消息的交互之后,才能完全确认双方都已经没有数据要发送。

2ML

MSL:Maximum Segment Lifetime,最大分段生存期,MSL是TCP报文在Internet上的最长生存时间,一般是2分钟

客户端第四次挥手,发送ACK的确认报文后,不会马上进入 CLOSED 关闭状态,而是会在TIME-WAIT等待2ML的时间,是为了防止本次连接中产生的数据包误传到下一次连接中(因为本次连接中的数据包都会在2MSL时间内消失了)

因为可能存在这样的情况:如果网络原因,服务器没有收到ack,那么服务器会重发FIN,如果客户端发送了一次ACK后就马上进入CLOSED阶段,那么客户端收不到服务器的FIN。 如果此时客户端的新应用分配了同一个端口号,那么新的应用程序收到服务器传来FIN的报文,以为是要请求关闭,那么会马上会释放连接。

抓包

抓包工具可以看到释放连接时的四次挥手

使用 netstat 命令可以看到连接状态

以上就是 释放连接与状态变化的内容 , 更多有关 前端网络协议 的内容可以参考我其它的博文,持续更新中~

TCP四次挥手会经历这么多状态的更多相关文章

  1. TCP四步挥手的各种状态转换图

    对于TCP四步挥手时的各种状态转换,网上有很多资料.但是有很多描述不是很容易理解,甚至是描述错误,不如这篇文章里http://www.cnblogs.com/Jessy/p/3535612.html# ...

  2. TCP四次挥手

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

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

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

  4. Java网络编程学习A轮_03_抓包分析TCP四次挥手

    参考资料: http://www.jellythink.com/archives/705 示例代码: https://github.com/gordonklg/study,socket module ...

  5. TCP四次挥手断开连接详解

    TCP四次挥手. 数据传输结束后,通信的双方都可释放连接.现在A和B都处于ESTABLISHED状态.A的应用程序先向TCP发出连接释放报文段,主动关闭TCP连接.A把连接释放报文段的首部FIN置为1 ...

  6. 计算机网络(五),TCP四次挥手

    目录 1.TCP四次挥手详情 2.为什么会有TIME-WAIT状态 3.为什么需要四次握手才能断开连接 4.服务器出现大量CLOSE_WAIT的原因 五.TCP四次挥手 1.TCP四次挥手详情 (1) ...

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

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

  8. 详解TCP四次挥手(断开TCP连接过程)

    在讲述TCP四次挥手,即断开TCP连接的过程之前,需要先介绍一下TCP协议的包结构. TCP协议包结构: 这里只对涉及到四次挥手过程的字段做解释 (1) 序号(Sequence number) 我们通 ...

  9. 计算机网络之tcp四次挥手

    TCP的四次挥手(Four-Way Wavehand)1.前言对于"三次握手"我们耳熟能详,因为其相对的简单.但是,我们却不常听见“四次挥手”,就算听过也未必能详细地说明白它的具体 ...

  10. TCP三次握手连接和TCP四次挥手及大量TIME_WAIT解决方法:

    1.TCP建立连接,三次握手 建立的TCP连接可靠的连接,必须经过三次握手建立连接才能正式通信彼此传输数数据. 客户端请求服务端建立连接 第一次握手:客户给服务发送一个请求报文SYN, 客户端的状态置 ...

随机推荐

  1. 京喜APP - 图片库优化

    作者:京东零售 何骁 介绍 京喜APP早期开发主要是快速原生化迭代替代原有H5,提高用户体验,在这期间也积累了不少性能问题.之后我们开始进行一些性能优化相关的工作,本文主要是介绍京喜图片库相关优化策略 ...

  2. Django4全栈进阶之路5 Model模型

    在 Django 中,模型(Model)是用于定义数据结构的组件,其作用如下: 定义数据结构:模型用于定义数据库中的表格和表格中的字段(列),其中每个模型类对应一个表格,模型中的每个字段对应表格中的一 ...

  3. django 整合 vue

    django 整合 vue   安装 vue 1. 安装 node.js , 官网地址: https://nodejs.org/zh-cn/download/ 2. 使用 npm 淘宝镜像 npm i ...

  4. gitlab-runner 中的 Docker-in-Docker

    笔者个人理解:gitlab-runner 安装后就是一个监听状态的 runner,而通过 gitlab-runner register 注册的"实例"其实只是预定义的配置节,当消息 ...

  5. 声音好听,颜值能打,基于PaddleGAN给人工智能AI语音模型配上动态画面(Python3.10)

    借助So-vits我们可以自己训练五花八门的音色模型,然后复刻想要欣赏的任意歌曲,实现点歌自由,但有时候却又总觉得少了点什么,没错,缺少了画面,只闻其声,却不见其人,本次我们让AI川普的歌声和他伟岸的 ...

  6. 深入浅出 OkHttp 源码解析及应用实践

    作者:vivo 互联网服务器团队- Tie Qinrui OkHttp 在 Java 和 Android 世界中被广泛使用,深入学习源代码有助于掌握软件特性和提高编程水平. 本文首先从源代码入手简要分 ...

  7. < Python全景系列-7 > 提升Python编程效率:模块与包全面解读

    欢迎来到我们的系列博客<Python全景系列>!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语法.无论你是编程新手,还是有一 ...

  8. GroundingDINO(一种开集目标检测算法)服务化,根据文本生成检测框

    背景 最近发现一个叫GroundingDINO的开集目标检测算法,所谓开集目标检测就是能检测的目标类别不局限于训练的类别,这个算法可以通过输入文本的prompt然后输出对应的目标框.可以用来做预标注或 ...

  9. python -----类反射

    #反射#描述:反射就是指在程序运行时,动态的去确定对象的类型,并且可以通过字符串的形式去调用对应的属性# ,方法,导入模块,是一种基于字符串的事情驱动# class User:# def __init ...

  10. .net开发者应掌握的利器CommunityToolkit.HighPerformance——MemoryOwner与SpanOwner

    MemoryOwner和SpanOwner都可以理解为是对ArrayPool<>的一个包装,无非一个是在堆栈上,一个是在托管堆上.既然做了包装,那肯定随之而来就是改进和优化. 目录 Mem ...