TCP 协议四次挥手&状态变迁

简介: TCP 协议四次挥手&状态变迁

之前介绍了 TCP 三次握手建立连接流程,而 TCP 协议是一个面向 字节流 的协议,它不限制应用层传输消息的长度,但是 网络层、数据链路层 在发送报文时使用的内存是有限的,所有就需要限制报文的长度,TCP 协议就需要把从 应用层 接收到的任意长度的 字节流 切分成许多个报文段,这里边涉及到很多底层复杂的网络编程的知识,如 TCP 是如何切分应用层的消息、慢启动、避免拥塞、超时重试等等,最后会经历一个关闭连接的过程,这篇简单介绍一下TCP 四次挥手 以及 状态变迁

1.TCP 关闭连接目的

       TCP 是一个全双工协议,必须单独拆除每一条信道,而四次挥手的目的则是终止数据传输,且回收资源,此时两个端点两个方向的序列号已经没有了任何关系,必须等待两方向都没有数据传输时才能拆除虚链路,因此必须单独分别在一个方向上终止该方向的数据传输。如果也像三次握手那样只有三次挥手的话,在被动关闭端在收到 FIN 消息之后,需要同时回复 ACK 和服务端的 FIN 消息,如果服务端还需要等待一段时间才可以关闭另外一个方向的连接,那么这样的三次挥手就会出问题,而 TCP 关闭连接主要有以下两个目的:

  • 防止数据丢失
  • 与应用层交互

2.三次握手和关闭连接    

2.1 三次握手流程

2.2 四次挥手流程

Tips:如果被动关闭端调用 close/shutdown 函数非常及时,内核在很大概率上也会将 ACKFIN 放在一个报文中发送,这就变成三次挥手了。

3.wireshark 抓包分析

       在虚拟机 CentOs8 中使用 curl singwa666.com 命令请求网站时发起了 HTTP/1.1 请求,过程中需要建立 TCP 连接握手,获取数据,最后还会有 四次挥手,抓取到的 TCP报文如下:

  • 第一次:FIN

  • 第二次:ACK

  • 第三次:FIN

  • 第四次:ACK

4.四次挥手中的状态变迁示意图

TIME_WAIT 状态存在的两个理由:

  • 可靠地实现 TCP 全双工连接的终止:
  • 允许老的重复分节在网路中消逝
相关文章
|
8月前
|
人工智能 小程序 API
DeepSeek‑R1-0528 重磅升级:蚂蚁百宝箱免费、无限量调用
DeepSeek-R1-0528 版本重磅升级,推理能力显著增强,在数学、编程和通用逻辑等基准测评中表现卓越,媲美国际顶尖模型。此次更新提供免费、无限量调用通道——蚂蚁百宝箱,用户可通过简单五步构建智能体并发布至多端平台。模型基于 DeepSeek V3 Base,参数规模达 685B,上下文长度最高支持 128K,助力开发者快速嵌入顶尖推理能力,打造创新应用。立即访问蚂蚁百宝箱体验!
584 11
|
Web App开发 网络协议 数据可视化
tcpdump 和 wireshark 抓包工具 ,介绍、安装、命令使用。 详解三次握手、四次挥手。两个结合使用,会更好分析报文
这篇文章详细介绍了网络抓包工具tcpdump和Wireshark的使用,包括安装、命令选项、过滤器语法,以及如何通过分析TCP的三次握手和四次挥手来理解网络通信细节。
4049 1
|
存储 人工智能 数据库
面向医疗场景的大模型 RAG 检索增强解决方案
本方案为您介绍,如何使用人工智能平台 PAI 构建面向医疗场景的大模型 RAG 检索增强解决方案。
|
编解码 开发工具 Android开发
Android平台GB28181设备接入侧如何实现GB28181-2022实时快照
GB/T28181-2022标准中明确了快照的具体要求,包括图像抓拍配置命令的发送与接收流程。源设备需向目标设备发送包含传输路径和会话ID等信息的命令,目标设备完成图像传输后,通过IETF RFC 3428中的MESSAGE方法发送图像抓拍传输完成的通知。图像格式推荐使用JPEG,且分辨率应与主码流相同。技术实现上,如使用大牛直播SDK在Android平台上,可通过创建`SnapShotImpl`类并调用`capture()`方法实现快照功能,之后将JPEG格式的快照文件上传至国标平台。
350 2
|
NoSQL Linux Android开发
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
本文介绍了如何在QEMU中挂载虚拟分区、创建和编译简单的Linux内核模块,并在QEMU虚拟机中加载和测试这些内核模块,包括创建虚拟分区、编写内核模块代码、编译、部署以及在QEMU中的加载和测试过程。
665 0
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
|
关系型数据库 MySQL Java
MySQL 连接池配置及 FullGC 分析
本文主要讲述MySQL连接池配置不合适时,由于MySQL以虚引用的方式作为线程清理的后备手段,导致JVM年老代随时间缓慢增长,直至FullGC的问题。为了优化数据库连接池配置,使得JVM进行尽量少的FullGC导致服务故障,本文提供了多种解决方案 单独的MySQL清理,负责关闭被遗弃的MySQL连接,即没有被显式关闭的连接。发现容器服务的老年代在不断的增长,直到。
|
存储 监控 Linux
C语言 多路复用 select源码分析
本文详细介绍了阻塞IO与非阻塞IO的概念及其在Linux系统中的实现方式。首先阐述了常见的IO模型,包括阻塞型、非阻塞型及多路复用IO模型。阻塞IO模型会在IO请求未完成时阻塞进程,而非阻塞IO模型则允许在IO未完成时立即返回。非阻塞IO可通过设置`O_NONBLOCK`标志实现。接着介绍了多路复用IO模型,利用`select`、`poll`和`epoll`等系统调用监控多个文件描述符。`select`函数通过内核检测文件描述符是否就绪,并通知调用者。
Commons StringSubstitutor对模板占位符进行赋值
Commons StringSubstitutor对模板占位符进行赋值
458 0
|
关系型数据库 MySQL 数据库
mysql下的max_allowed_packet参数设置
mysql下的max_allowed_packet参数设置
1635 0
|
消息中间件 物联网 网络性能优化
MQTT常见问题之MQTT的topic超出上限25个如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总: