四次挥手详解

文章目录

  • 一、四次挥手各状态
    • FIN_WAIT_1
    • CLOSE_WAIT
    • FIN_WAIT_2
    • LAST_ACK
    • TIME_WAIT
    • CLOSE
  • 二、双方同时调用close(),FIN_WAIT_1状态后进入CLOSING状态
    • CLOSING状态
  • 三、TIME_WAIT状态详解
    • (1) TIME_WAIT状态下的2MSL是什么
      • MSL (报文最大生存时间)
      • 为什么TIME__WAIT状态必须停留两倍MSL时间
    • (2) TIME_WAIT存在的意义
    • (3) 为什么会出现大量的TIME_WAIT状态
    • (4) TIME_WAIT状态的影响
      • 解决方法
  • 四、HTTP中一般服务端是请求断开方

在这里插入图片描述
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

一、四次挥手各状态

FIN_WAIT_1

当主动关闭方在ESTABLISHED状态时发送一个FIN,用来关闭数据传送,此时即进入到FIN_WAIT_1状态。

CLOSE_WAIT

处于ESTABILSHED状态的服务器收到FIN包,将发回一个ACK,确认序号为收到的序号加1。
CLOSE_WAIT: 这种状态表示在等待关闭。当对方发送FIN报文给自己,系统会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。如果还有数据发送给对方则可以在数据发送结束后再发送FIN报文来结束连接,所以这个状态是被断开方再等待自己数据发送结束后断开连接

FIN_WAIT_2

处于FIN_WAIT_1状态时,当接收到对方回应的ACK报文后,则进入到FIN_WAIT_2状态

LAST_ACK

被动关闭一方在发送FIN报文后,最后等待对方的ACK报文期间处于LAST_ACK状态

TIME_WAIT

time_wait 是「主动关闭 TCP 连接」一方的状态,可能是==「客服端」的,也可能是「服务器端」==的;
当TCP的一端发起主动关闭(收到 FIN 请求),即第3次握 手完成后,发送了第四次握手的ACK包后(最后的 ACK 是由「主动关闭连接」的一端发出的),就进入了TIME_WAIT状态。

CLOSE

当被动方收到ACK报文后,也即可以进入到CLOSED可用状态了。

二、双方同时调用close(),FIN_WAIT_1状态后进入CLOSING状态

在这里插入图片描述

CLOSING状态

CLOSING: 当发送FIN报文后进入fin_wait_1状态,过后并没有收到对方的ACK报文,反而也收到了对方的FIN报文。就是双方几乎在同时close一个SOCKET,然后就出现了双方同时发送FIN报文的情况,表示双方都正在关闭SOCKET连接。
closing状态收到ack报文以后即直接进入time_wait状态

三、TIME_WAIT状态详解

(1) TIME_WAIT状态下的2MSL是什么

MSL (报文最大生存时间)

任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。(IP 报文)
RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。

为什么TIME__WAIT状态必须停留两倍MSL时间

等待2MSL时间主要目的是怕最后一个 ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后,可以再发一个ACK应答包。

当连接处于2MSL等待阶段时,任何迟到的报文段都将被丢弃。

(2) TIME_WAIT存在的意义

可靠的实现 TCP 全双工连接的终止:
四次挥手关闭 TCP 连接过程中,最后的 ACK 是由「主动关闭连接」的一端发出的,如果这个 ACK 丢失,则,对方会重发 FIN 请求,因此,在「主动关闭连接」的一段,需要维护一个 time_wait 状态,处理对方重发的 FIN 请求;

假设发起主动关闭方发送的ACK (4次交互的最后一个包)在网络中丢失,那么由于TCP的重传机制,被动关闭方需要重发FIN(第三次挥手),在该FIN到达主动发起方之前,client必须维护这条连接的状态(尽管它已调用过close),具体而言,就是这条TCP连接对应的(源IP,源端口)资源不能被立即释放或重新分配。直到对端重发的FIN达到,client也重发ACK后,该TCP连接才能恢复初始的CLOSED状态。如果主动方不进入TIME_WAIT以维护其连接状态,则当被动方重发的FIN达到时,主动方的TCP传输层会以RST包响应对方,这会被对方认为有错误发生(而事实上,这是正常的关闭连接过程,并非异常)。

处理延迟到达的报文:
由于路由器可能抖动,TCP 报文会延迟到达,为了避免「延迟到达的 TCP 报文被误认为是「新 TCP 连接」的数据,则,需要在允许新创建 TCP 连接之前,保持一个不可用的状态,等待所有延迟报文的消失,一般设置为 2 倍的 MSL(报文的最大生存时间),解决「延迟达到的 TCP 报文」问题。

