time_wait的快速回收和重用

2023-11-20

问题现象:PC与工控机之间通信,工控机发送SYN,PC一直回复FIN或者RST

问题解释:

1. time_wait产生的原因及作用

下面我们先来简单回顾一下TCP连接关闭动作:

tcp-close

在Linux环境下我们可以如下的方式来统计TCP连接的情况:

# netstat -nat | awk '/^tcp/ {++S[$NF]} END{for(a in S) print S[a], "\t", a}'
1        LAST_ACK
57       LISTEN
113953   ESTABLISHED
5        FIN_WAIT1
16       FIN_WAIT2
2        SYN_SENT
559      TIME_WAIT

上面我们看到,大部分的连接处于ESTABLISHED状态,目前比较少的处于TIME_WAIT状态,当前机器看起来还算是正常。

1) time_wait状态如何产生?

通过上面的变迁图,首先调用close()发起主动关闭的一方,在发送最后一个ACK之后会进入time_wait的状态,也就是说该发送方会保持2MSL时间之后才会回到初始状态。MSL指的是数据包在网络中的最大生存时间。在这样一个2MSL长的等待时间内,定义这个连接的四元组(客户端IP/Port,服务端IP/Port)不能被使用。

2)time_wait状态产生的原因

  • 为实现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包响应对方,这会被对方认为是有错误发生,然而这事实上这只是正常的关闭连接过程,并非异常。

确保被动关闭方收到ACK,连接正常关闭,且不因被动关闭方重传 FIN 影响下一个新连接。
  • 为使旧的数据包在网络因过期而消失

为说明这个问题,我们先假设TCP协议中不存在TIME_WAIT状态的限制,再假设当前有一条TCP连接(local_ip/local_port, remote_ip/remote_port),因某些原因,我们先关闭,接着很快以相同的四元组建立一条新连接。本文前面介绍过,TCP连接由四元组唯一标识,因此,在我们假设的情况中,TCP协议栈是无法区分前后两条TCP连接的不同的,在它看来,这根本就是同一条连接,中间先释放再建立连接的过程对其来说是感知不到的。这样就可能发生这样的情况:前一条TCP连接由local peer发送的

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

time_wait的快速回收和重用 的相关文章

  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 如何禁用 GNOME 桌面屏幕锁定? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何阻止 GNOME 桌面在几分钟空闲时间后锁定屏幕 我已经尝试过官方手册了在红帽 https access redhat com doc
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • 大多数 Linux 系统头文件与 C++ 兼容吗?

    大多数 Linux 系统头文件 API C 兼容吗 今天我试图做这样的事情 include
  • 我可以从命令行打印 html 文件(带有图像、css)吗?

    我想从脚本中打印带有图像的样式化 html 页面 谁能建议一个开源解决方案 我使用的是 Linux Ubuntu 8 04 但也对其他操作系统的解决方案感兴趣 你可以给html2ps http user it uu se jan html2
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute

随机推荐

  • java数据库实例_Java连接各种数据库的实例

    转自 CSDN此文中的代码主要列出连接数据库的关键代码 其他访问数据库代码省略 1 Oracle8 8i 9i数据库 thin模式 Class forName oracle jdbc driver OracleDriver newInsta
  • SQL修改表的列

    1 修改列的数据类型 要修改列的数据类型 请使用以下语句 ALTER TABLE table name ALTER COLUMN column name new data type size 新数据类型必须与旧数据类型兼容 否则 如果列具有
  • 程序员孔乙己

    软件园的格局自与别处是有所区别的 高矮不同的写字楼里 排列着整齐的格子间 放眼望去到处都是格子衫 双肩包 还有那稀疏的头发 园区每一栋大楼的入口处 都有一个超大前台 清洁的铮亮 散发着光芒 桌上零散的堆放着办公品 边上隔了一间咖啡馆 顺带售
  • background-position和雪碧图(CSS Sprites)用法

    background position属性使用频率非常高 大量的网站为了减少http请求数 会将大量的图片图片合成一张雪碧图 Sprite 来使用 雪碧图的使用就是通过控制background position属性值来确定图片呈现的位置 不
  • C++ StrCmpLogicalW文件名排序

    打开资源管理器 文件列表如下 搜索文件列表 include
  • Vue项目的部署(服务器)

    Vue项目的部署 服务器 前几天帮朋友写了一个可以动态查看地点温度的前端项目 目前已经部署上线了 访问链接点这里 服务器是朋友的 倒时候打不开会很正常 说不定又使用服务器玩大数据项目去了 效果图 图一 图二 当然 温度也都是实时跟新的 而且
  • MATLAB小技巧(20)矩阵分析--主成分回归

    MATLAB小技巧 20 矩阵分析 主成分回归 前言 一 MATLAB仿真 二 仿真结果 三 小结 前言 MATLAB进行图像处理相关的学习是非常友好的 可以从零开始 对基础的图像处理都已经有了封装好的许多可直接调用的函数 这个系列文章的话
  • maven的resources介绍

    在开发maven项目时 一般都会把配置文件放到src main resources目录下 针对这个目录 maven的resources对其进行单独的配置 resources配置一般如下
  • reactJS 干货(reactjs 史上最详细的解析干货)

    一 State和 Props state是状态机 应该包括 那些可能被组件的事件处理器改变并触发用户界面更新的数据 譬如需要对用户输入 服务器请求或者时间变化等作出响应 不应该包括 计算所得数据 React组件 在render 里使用pro
  • [echarts]echarts的canvas画布大小与容器大小不一致的解决方案

    div class wrap style width 300px height 300px div style width 100 height 100 div div 场景描述 如上所示布局 我的echarts容器大小设置的宽高都是100
  • 学习java笔记:实现家庭记账

    第一步 采用 Utility工具类 import java util Scanner Utility工具类 将不同的功能封装为方法 就是可以直接通过调用方法使用它的功能 而无需考虑具体的功能的实现 public class Utility
  • centos7-docker安装mysql5.7

    目录 1 docker 拉取mysql5 7镜像 2 创建实例并启动 3 查看容器是否启动成功 4 使用navicat 连接mysql 5 配置mysql 配置文件 6 重启容器 7 进入容器 1 docker 拉取mysql5 7镜像 d
  • 分布式集群管理—认知

    分布式集群管理 认知 分布式系统都是大规模机器的应用 所以需要管理大量的集群与机器 特别是云计算领域 部署管理系统 支持在大规模 多集群上进行分布式系统的部署 冷升级和热升级 进程的配置通过一个专门的配置中心进行推送 集群的配置中心 用于管
  • centos8安装rabbitmq(rpm包)

    1 先下载好rpm包 https pkgs org 1 检索rabbitmq下载对应centos8的版本 rabbitmq server 3 9 14 1 el8 noarch rpm 2 检索erlang下载对应centos8的版本 在官
  • delphi 后台截图

    function PrintWindow SourceWindow hwnd Destination hdc nFlags cardinal bool stdcall external user32 dll name PrintWindow
  • Windows slmgr.vbs 命令详解

    系统软件授权管理工具主要是用来查看系统的激活状态 以及密钥许可证等信息 在现在不在是使用 接参数了 现在 接参数 详解可以在cmd窗口输入slmgr vbs了解 常用参数 使用方式 再次提醒是使用 而不是 ipk 配合密钥使用 安装密钥 替
  • 基于google升级版c++代码规范指南

    有些团队所有成员写的代码都一致 10个人写的代码像1个人写的 正因为有代码规范 使得代码可读性强 方便代码review 利于后期维护 这体现了代码规范的重要性 接下来 在参考google的代码规范基础上 详细列举代码规范细节 1 文件描述
  • matlab 怎么使用function,Matlab怎么调用函数 自定义函数使用方法

    Matlab作为一款专业性极强的商业数学软件 将诸多的算法开发 统计分析 数据可视化功能融入其中 用户可以方便地调用需要的函数 建立数学模型 为了满足你工作的需要 还可以自行设置自己需要的函数 下面就跟小编了解下吧 类别 理科工具 大小 1
  • Unix Network Programming Episode 77

    gethostbyaddr Function The function gethostbyaddr takes a binary IPv4 address and tries to find the hostname correspondi
  • time_wait的快速回收和重用

    问题现象 PC与工控机之间通信 工控机发送SYN PC一直回复FIN或者RST 问题解释 1 time wait产生的原因及作用 下面我们先来简单回顾一下TCP连接关闭动作 在Linux环境下我们可以如下的方式来统计TCP连接的情况 net