四次挥手详解

文章目录

  • 一、四次挥手各状态
    • 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.rhkb.cn/news/15182.html

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

相关文章

LIMO:上海交大的工作 “少即是多” LLM 推理

25年2月来自上海交大、SII 和 GAIR 的论文“LIMO: Less is More for Reasoning”。 一个挑战是在大语言模型(LLM)中的复杂推理。虽然传统观点认为复杂的推理任务需要大量的训练数据(通常超过 100,000 个示例),但本文展…

51单片机之引脚图(详解)

8051单片机引脚分类与功能笔记 1. 电源引脚 VCC(第40脚):接入5V电源,为单片机提供工作电压。GND(第20脚):接地端,确保电路的电位参考点。 2.时钟引脚 XTAL1(第19脚&a…

基于yolov11的阿尔兹海默症严重程度检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv11的阿尔兹海默症严重程度检测系统是一种创新的医疗辅助工具,旨在通过先进的计算机视觉技术提高阿尔兹海默症的早期诊断和病情监测效率。阿尔兹海默症是一种渐进性的神经退行性疾病,通常表现为认知障碍、记忆丧失和语言障碍等症状…

TAPEX:通过神经SQL执行器学习的表格预训练

摘要 近年来,语言模型预训练的进展通过利用大规模非结构化文本数据取得了巨大成功。然而,由于缺乏大规模高质量的表格数据,在结构化表格数据上应用预训练仍然是一个挑战。本文提出了TAPEX,通过在一个合成语料库上学习神经SQL执行…

轻松理解CSS中的float浮动元素

1.float:left,float:right可以让元素脱离原始文档流,也就是所谓的“浮动”,可以理解为元素漂浮在原本所占位置的上空,意思是元素漂浮起来了,不占原始文档流的空间。但是,别的元素可以感知到浮动元素的存在&…

Vue与Konva:解锁Canvas绘图的无限可能

前言 在现代Web开发中,动态、交互式的图形界面已成为提升用户体验的关键要素。Vue.js,作为一款轻量级且高效的前端框架,凭借其响应式数据绑定和组件化开发模式,赢得了众多开发者的青睐。而当Vue.js邂逅Konva.js,两者结…

【Git】tortoisegit使用配置

1. 安装 首先下载小乌龟,下载地址:https://tortoisegit.org/download/, 可以顺便下载语言包! 安装时,默认安装就可以,一路next。也可以安装到指定目录中 目前已完成本地安装,接下来就需要与远程仓库建立连接&…

RuoYi-Vue-Oracle的oracle driver驱动配置问题ojdbc8-12.2.0.1.jar的解决

RuoYi-Vue-Oracle的oracle driver驱动配置问题ojdbc8-12.2.0.1.jar的解决 1、报错情况 下载:https://gitcode.com/yangzongzhuan/RuoYi-Vue-Oracle 用idea打开,启动: 日志有报错: 点右侧m图标,maven有以下报误 &…

C++ 设计模式 - 访问者模式

一:概述 访问者模式将作用于对象层次结构的操作封装为一个对象,并使其能够在不修改对象层次结构的情况下定义新的操作。 《设计模式:可复用面向对象软件的基础》一书中的访问者模式因两个原因而具有传奇色彩:一是因为它的复杂性&a…

DeepSeek在FPGA/IC开发中的创新应用与未来潜力

随着人工智能技术的飞速发展,以DeepSeek为代表的大语言模型(LLM)正在逐步渗透到传统硬件开发领域。在FPGA(现场可编程门阵列)和IC(集成电路)开发这一技术密集型行业中,DeepSeek凭借其…

ZU47DR 100G光纤 高性能板卡

简介 2347DR是一款最大可提供8路ADC接收和8路DAC发射通道的高性能板卡。板卡选用高性价比的Xilinx的Zynq UltraScale RFSoC系列中XCZU47DR-FFVE1156作为处理芯片(管脚可以兼容XCZU48DR-FFVE1156,主要差别在有无FEC(信道纠错编解码&#xff0…

详解SQLAlchemy的函数relationship

在 SQLAlchemy 中,relationship 是一个非常重要的函数,用于定义模型之间的关系。它用于在 ORM 层面上表示数据库表之间的关联关系(如 1 对 1、1 对多和多对多)。relationship 的主要作用是提供一个高级接口,用于在模型…

【Matlab优化算法-第14期】基于智能优化算法的VMD信号去噪项目实践

基于智能优化算法的VMD信号去噪项目实践 一、前言 在信号处理领域,噪声去除是一个关键问题,尤其是在处理含有高斯白噪声的复杂信号时。变分模态分解(VMD)作为一种新兴的信号分解方法,因其能够自适应地分解信号而受到…

C++ 继承(1)

1.继承概念 我们平时有时候在写多个有内容重复的类的时候会很麻烦 比如我要写Student Teacher Staff 这三个类 里面都要包含 sex name age成员变量 唯一不同的可能有一个成员变量 但是这三个成员变量我要写三遍 太麻烦了 有没有好的方式呢? 有的 就是继承…

生成式聊天机器人 -- 基于Pytorch + Global Attention + 双向 GRU 实现的SeqToSeq模型 -- 下

生成式聊天机器人 -- 基于Pytorch Global Attention 双向 GRU 实现的SeqToSeq模型 -- 下 训练Masked 损失单次训练过程迭代训练过程 测试贪心解码(Greedy decoding)算法实现对话函数 训练和测试模型完整代码 生成式聊天机器人 – 基于Pytorch Global Attention 双向 GRU 实…

《ARM64体系结构编程与实践》学习笔记(四)

MMU内存管理 1.MMU内存管理(armv8.6手册的D5章节),MMU包含快表TLB,TLB是对页表的部分缓存,页表是存放在内存里面的。 AArch64仅仅支持Long Descriptor的页表格式,AArch32支持两种页表格式Armv7-A Short De…

如何在Vscode中接入Deepseek

一、获取Deepseek APIKEY 首先,登录Deepseek官网的开放平台:DeepSeek 选择API开放平台,然后登录Deepseek后台。 点击左侧菜单栏“API keys”,并创建API key。 需要注意的是,生成API key复制保存到本地,丢失…

Docker 部署 MinIO | 国内阿里镜像

一、导读 Minio 是个基于 Golang 编写的开源对象存储套件,基于Apache License v2.0开源协议,虽然轻量,却拥有着不错的性能。它兼容亚马逊S3云存储服务接口。可以很简单的和其他应用结合使用,例如 NodeJS、Redis、MySQL等。 二、…

DeepSeek-R1 32B Windows+docker本地部署

最近国产大模型DeepSeek兴起,本地部署了一套deepseek同时集成Open WebUI界面,给大家出一期教程。 软件:Ollama、docker、Open WebUI 一、用Ollama下载模型 首先我们需要安装Ollama,它可以在本地运行和管理大模型。 到Ollama官网 https://ol…

TCP服务器与客户端搭建

一、思维导图 二、给代码添加链表 【server.c】 #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <fcntl.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.…