TCP是流式的,所有包到达的顺序是不一致的,依靠序列号由TCP协议栈做顺序的拼接;假设如果一个新连接建立后旧连接的seq=1000包到达对端,可能会顶替掉新连接的seq=1000,造成错误

(3) 为什么会出现大量的TIME_WAIT状态

大量的短连接存在
TCP 四次挥手关闭连接机制中,为了保证 ACK 重发和丢弃延迟数据,设置 time_wait 为 2 倍的 MSL(报文最大存活时间)

(4) TIME_WAIT状态的影响

time_wait 状态下,TCP 连接占用的端口,无法被再次使用, 要等到2MSL时间结束,才可继续使用,而TCP 端口数量上限是 6.5w(65535,16 bit)
大量 time_wait 状态存在,会导致新建 TCP 连接会出错,address already in use : connect 异常

解决方法

  • 服务器端允许 time_wait 状态的 socket 被重用
  • 缩减 time_wait 时间,设置为 1 MSL(即,2 mins)

四、HTTP中一般服务端是请求断开方

在HTTP1.1协议中,有个 Connection 头,Connection有两个值,close和keep-alive,这个头就相当于客户端告诉服务端,服务端你执行完成请求之后,是关闭连接还是保持连接,保持连接就意味着在保持连接期间,只能由客户端主动断开连接。还有一个keep-alive的头,设置的值就代表了服务端保持连接保持多久。

HTTP默认的Connection值为close,那么就意味着关闭请求的一方几乎都会是由服务端这边发起的。那么这个服务端产生TIME_WAIT过多的情况就很正常了

虽然HTTP默认Connection值为close,但是,现在的浏览器发送请求的时候一般都会设置Connection为keep-alive了。所以,也有人说,现在没有必要通过调整参数来使TIME_WAIT降低了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/895093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式 Linux 音视频+ AI 实战项目】瑞芯微 Rockchip 系列 RK3588-基于深度学习的人脸门禁+ IPC 智能安防监控系统

前言 本文主要介绍我最近开发的一个个人实战项目,“基于深度学习的人脸门禁 IPC 智能安防监控系统”,全程满帧流畅运行。这个项目我目前全网搜了一圈,还没发现有相关类型的开源项目。这个项目只要稍微改进下,就可以变成市面上目前…

java: framework from BLL、DAL、IDAL、MODEL、Factory using oracle

