【Linux网络编程】你了解TIME_WAIT状态吗?

2023-05-16

        在Linux网络编程中,我相信大多数人觉得最难理解的就是TCP中的TIME_WAIT状态了吧,那么TIME_WAIT的概念到底是什么,有几个类型呢,以及在面试中经常会问到的TIME_WAIT状态产生的原因,危害,如何避免,在这篇文章中我会带着大家一起详细解读一下。

1)什么是TIME_WAIT状态

2)TIME_WAIT状态的类型

3)TIME_WAIT状态产生的原因

4)TIME_WAIT状态的危害

5)如何避免TIME_WAIT状态

什么是TIME_WAIT状态 

        从这幅状态图中可以看到,通信双方建立TCP连接后,在发生四次挥手之后,先发FIN标志位的一端就会进入time_wait状态,换句话说,主动关闭连接的一方就会进入TIME_WAIT状态。

        以下图为例,客户端主动关闭连接时,发送最后一个ACK后,然后会进入TIME_WAIT状态,再停留2个MSL时间(后有MSL的解释),进入CLOSED状态,所以我们可以粗略地理解成在断开连接后主动断开连接的那一方就会进入一个等待状态,过了一定时间后,再真正的关闭,这所谓的状态也就是TIME_WAIT状态,这其中所说的一定时间也就是2MSL(MSL:最长分节生命期maximum segment lifetime,这个状态会持续MSL时长的两倍,所以称为2MSL)。

TIME_WAIT状态的类型

Time_wait分为两类:主动型time_wait和被动型time_wait。

主动型:本机主动与其他服务器建立连接时的time_wait,这种情况下本机产生的随机端口号较多。

被动型:本机由于其他服务器主动连接过来后,产生的time_wait。这种情况下,本机ip对应开启的端口号相对固定。

TIME_WAIT状态产生的原因

TIME_WAIT状态存在的理由有两个:

1)可靠地实现TCP全双工连接的终止

由TCP状态变迁图可知,假设发起主动关闭的一方(client)最后发送的ACK在网络中丢失,由于TCP协议的重传机制,执行被动关闭的一方(server)将会重发其FIN,在该FIN到达client之前,client必须维护这条连接状态,也就说这条TCP连接所对应的资源(client方的local_ip,local_port)不能被立即释放或重新分配,直到另一方重发的FIN达到之后,client重发ACK后,经过2MSL时间周期没有再收到另一方的FIN之后,该TCP连接才能恢复初始的CLOSED状态。如果主动关闭一方不维护这样一个TIME_WAIT状态,那么当被动关闭一方重发的FIN到达时,主动关闭一方的TCP传输层会用RST包响应对方,这会被对方认为是有错误发生,然而这事实上只是正常的关闭连接过程,并非异常。

2)允许老的重复分节在网络中消逝

为理解存在TIME_WAIT状态的第二个理由,我们假设在12.106.32.254的1500端口和206.168.112.219的21端口之间有一个TCP连接。我们关闭这个连接,过一段时间后在相同的IP地址和端口之间建立另一个连接。后一个连接称为前一个连接的化身(incarnation),因为它们的IP地址和端口号都相同。TCP必须防止来自某个连接的老的重复分组在该连接已终止后再现,从而被误解成属于同一连接的某个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身。既然TIME_WAIT状态的持续时间是MSL的2倍,这就足以让某个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的应答最多存活MSL秒也被丢弃。通过实施这个规则,我们就能保证每成功建立一个TCP连接时,来自该连接先前化身的老的重复分组都已在网络中消逝了。

具体而言,local peer主动调用close后,此时的TCP连接进入TIME_WAIT状态,处于该状态下的TCP连接不能立即以同样的四元组建立新连接,即发起active close的那方占用的local port在TIME_WAIT期间不能再被重新分配。由于TIME_WAIT状态持续时间为2MSL,这样保证了旧TCP连接双工链路中的旧数据包均因过期(超过MSL)而消失,此后,就可以用相同的四元组建立一条新连接而不会发生前后两次连接数据错乱的情况。

TIME_WAIT状态的危害

不同Time_wait对系统性能的影响是不同的。

被动型time_wait一般由于被动建立链接产生的time_wait,这种情况下一般占用的端口号比较少,产生的time_wait数也很少。几乎可以忽略不计,对服务器性能几乎没有任何影响。

主动型time_wait对服务器的影响比较大。因为服务器可利用的端口号是有限的, 也就是说建立的连接数是有限的,一般都是有个阈值,超过这个阈值,就会无法建立链接,导致访问失败,如果占用达到服务器端口号极限,对服务器的性能就会产生影响。

