TCP缓冲区和4次挥手调优

 

目录

如何修改TCP缓冲区才能兼顾并发数量与传输速度?

四次挥手性能调优

1,为什么建立连接是三次握手,而关闭连接需要四次挥手呢?

2.四次挥手的流程,注意5个状态 

 3.主动方优化

4,被动方调优

最后


如何修改TCP缓冲区才能兼顾并发数量与传输速度?

----------缓冲区动态调节功能-----------

①发送缓冲区自动调整(自动开启): net.ipv4.tcp_wmem = 4096(动态范围下限) 16384(初始默认值) 4194304(动态范围上限) 一旦发送出的数据被确认,而且没有新的数据要发送,就可以把发送缓冲区的内存释放掉

②接收缓冲区自动调整(通过设置net.ipv4.tcp_moderate_rcvbuf = 1开启): net.ipv4.tcp_rmem = 4096(动态范围下限) 87380(初始默认值) 6291456(动态范围上限) 可以依据空闲系统内存的数量来调节接收窗口。如果系统的空闲内存很多,就可以把缓冲区增大一些,这样传给对方的接收窗口也会变大,因而对方的发送速度就会通过增加飞行报文来提升。反之,内存紧张时就会缩小缓冲区,这虽然会减慢速度,但可以保证更多的并发连接正常工作。

③接收缓冲区判断内存空闲的方式: net.ipv4.tcp_mem = 88560 118080 177120 当 TCP 内存小于第 1 个值时,不需要进行自动调节; 在第 1 和第 2 个值之间时,内核开始调节接收缓冲区的大小; 大于第 3 个值时,内核不再为 TCP 分配新内存,此时新连接是无法建立的。 ④带宽时延积的衡量方式:对网络时延多次取样计算平均值,再乘以带宽。


四次挥手性能调优

1,为什么建立连接是三次握手,而关闭连接需要四次挥手呢?

这是因为 TCP 不允许连接处于半打开状态时就单向传输数据,所以在三次握手建立连接时,服务器会把 ACK 和 SYN 放在一起发给客户端,其中,ACK 用来打开客户端的发送通道,SYN 用来打开服务器的发送通道。这样,原本的四次握手就降为三次握手了

2.四次挥手的流程,注意5个状态 

 3.主动方优化

关闭连接有多种方式,比如进程异常退出时,针对它打开的连接,内核就会发送 RST 报文来关闭。RST 的全称是 Reset 复位的意思,它可以不走四次挥手强行关闭连接,但当报文延迟或者重复传输时,这种方式会导致数据错乱,所以这是不得已而为之的关闭连接方案.

安全关闭连接的方式必须通过四次挥手,它由进程调用 close 或者 shutdown 函数发起,这二者都会向对方发送 FIN 报文(shutdown 参数须传入 SHUT_WR 或者 SHUT_RDWR 才会发送 FIN),区别在于 close 调用后,哪怕对方在半关闭状态下发送的数据到达主动方,进程也无法接收。

此时,这个连接叫做孤儿连接,如果你用 netstat -p 命令,会发现连接对应的进程名为空。而 shutdown 函数调用后,即使连接进入了 FIN_WAIT1 或者 FIN_WAIT2 状态,它也不是孤儿连接,进程仍然可以继续接收数据。 

当连接收到 ACK 进入 FIN_WAIT2 状态后,就表示主动方的发送通道已经关闭,接下来将等待对方发送 FIN 报文,关闭对方的发送通道。这时,如果连接是用 shutdown 函数关闭的,连接可以一直处于 FIN_WAIT2 状态。但对于 close 函数关闭的孤儿连接,这个状态不可以持续太久,默认是60秒.这里的60秒和我们TIME_WAIT 状态的60秒一样.这是因为这两个状态都需要保持 2MSL 时长。MSL 全称是 Maximum Segment Lifetime,它定义了一个报文在网络中的最长生存时间(报文每经过一次路由器的转发,IP 头部的 TTL 字段就会减 1,减到 0 时报文就被丢弃,这就限制了报文的最长存活时间)。

四次挥手的主动方,为了应对丢包,允许在 tcp_orphan_retries 次数内重发 FIN 报文。当收到 ACK 报文,连接就进入了 FIN_WAIT2 状态,此时系统的行为依赖这是否为孤儿连接。