oracel 21c sql: -- 创建 School 表 CREATE TABLE School (SchoolId CHAR(5) NOT NULL,SchoolName NVARCHAR2(500) NOT NULL,SchoolTelNo VARCHAR2(8) NULL,PRIMARY KEY (SchoolId) );CREATE OR REPLACE PROCEDURE addschool(p_school_id IN CHAR,p_school_name IN NVARCHAR2,p…

1.攻防世界 baby_web

题目描述这里有提示,初始页面 进入题目页面如下 很简洁的页面只有一行HELLO WORLD ctrlu查看了源码也没有信息 用burp suite抓包,并发送到重放器 根据提示(初始页面)修改访问index.php文件 index.php index.php 是一种常见的…

什么是三层交换技术?与二层有什么区别?

什么是三层交换技术?让你的网络飞起来! 一. 什么是三层交换技术?二. 工作原理三. 优点四. 应用场景五. 总结 前言 点个免费的赞和关注,有错误的地方请指出,看个人主页有惊喜。 作者:神的孩子都在歌唱 大家好…

【机器学习】数据预处理之数据归一化

数据预处理之数据归一化 一、摘要二、数据归一化概念三、数据归一化实现方法3.1 最值归一化方法3.2 均值方差归一化方法 一、摘要 本文主要讲述了数据归一化(Feature Scaling)的重要性及其方法。首先通过肿瘤大小和发现时间的例子,说明了不同…

【AIGC】语言模型的发展历程:从统计方法到大规模预训练模型的演化

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯语言模型的发展历程:从统计方法到大规模预训练模型的演化1 统计语言模型(Statistical Language Model, SLM):统…

Java面试题2025-JVM

JVM 1.为什么需要JVM,不要JVM可以吗? 1.JVM可以帮助我们屏蔽底层的操作系统 一次编译,到处运行 2.JVM可以运行Class文件 2.JDK,JRE以及JVM的关系 3.我们的编译器到底干了什么事? 仅仅是将我们的 .java 文件转换成了…

Deepseek的MLA技术原理介绍

DeepSeek的MLA(Multi-head Latent Attention)技术是一种创新的注意力机制,旨在优化Transformer模型的计算效率和内存使用,同时保持模型性能。以下是MLA技术的详细原理和特点: 1. 核心思想 MLA技术通过低秩联合压缩技术,将多个注意力头的键(Key)和值(Value)映射到一…

QML初识

目录 一、关于QML 二、布局定位和锚点 1.布局定位 2.锚点详解 三、数据绑定 1.基本概念 2.绑定方法 3.数据模型绑定 四、附加属性及信号 1.附加属性 2.信号 一、关于QML QML是Qt框架中的一种声明式编程语言,用于描述用户界面的外观和行为;Qu…

java项目之美妆产品进销存管理系统的设计与开发源码(ssm+mysql)

项目简介 美妆产品进销存管理系统的设计与开发实现了以下功能: 美妆产品进销存管理系统的设计与开发的主要使用者分为管理员登录后修改个人的密码。产品分类管理中,对公司内的所有产品分类进行录入,也可以对产品分类进行修改和删除。产品管…

Python(pymysql包)操作MySQL【增删改查】

下载pymysql: pip install pymysql 在MySQL中创建数据库:unicom create database unicom DEFAULT CHARSET utf8 COLLATE utf8_general_ci;use unicom; 在unicom中创建数据表:admin create table admin(id int not null primary key auto_i…

HTTP无状态的概念以及对后端服务的设计会产生的影响

HTTP无状态(Statelessness) 是指每个HTTP请求都是独立的,服务器不会记住或依赖于前一个请求的任何信息。每次请求的处理都与其他请求没有直接关系。也就是说,服务器在处理请求时,不会存储关于客户端状态的信息。 一、HTTP无状态的具体含义 ①每个请求独立:每个请求包含了…

操作系统—进程与线程

补充知识 PSW程序状态字寄存器PC程序计数器:存放下一条指令的地址IR指令寄存器:存放当前正在执行的指令通用寄存器:存放其他一些必要信息 进程 进程:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位…

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之上传头像和新增收货地址

🧸安清h:个人主页 🎥个人专栏:【Spring篇】【计算机网络】【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🚀1.上传头像 -持久…

Windows下ollama详细安装指南

文章目录 1、Windows下ollama详细安装指南1.1、ollama介绍1.2、系统要求1.3、下载安装程序1.4、安装步骤1.5、验证安装1.6、环境变量配置1.7、模型选择与安装【deepseek 示例】1.7.1、拉取并运行模型1.7.2、进阶使用技巧 1、Windows下ollama详细安装指南 1.1、ollama介绍 olla…

10vue3实战-----实现登录的基本功能

10vue3实战-----实现登录的基本功能 1.基本页面的搭建2.账号登录的验证规则配置3.点击登录按钮4.表单的校验5.账号的登录逻辑和登录状态保存6.定义IAccount对象类型 1.基本页面的搭建 大概需要搭建成这样子的页面: 具体的搭建界面就不多讲。各个项目都有自己的登录界面&#…

vue3 点击图标从相册选择二维码图片,并使用jsqr解析二维码(含crypto-js加密解密过程)

vue3 点击图标从相册选择二维码图片,并使用jsqr解析二维码(含crypto-js加密解密过程) 1.安装 jsqr 和 crypto-js npm install -d jsqr npm install crypto-js2.在util目录下新建encryptionHelper.js文件,写加密解密方法。 // e…

支持多种网络数据库格式的自动化转换工具——VisualXML

一、VisualXML软件介绍 对于DBC、ARXML……文件的编辑、修改等繁琐操作,WINDHILL风丘科技开发的总线设计工具——VisualXML,可轻松解决这一问题,提升工作效率。 VisualXML是一个强大且基于Excel表格生成多种网络数据库文件的转换工具&#…

【JVM详解四】执行引擎

一、概述 Java程序运行时,JVM会加载.class字节码文件,但是字节码并不能直接运行在操作系统之上,而JVM中的执行引擎就是负责将字节码转化为对应平台的机器码让CPU运行的组件。 执行引擎是JVM核心的组成部分之一。可以把JVM架构分成三部分&am…

mysql安装starting the server报错

win10家庭版无法启动服务的,先不要退出,返回上一栏,然后通过电脑搜索栏输入服务两个字,在里面找到mysql80,右键属性-登录,登录身份切换为本地系统就行了