TCP 协议的 time_wait 超时时间

优质博文:IT-BLOG-CN

灵感来源在这里插入图片描述

Time_Wait 产生的时机

TCP四次挥手的流程
在这里插入图片描述
如上所知:客户端在收到服务端第三次FIN挥手后,就会进入TIME_WAIT状态,开启时长为2MSL的定时器。
【1】MSLMaximum Segment Lifetime报文最大生存时间,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为TCP报文是基于IP协议的,而IP头中有一个TTL字段,是IP数据报可以经过的最大路由数,每经过一个处理他的路由器值就会减1,当此值为0则数据报将会被丢弃,同时发送ICMP通知源主机;

MSLTTL的区别: MSL单位是时间,TTL是经过路由跳数。所以MSL应该大于等于TTL消耗为0的时间,以确保报文已被自然消亡。

【2】2MSL的时间是从客户端接收到第三次握手的FIN后发送ACK开始计时的;

如果在TIME-WAIT时间内,因为客户端的ACK没有传输到服务端,客户端又收到了服务端重发的FIN报文,那么2MSL时间将重新计时。

【3】Linux系统停留在TIME_WAIT的时间为固定的30秒。这个数值是硬编码在内核中的,也就是说除非你重新编译内核,否则没法修改它;

#define TCP_TIMEWAIT_LEN (60*HZ)

TTL的值一般为64MSL一般为30s,意味着Linux数据报文经过64个路由器时间不会超过30s,如果超过了则认为报文已经消息在网络中。

【4】客户端在收到服务端重传的FIN报文时,TIME_WAIT状态的等待时间会重置回2MSL

2MSL解释:网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又向对方发送响应,所以一来一回就是2MSL时间。

如果被动关闭方Server没有收到断开连接的ACK报文,就会触发超时重发FIN报文,另一方Client接收到FIN后,会重发ACK给被动关闭方,一来一回正好2MSL

主动发起关闭连接的一方才会有TIME-WAIT状态。

为什么需要 TIME- WAIT状态

【1】确保被动关闭方已经关闭了连接: 当主动关闭方发出最后的ACK后,如果由于某种异常导致报文丢失,被动方没有收到最后的ACK报文会一直处于LAST-ACK状态,无法进入CLOSED状态。

假设主动关闭方跳过TIME_WAIT状态或者处于TIME_WAIT状态很短的时间后进入CLOSED状态,此时主动关闭方如果使用相同的源端口,发起SYN连接请求,被动关闭方由于还处于LAST_ACK状态,收到SYN包,此时就会回复RST包,导致新连接无法正常建立起来。
在这里插入图片描述
【2】新的TCP连接被建立起来了,延迟包可能干扰新的连接: 当使用原来的五元组来建立新的TCP连接,如果上一次连接还有数据报文,由于网络拥塞等原因,在新连接建立后才到达(且序列号一致),此时就会干扰到新的连接了,当然出现这种问题的概率比较低。
在这里插入图片描述

TIME_WAIT 资源使用情况

【1】查询方式: 通常在业务中可以使用netstat命令来查看系统的网络连接状态:

// 查看当前所有连接的状态,包括 TIME_WAIT 状态
netstat -an// 查看指定 IP 地址和端口的连接状态
netstat -an | grep [IP]:[port]// 查看所有状态为 TIME_WAIT 的连接
netstat -an | grep TIME_WAIT// 查看所有 TIME_WAIT 状态的连接并统计数量
netstat -an | grep TIME_WAIT | wc -l

TCP协议中,客户端通常会使用一个随机的端口号来与服务器建立连接。每一个TIME_WAIT状态,都会占用一个「本地端口」,上限为65535。本地端会等待两倍的MSLMaximum Segment Lifetime,最大报文生存时间)的时间,这个时间通常为几分钟,之后才会释放该端口。如果这个时候新连接使用了这个端口,就可能出现数据混乱或者安全问题。

【2】TIME_WAIT占用系统资源: 整个系统建立连接时占用的资源:
☑️ 建立TCP连接时,客户端需要指定目标服务器的IP地址和端口号,这个过程可能需要进行DNS查询和端口扫描等操作,这些操作可能会消耗一些资源
☑️ 短时间内频繁建立和关闭TCP连接TIME_WAIT状态连接会占用系统的端口号和内存等资源,从而影响系统的性能
☑️ 随机端口号范围小了,引发端口号竞争, 临时端口号的竞争可能会导致TCP连接建立失败或者连接超时