如果这是 close 函数关闭的孤儿连接,那么在 tcp_fin_timeout 秒内没有收到对方的 FIN 报文,连接就直接关闭,反之 shutdown 函数关闭的连接则不受此限制。毕竟孤儿连接可能在重发次数内存在数分钟之久,为了应对孤儿连接占用太多的资源,tcp_max_orphans 定义了最大孤儿连接的数量,超过时连接就会直接释放。

当接收到 FIN 报文,并返回 ACK 后,主动方的连接进入 TIME_WAIT 状态。这一状态会持续 1 分钟,为了防止 TIME_WAIT 状态占用太多的资源,tcp_max_tw_buckets 定义了最大数量,超过时连接也会直接释放。当 TIME_WAIT 状态过多时,还可以通过设置 tcp_tw_reuse 和tcp_timestamps 为 1 ,将 TIME_WAIT 状态的端口复用于作为客户端的新连接。

4,被动方调优

被动关闭的连接方应对非常简单,它在回复 ACK 后就进入了 CLOSE_WAIT 状态,等待进程调用 close 函数关闭连接。因此,出现大量 CLOSE_WAIT 状态的连接时,应当从应用程序中找问题。当被动方发送 FIN 报文后,连接就进入 LAST_ACK 状态,在未等来 ACK 时,会在 tcp_orphan_retries 参数的控制下重发 FIN 报文。需要你注意的是,如果被动方迅速调用 close 函数,那么被动方的 ACK 和 FIN 有可能在一个报文中发送,这样看起来,四次挥手会变成三次挥手,这只是一种特殊情况,不用在意。

最后

 接下来,双方在等待 ACK 报文的过程中,都等来了 FIN 报文。这是一种新情况,所以连接会进入一种叫做 CLOSING 的新状态,它替代了 FIN_WAIT2 状态。此时,内核回复 ACK 确认对方发送通道的关闭,仅己方的 FIN 报文对应的 ACK 还没有收到。所以,CLOSING 状态与 LAST_ACK 状态下的连接很相似,它会在适时重发 FIN 报文的情况下最终关闭

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

APP外包开发中的H5框架

在开发APP的技术中,除了原生开发外也可以使用H5框架来开发。原生开发的特点是质量高,用户体验更好,但成本高,适用于对质量要求高的APP项目。H5框架的特点是通用性较强,对开发人员的要求相对较低,成本也低&a…

【运维】 第02讲(上):企业 Nginx 高性能优化配置实战总结

本课时讲解关于 Nginx 配置优化的内容,相信对于 Nginx 你一定并不陌生,它是一款轻量级的开源 Web 服务及代理程序。在 Nginx 出现之前市场上主流两款 Web 服务,一款是 Windows 系统上的 IIS,另外一款是 Linux 系统上的 Apache。而…

新手如何自学PostgreSQL(PG)

如果你是一个新手,想要自学PostgreSQL,下面是一些步骤和资源,可以帮助你入门: ①了解数据库基础知识:在开始学习PostgreSQL之前,建议你先了解一些数据库的基础概念和术语,例如表、列、行、SQL查…

【统计函数3】——excel常见函数

相关数据资料来源于网易 函数一览: rank、rand、randbetween、floor、int rank函数: 求某单元格在某区域内的排名 RANK(数值,引用区域,降序0/升序1)范围多指定: 分开的范围之间可用逗号隔开,最后再用一个小括号括起来。F4可以快速锁定行和列。…

Android中线程池

一、线程池的优点 说到线程池的优点就要先说一下不用线程池的坏处 在早些年开发都是直接new Thread()直接创建线程,倘若有N个异步就要创建N个线程,这会导致线程的频繁创建和销毁线程不可控,每个线程都各自执行,内存资源竞争激烈&…

STM32定时器中断的使用示例

STM32定时器中断的使用示例 前言硬件和软件cubemx使能定时器中断中断服务函数案例输出结果 前言 上一篇博客实现了定时器输出pwm,这篇接着上次的工程,在上次的工程上做简单的配置即可 硬件和软件 硬件使用的是stm32h750vbt6;软件用到了stm…

微服务系列文章 之 Nginx状态监控日志分析详解

1、Nginx状态监控 Nginx提供了一个内置的状态信息监控页面可用于监控Nginx的整体访问情况,这个功能由ngx_http_stub_status_module模块进行实现。 使用nginx -V 2>&1 | grep -o with-http_stub_status_module命令检测当前Nginx是否有status功能&#xff0c…