假设处理完这100万的数据,就会产生500万次连接,一般机器的连接数上限是65533,如果每个TCP请求都得等60s才能断开,那么500万的请求肯定是无法承受的,就无法建立链接,导致很多请求发不出去 。

如何避免TIME_WAIT状态

首先服务器可以设置SO_REUSEADDR套接字选项来通知内核,如果端口忙,但TCP连接位于TIME_WAIT状态时可以重用端口。在一个非常有用的场景就是,如果你的服务器程序停止后想立即重启,而新的套接字依旧希望使用同一端口,此时SO_REUSEADDR选项就可以避免TIME_WAIT状态。

部分名词解释:

MSL(Maximum Segment Lifetime)最长分节生命期 每个TCP实现必须选择一个MSL。它是任何报文段被丢弃前在网络内的最长时间。这个时间是有限的,因为TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL时间。RFC 793指出MSL为2分钟,现实中常用30秒或1分钟。

参考:

《TCP+IP详解卷1:协议 原书第2版》

《Uinx网络编程》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux网络编程】你了解TIME_WAIT状态吗? 的相关文章

  • 51单片机-定时器(简易时钟的实现)

    文章目录 前言一 定时器的功能以及定时器的结构定时器的功能定时器的结构 二 定时器的控制工作模式寄存器TMOD控制寄存器TCON写代码来初始化定时器 三 定时器引发中断简易时钟主程序main c延时函数Delay c控制LCD162模块LC
  • 用于评估婴儿认知发展的IMU内嵌式玩具

    0 5岁是神经发育的敏感时期 xff0c 对身心健康至关重要的EF xff08 执行功能 Executive functions xff09 会在这个时期出现 在现代临床和研究实践中 xff0c 编码员通过手动标记视频中婴儿在使用玩具或社交
  • yolo+ocr集装箱字符识别(pytorch版本)

    前言 这个是我们 的大创项目 当我们拿到一份数据集 xff0c 首先就是要对整个项目有个较为清晰的认识 xff0c 整体的思路是什么 xff0c 难点在哪 xff0c 怎么部署和实现 1 整体的思路 xff1a 先通过目标检测网络 xff0
  • ROS话题通信实现发布接收以及vscode编译配置(五)C++版本

    在ROS中每一个功能点都是一个单独的进程 xff0c 每一个进程都是独立运行的 ROS是进程 xff08 也称为Nodes xff09 的分布式框架 因为这些进程甚至还可分布于不同主机 xff0c 不同主机协同工作 xff0c 从而分散计算
  • CMakeList

    目录 1 简介 2 常用命令 2 1 指定 cmake 的最小版本 2 2 设置项目名称 2 3 设置编译类型 2 4 指定编译包含的源文件 2 4 1 明确指定包含哪些源文件 2 4 2 搜索所有的 cpp 文件 2 4 3自定义搜索规则
  • 多旋翼飞行器设计与控制(二)—— 基本组成

    多旋翼飞行器设计与控制 xff08 二 xff09 基本组成 一 机架 1 机身 指标参数 xff1a 重量 xff1a 尽可能轻轴距 xff1a 外圈电机组成圆的直径材料 xff1a 冲碳纤维就完了布局 xff1a 2 起落架 作用 xf
  • 多旋翼飞行器设计与控制(六)—— 动态模型和参数测量

    多旋翼飞行器设计与控制 xff08 六 xff09 动态模型和参数测量 一 多旋翼控制模型 刚体运动学模型 跟质量与受力无关 xff0c 只研究位置 速度 姿态 角速度等参量 xff0c 常以质点为模型 刚体动力学模型 它与一般刚体动力学模
  • 多旋翼飞行器设计与控制(七)—— 传感器标定和测量模型

    多旋翼飞行器设计与控制 xff08 七 xff09 传感器标定和测量模型 一 三轴加速度计 三轴加速度计是一种惯性传感器 xff0c 能够测量物体的比力 xff0c 即去掉重力后的整体加速度或者单位质量上作用的非引力 当加速度计保持静止时
  • 【STM32】stm32通过地址操作寄存器

    stm32通过地址操作寄存器 0x01 stm32数据类型所占字节数0x02 如何查看寄存器地址 xff08 基地址 43 偏移地址 xff09 0x03 操作寄存器地址控制LED闪烁 xff08 代码 xff09 0x04 通过定义结构体
  • ARM裸机开发——启用SDRAM的按键中断控制灯实验

    写在前面 本文承接前文嵌入式系统学习 嵌入式系统 Linux环境搭建和LED灯闪烁实验 以S3C2440A作为开发平台 xff0c 以Linux中ARM Linux gcc交叉编译器作为编译环境进行学习 xff0c 由于本课程为单片机基础的
  • 二维vector

    span class token macro property span class token directive keyword include span span class token string lt iostream gt s
  • 13.request-session,验证码

    使用session使得请求变成一个对象 注意登录页面隐藏的参数 爬取古诗文登录页面 span class token keyword import span requests span class token keyword from sp
  • STM32-串口通信(串口的接收和发送)

    文章目录 STM32的串口通信一 STM32里的串口通信二 串口的发送和接收串口发送串口接收 三 串口在STM32中的配置四 串口接收的两种实现方式1 需要更改的地方2 查询RXNE标志位3 使用中断 总结 STM32的串口通信 本文在于记
  • quick sort(c++)以及k选取

    include lt iostream gt include lt vector gt using rank 61 int using namespace std int dash 61 0 int swap vector lt int g
  • STLINK CONNECTION ERROR 问题的解决

    打开STLINK UTILITY 连接芯片也连接不上 在settings里面 选择这个连接模式 xff0c 按下芯片复位键的同时 xff0c 点击连接 st link的灯闪烁红蓝相间的光表示连接成功 松开芯片reset xff0c 既连接成
  • 解决ros2安装出现的问题

    Cannot locate rosdep definition for python3 pytest 解决方法是输入弹幕命令 然后输入安装功能依赖的命令 如果有占用进程问题 xff0c 就重启 http t csdn cn WwqJa
  • conda activate 出错

    问题及解决办法 1 使用conda activate出错 在cmd中使用 conda bat activate 进入环境后在进行操作 2 conda install出错 xff0c 使用pip install 3 在cmd 中使用tenso
  • 树莓派4b 安装ubuntu20.04server和图形化界面遇到的问题

    树莓派安装图形界面参考教程 树莓派4b安装Ubuntu 18 04系统及图形桌面 树莓派4B安装 ubuntu20 04 amp VNC远程桌面 amp 安装ROS noetic 树莓派4b安装Ubuntu和ROS的完整爬坑记录 2021年
  • 【STM32】串口接收任意字符串

    目录 前言cube配置usart h xff1a usart cmain xff1a 效果 前言 之前写了一篇STM32hal库串口中断接收任意字符 实际上是不完美的 xff0c 他接收到换行符就完蛋了 花了点时间深入研究了一下hal库的串
  • 使用封装的axios发送请求

    使用封装的axios发送请求 1 src api api js 定义请求路由方法 span class token function import span URLS from span class token string 39 conf