【3】TIME_WAIT与连接池的关系: 使用连接池可以有效地减少连接的创建和关闭次数,从而减少TIME_WAIT状态下的连接数量。同时,连接池还可以通过控制连接数量、超时时间等参数,进一步优化连接的使用效率。

但是,如果连接池中存在大量的TIME_WAIT状态下的连接,那么连接池的效率可能会受到影响,从而导致系统性能下降。因此,需要通过调整连接池的参数,如最大连接数量、连接超时时间等,来避免TIME_WAIT问题的影响。

【4】TIME_WAITTCP_SYNC

TCP_SYNC 攻击者利用伪造的SYN报文不断向受害者的服务器发送连接请求,但是连接并不能完成三次握手,最终服务器会不断创建半连接,引发系统崩溃。

攻击中,攻击者会大量发送伪造的SYN报文,但不回应服务器的SYN+ACK报文,从而使服务器不断等待客户端的ACK报文,最终导致服务器的连接队列被占满,无法响应正常连接请求。

TIME_WAITTCP_SYNC本身没有联系,只是半连接在一定时间后会变成TIME_WAIT状态,就可以观测到TIME_WAIT数量增多。

TIME-WAIT状态的危害:
【1】占用系统资源: 如果服务端主动发起关闭连接方的TIME-WAIT状态过多。比如文件描述符、内存资源、CPU资源、线程资源等;
【2】端口资源: 如果客户端主动发起关闭连接方的TIME-WAIT状态过多。端口资源有限,一般可以开启的端口为32768~61000,也可以通过net.ipv4.ip.local_port_range参数指定范围。只要连接的是不同的服务器,端口还是可以重复使用的;

TIME-WAIT 优化

【1】net.ipv4.tcp_tw_reusetcp_timestampsnet.ipv4.tcp_tw_reuse = 1表示开启重用,允许将TIME-WAIT socket重新用于新的TCP连接。默认为0,表示关闭。

net.ipv4.tcp_tw_reuse = 1

Linux内核参数开启后,则可以复用处于TIME_WAITsocket为新的连接所用。

.tcp_tw_reuse功能只能为客户端为发起方,因为开启该功能,在调用connect()函数时,内核会随机找一个time_wait状态超过1s的连接给新的连接复用。

使用该选项的前提需要打开对TCP时间戳的支持,即:默认为1

net.ipv4.tcp.timestamps=1

这个时间戳的字段是在TCP头部的选项里,它由一共8个字节表示时间戳,其中第一个4字节字段用来保存发送该数据包的时间,第二个4字节字段用来保存最近一次接收对方发送到达数据的时间。

由于引入了时间戳,前面提到的2MSL问题就不存在了,因为重复的数据包会因为时间戳过期被自然丢弃。

【2】net.ipv4.tcp_max_tw_buckets设置上限值,默认值为18000,当系统中处于TIME_WAIT的连接一旦超过这个值时,系统就会将后端的TIME_WAIT连接状态重置,比较暴力。
【3】TCP协议栈有个keepalive的属性,可以主动探测socket是否可用,不过这个属性的默认值很大。
全局设置可更改/etc/sysctl.conf,加上:

net.ipv4.tcp_keepalive_intvl = 20 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.tcp_keepalive_time = 60

在程序中设置如下:

int keepAlive = 1; // 开启keepalive属性 int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测 
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.

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

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

相关文章

root 用户和权限

目录 1. 超级管理员 root 2. 切换用户 Switch User 2.1 普通用户切换到 root 用户 2.2 root 用户切换到普通用户 3. sudo 命令 3.1 配置认证 无论是 Windows,MacOS,Linux 均采用多用户的管理模式管理权限; 1. 超级管理员 root 在 Li…

2年社招冲击字节,一天三面斩获offer

在工作满两年的时间选择了求变,带着运气和实力以社招身份重新看今天的互联网环境,从结果看还是复合预期的。 整个面试的流程还挺快的。周中让招聘专员给投递了简历。问什么时候面试,申请了一个周日,直接安排三面。下周周中就开启…

C#中的wpf基础

在WPF中,Grid 是一种非常强大的布局控件,用于创建网格布局。它允许你将界面划分为行和列,并将控件放置在这些行和列中。 以下是一些关键点和示例,帮助你理解 WPF 中的 Grid: 基本属性 RowDefinitions:定义…

[MIT6.5840]MapReduce

MapReduce Lab 地址 https://pdos.csail.mit.edu/6.824/labs/lab-mr.html 论文地址 https://static.googleusercontent.com/media/research.google.com/zh-CN//archive/mapreduce-osdi04.pdf 工作原理 简单来讲,MapReduce是一种分布式框架,可以用来处理…

windows 安装docker桌面版