JAVA - 内存管理

目录 内存管理是什么 JVM内存区域组成 程序计数器PC java虚拟机栈 本地方法栈 JAVA堆 方法区 常量池 运行时常量池 内存管理是什么 Java的内存管理就是对象的分配和释放问题 分配 :内存的分配由程序完成的,程序员通过关键字new 为每个对象申请…

【iOS】内存管理五大区

参考博客:iOS内存管理学习第一篇-内存五大区 3.1 OC特性之 内存五大区域 1. 简述 程序要想执行,第一步就需要 被加载到内存中 内存五大区域: 栈区,堆区,静态区,常量区,代码段. 栈区(stack)由编译器自动分配并释放,存放…

React 安装 报错“Modal不能用作jsx组件”

提示 :‘Modal’ cannot be used as a JSX component. 原因:可能导致是类似antd组件报错 要确认react ts 版本是否适配 解决方法: 第一步:查看代码中的 package.json 文件 查看 typescript 与 types/react 第二步:查…

Shuffle简单理解

map的结果本身是无序的,但是map输出的结果有序 mapper和reduce是不同的机器,进行了网络传输,所以存在数据拷贝 第二次排序,是将每个reduce对应的task进行排序,然后再进入reduce maptask运行结束,每个mask块…

详解Windows安装分布式版本控制系统git

文章目录 前言下载安装相关链接 前言 git是一个分布式版本控制软件,最初由Linux创作者Linus Torvalds创作,并于2015年以GPL许可协议发布。git易于学习,占用空间小,性能却快如闪电,可以快速、 高效的管理从小到大的项目…

Java设计模式-责任链(Chain of Responsibility)模式

介绍 Java责任链(Chain of Responsibility)设计模式是指很多处理对象构成一个链,链中前一个对象指向后一个对象。请求在链中传递,一个请求可以被一个或者多个对象处理。调用方(即客户端)不知道请求会被链中…

DT灯光基础(辉光 雾 阴影 渲染选项)

点光源 不能宣染,换个版本。不能正常预览 聚光灯 t 手柄 挡光版 平行光阴影 光线追踪阴影 没有看见阴影 灯光使用贴图 环境光 不进行渲染物体 不渲染阴影 接收阴影 不反射 可以看到反射 没有反射了 灯光链接 取消灯照 灯光雾 辉光 变化不明显

瑞芯微|如何让拥有双网口的Linux设备实现数据包转发?

本文主要讲解如何,解决基于3568实现双网口互通问题。 一、组网 如下图所示: rk3568自带2个千兆以太口,对应网卡名称为:eth0、eth1pc1和pc2分别连接这2个网口pc1与eth0连接,网段:192.168.30.0pc2与eth1连…

PostgreSQL 的就业前景如何?

PostgreSQL的就业前景非常广阔,它是一种功能强大、可靠且开源的关系型数据库管理系统。以下是说明PostgreSQL就业前景的几个关键点: 1.高需求:随着企业和组织对数据存储和管理的需求不断增长,对数据库专业人员的需求也在持续上升…

喜讯!旭帆科技成功入驻“科大硅谷”!

2023年7月,安徽旭帆信息科技有限公司(以下简称“旭帆科技”)成功入驻“科大硅谷”,成为合肥城市发展新引擎、科创生态集群企业队伍中的一员。 “科大硅谷”项目建设总投资约75.82亿,共计17.37平方公里,是聚…

idea手动导入了包但编译运行还是报找不到xxx.jar包的问题

1、先把jar包放目录下并add as libary 2、在pom.xml中加入 <!--添加的本地的外部jar包依赖--><dependency><!--groupId、artifactId、version为自定义&#xff0c;groupId与artifactId但是不能重名--><groupId>JNative</groupId><artifactId…

如何设计光场2.0(聚焦型光场相机)系统参数

1. 系统参数设计 目前的硬件系统的现状&#xff1a;主透镜50mm&#xff0c;MLA&#xff1a;15*15&#xff0c;d0.5mm&#xff0c;f15mm&#xff0c;s4.8um 开普勒型光场系统&#xff1a; 首先我们需要确定系统的M&#xff0c;M参数表示单个位置的点能被多少个小微透镜成像&am…

分享一个唯美雪花界面

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>雪</title><meta name"viewport" content"widthdevice-width, initial-scale1&…