随机推荐

  • STM32串口驱动

    首先了解串口通信的一些基本原理 xff1a 串口通信 xff1a 串口通信是指数据通过一条数据线 xff08 或者两条差分线 xff09 一位接着一位的传输出去 串口通信的优点是占用硬件资源少 xff0c 且传输距离较远 xff0c 缺点是
  • IIC 驱动OLED

    IIC总线可以驱动很多器件 xff0c 比较常见的有OLED EEPROM存储器 xff08 AT24C02 xff09 温度传感器 xff08 LM75A xff09 温湿度传感器 xff08 DHT11 xff09 等 有关IIC总线协
  • Stm32-使用TB6612驱动电机及编码器测速

    这里写目录标题 起因一 电机及编码器的参数二 硬件三 接线四 驱动电机1 TB6612电机驱动2 定时器的PWM模式驱动电机 五 编码器测速1 定时器的编码器接口模式2 定时器编码器模式测速的原理3 编码器模式的配置4 编码器模式相关代码5
  • CAN总线协议入门基础原理

    CAN 是 Controller Area Network 的缩写 xff08 以下称为 CAN xff09 xff0c 是 ISO 1 国际标准化的串行通信协议 CAN 通过 ISO11898 及 ISO11519 进行了标准化 xff0
  • SPI总线协议基本原理及相关配置

    单片机应用中 xff0c 最常用的通信协议主要有三个 xff0c 即USART IIC和SPI 关于前两个的介绍在之前文章学习过 xff0c 这次介绍一下第三个通信协议 SPI SPI Serial Peripheral Interface
  • 利用定时器的输出比较功能产生PWM驱动舵机

    一 定时器基本原理 首先我们来看一下ST官方给出的关于定时器的相关介绍 xff1a xff08 以STM32F103C8T6为例 xff09 STM32F103C8T6 含有 4 个 16 位定时器 xff0c 分别是一个高级定时器 TIM
  • ST-LINK固件升级

    关于st link固件升级注意的问题 在下载调试的过程中 xff0c 程序可能由于st link版本过旧而提示 command not supported 的错误 xff0c 这就要求我们升级st link固件才可以正常下载 但是在升级的过
  • 关于英伟达jetson nano的搭配双目摄像头跑ORB_SLAM2

    1 安装系统 按照商家给的资料安装 xff0c 将Ubuntu18 04LTS镜像拷贝到tf卡中 xff0c 插上jetson nano就可以安装了 2 系统设置 进入系统我先把系统语言设置为中文 xff0c 在右上角的设置中找到系统设置中
  • 双目摄像头(CSI-IMX219)的标定

    1 介绍 网上关于这类标定有挺多教程的 xff0c 但由于这个摄像头的特殊性 xff0c 所以不可能完全安装教程来走 目前来说有3种标定方法 xff1a ROS操作系统来标定 matlab标定 opencv标定 这三种方法我先试了用ROS来
  • 小学生学AD16(入门级别,看这篇就够了)

    1 软件安装 xff1a AD16的安装我就不多介绍了 xff0c csdn一搜一大把 要学一个软件 xff0c 那么软件安装是必经之路 xff0c 不要认为软件安装不重要 xff08 如果你的安装完之后桌面没快捷方式 xff0c 那么可以
  • Arduino串口绘图器双通道绘制

    Serial print val Serial print 34 34 Serial println muBiao 其实只用在两个变量之间加个 xff0c 就行了 参考网址 https www norwegiancreations com
  • 关于神舟笔记本TX8连副屏经常蓝屏的问题

    大概率是3060显卡驱动的问题 xff0c 可以试试重新安装显卡驱动 若还是不行就换个接口 xff0c 不要用hdim的接口 xff0c 那个是直接连3060的 换剩下两个的minidp接口其中一个 xff0c 第一个不要接 xff0c 那
  • 51单片机入门(小学生都能学会)

    序 xff1a 时隔一年 xff0c 我终于从二年级到三年级了 xff01 由于小学三年级这学期要学单片机 xff0c 故写下这篇笔记留下些什么 由于自己也是新手 xff0c 欢迎各位指出本文的各种错误 1 什么是51单片机 为什么要说这个
  • 解决使用WinScp连接Ubantu系统失败的问题---SSH无法连接

    起因 为了互通Linux系统和Windows系统的文件 xff0c 以更好的实现文件管理和资源共享 所以在查阅资料后 xff0c 使用WinScp xff0c WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端 它的
  • 小学生51系列之基础知识

    1 单片机的基本结构 说到基本结构 xff0c 就是指51单片机的硬件组成 51单片机由中央处理器CPU 储存器 定时器 I O端口 组成 其中储存器包含数据储存器 xff08 RAM xff09 和程序储存器 xff08 ROM xff0
  • ros 接入Livox Mid-70

    最近在研究3d避障激光 大疆Livox mid 70 xff0c 记录下接入过程 环境信息 xff1a Ubuntu 18 04 ros melodic 1 livox view 点云可视化 xff08 1 xff09 根据livox mi
  • ROS+opencv实践-二维码识别

    一 安装二维码识别的功能包 sudo apt span class token operator span get install ros span class token operator span melodic span class
  • C语言简单链表详细步骤详解

    43 链表 gt 小阿豪带你写链表 xff01 xff01 xff01 xff01 进入正文 span class token number 1 span 首先 xff0c 先想好自己要创建的链表格式以及最后的的显示界面 xff01 xff
  • 滚球控制系统详解 —— (附核心代码)

    最近练习了17年的国赛题 滚球控制系统 这里展示一下画圆 xff1a 观看完整视频点这里 接下来 xff0c 我来分享一下从搭整体结构到调试完的过程 这是我搭完的整体结构 xff08 缩小版 xff09 不管什么题 xff0c 结构部分还是
  • 【Linux网络编程】你了解TIME_WAIT状态吗?

    在Linux网络编程中 xff0c 我相信大多数人觉得最难理解的就是TCP中的TIME WAIT状态了吧 xff0c 那么TIME WAIT的概念到底是什么 xff0c 有几个类型呢 xff0c 以及在面试中经常会问到的TIME WAIT状