下载 下载两个: git桌面版 docker desktop 启动docker 执行安装文件,启动 更新wsl2 假如报错,会提示失败原因。 win10会提示跳转到: https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4—download-the-l…

从0到1,AI我来了- (4)AI图片识别的理论知识-II

上篇文章,我们理解了我们程序的神经网络设计,这篇我们继续,把训练迭代过程分析一下,完成这两篇文章,下面问题,应该能回答了。 一张图片,如何被计算机读懂?pytorch 封装的网络&#…

DP 整数拆分不同的二叉搜索树 DAY21

整数拆分? 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。示例 2: 输入: n 10 输…

全国区块链职业技能大赛样题第9套前端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 登录 ​ 用户管理

又一成就,Pencils Protocol单链 TVL 突破 3 亿美元

Pencils Protocol 是 Scroll 生态的原生项目,该项目以一站式收益聚合器和拍卖平台作为主要定位,在功能上,其集 Launchpad、资产统一聚合和分发、杠杆收益等功能于一体,旨在最大化用户的资产利用率。近日,Pencils Proto…

利用python自动化运维i脚本实现远程连接服务器并实现相应命令

目录 前言: 一.调用的python库介绍 二.在主机上安装好相应的库 2.1激活虚拟环境 三.代码实现以及解析 四.效果的实现 五.致谢 前言: 在当今快速发展的技术环境中,自动化运维已成为 IT 基础设施管理的关键组成部分。它不仅可以显著提…

Lua编程

文章目录 概述lua数据类型元表注意 闭包表现 实现 lua/c 接口编程skynet中调用层次虚拟栈C闭包注册表userdatalightuserdata 小结 概述 这次是skynet,需要一些lua/c相关的。写一篇博客,记录下。希望有所收获。 lua数据类型 boolean , number , string…

大模型算法面试题(十五)

本系列收纳各种大模型面试题及答案。 1、大模型LLM进行SFT如何对样本进行优化 大模型LLM(Language Model,语言模型)进行SFT(Structured Fine-Tuning,结构化微调)时,对样本的优化是提升模型性能…

Linux源码阅读笔记16-文件系统关联及字符设备操作

文件系统关联 设备文件都是由标准函数处理,类似普通文件。设备文件也是通过虚拟文件系统来管理的,和普通文件都是通过完全相同的接口访问的。 inode中设备文件的成员数据 虚拟文件系统每个文件都关联到一个inode,用于管理文件的属性。源码如…

【Go - context 速览,场景与用法】

作用 context字面意思上下文,用于关联管理上下文,具体有如下几个作用 取消信号传递:可以用来传递取消信号,让一个正在执行的函数知道它应该提前终止。超时控制:可以设定一个超时时间,自动取消超过执行时间…

Swift学习入门,新手小白看过来

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。 😊 座右铭:不…

(十三)Spring教程——依赖注入之工厂方法注入

1.工厂方法注入 工厂方法是在应用中被经常使用的设计模式,它也是控制反转和单例设计思想的主要实现方法。由于Spring IoC容器以框架的方式提供工厂方法的功能,并以透明的方式开放给开发者,所以很少需要手工编写基于工厂方法的类。正是因为工厂…

如何从网站获取表格数据

1.手动复制粘贴 最简单的方法是直接在网页上手动选择表格内容,然后复制粘贴到Excel或其他表格处理软件中。这种方法适用于表格较小且不经常更新的情况。 2.使用浏览器插件 有许多浏览器插件可以帮助从网页中提取表格数据,例如: -TableCapt…

SSRF过滤攻击

SSRF绕过: 靶场地址:重庆橙子科技SSRF靶场 这个是毫无过滤的直接读取,但是一般网站会设置有对SSRF的过滤,比如将IP地址过滤。 下面是常用的绕过方式: 1.环回地址绕过 http://127.0.0.1/flag.php http://017700…

相机怎么选(不推荐,只分析)

title: 相机怎么选 tags: [相机, 单反相机] categories: [其他, 相机] 最近准备购买,相机怎么选,我去搜索了许多文章,整理了一篇小白挑选技术篇,供大家参考。 分类 胶片相机 需要装入胶卷才能使用的相机,拍照后可直…

永磁同步电机无速度算法--非线性磁链观测器

非线性磁链观测器顾名思义观测器的状态变量为磁链值,观测的磁链值收敛于电机实际磁链值,观测器收敛。非线性是由于观测器存在sin和cos项,所以是非线性观测器 一、原理介绍 表贴式永磁同步电机αβ轴电压方程: 将公式变换 定义状态变量X: 定…