每个 TCP 连接都有发送缓冲区和接收缓冲区,发送缓冲区存已发送未确认数据和待发送数据,接收缓冲区存接收但是没有被上层服务读取的数据。

# cat /proc/net/sockstat
sockets: used 1885
TCP: inuse 537 orphan 0 tw 3 alloc 959 mem 10其中 mem 代表当前 TCP 连接占用的页面数

image-20250627153818521

# 扩大窗口协议,之前只有 16 位,最多标识 0-65535 字节,开启后最大可到 1GB(2^30)
sysctl net.ipv4.tcp_window_scaling
# 单个TCP连接的写缓冲区 分别代表 最小值,默认值,最大值,单位 Byte
# sysctl net.ipv4.tcp_wmem
net.ipv4.tcp_wmem = 4096        16384   4194304
# 单个TCP连接的读缓冲区 分别代表 最小值,默认值,最大值,单位 Byte
# sysctl net.ipv4.tcp_rmem
net.ipv4.tcp_rmem = 4096        87380   6291456

发送缓冲区的调节功能是自动开启的,而接收缓冲区则需要配置 tcp_moderate_rcvbuf 为 1 来开启调节功能

# 接收缓冲区自动调解功能
# sysctl net.ipv4.tcp_moderate_rcvbuf
net.ipv4.tcp_moderate_rcvbuf = 1
# Linux 对 TCP接收缓冲区的调解控制 分别代表 最小值,默认值,最大值 单位是页(page)
# sysctl net.ipv4.tcp_mem
net.ipv4.tcp_mem = 3087300      4116401  6174600# 获取页面大小 单位 Byte
# getconf PAGESIZE
4096

tcp_mem 是 Linux 判断系统内存是否紧张的依据,当 TCP 内存小于第 1 个值时,不需要进行自动调节;在第 1 和第 2 个值之间时,内核开始调节接收缓冲区的大小;大于第 3 个值时,内核不再为 TCP 分配新内存,此时新连接是无法建立的。

在高并发服务器中,为了兼顾网速与大量的并发连接,我们应当保证缓冲区的动态调整上限达到带宽时延积,而下限保持默认的 4K 不变即可。而对于内存紧张的服务而言,调低默认值是提高并发的有效手段。

同时,如果这是网络 IO 型服务器,那么,**调大 tcp_mem 的上限可以让 TCP 连接使用更多的系统内存,这有利于提升并发能力。**需要注意的是,tcp_wmem 和 tcp_rmem 的单位是字节,而 tcp_mem 的单位是页面大小。而且,千万不要在 socket 上直接设置 SO_SNDBUF (写缓冲区上限)或者 SO_RCVBUF(读缓冲区上限),这样会关闭缓冲区的动态调整功能。

在拥塞控制中,首先会进行慢开始(每收到1个 ACK 窗口就+1,相当于1个 RTT 翻一倍),慢开始指初始窗口比较小,而不是增长的慢,增长是指数级的,其实很快。这就涉及到初始拥塞窗口的大小:

# 查看当前连接的初始拥塞窗口
ss -nli | fgrep cwnd
# 修改初始拥塞窗口 10 MSS,如果网络特别好可以继续加大,有些高速 CDN 站点,甚至把初始拥塞窗口提升到 70 个 MSS
ip route | while read r; doip route change $r initcwnd 10;done

初始拥塞窗口越大,小请求就可以更快发送完毕,也会更快的结束慢开始,结束慢开始的情况一般有以下三类:

  • 定时器超时,触发重传
  • 拥塞窗口的增长到达了慢启动阈值 ssthresh(全称为 slow start threshold)
  • 接收到重复的 ACK 报文,可能存在丢包

在第一种情况下,说明网络拥塞已经比较严重了,不同的算法会有不同的调整,目前主流的调整算法 CUBIC 算法会把拥塞窗口降为原先的 0.8 倍

# 查看当前系统支持的拥塞调整算法
sysctl net.ipv4.tcp_available_congestion_control
# 配置具体的拥塞调整算法
net.ipv4.tcp_congestion_control = cubic

这种算法在内网中效率高于 BBR,因为内网本来就时延低,但在高 RT 场景下表现不如 BBR,BBR 基于测量实现拥塞窗口的动态调整,在丢包率较高的网络中应用效果尤其好,例如此时网络带宽不变,但是请求时延增加,说明网络已经开始阻塞了,CUBIC 直到丢包才开始控制,是有些滞后了的。Linux 4.9 版本之后都支持 BBR 算法,同样使用 tcp_congestion_control 进行配置。

在第二种情况下,已经到了慢启动阈值,可能接下来就会出现拥塞,因此拥塞窗口不再指数级增长,而是线性增长

在第三种情况下,对方连续发送重复 ACK(例如3个) 说明网络情况尚可,可能由于中间设备等原因造成某包丢失或失序,不应认为网络出现严重拥塞,因此触发快速重传,略微降低发送速度,这里有个问题其实是,比如报文 6 7 8 一起发送,对方发了 3 个连续的 6 的 ACK,触发报文 6 的重传时,是否要发 7 和 8,如果发可能对方已经收到了只是 6 一直没到,就浪费带宽了,如果不发也可能网络不好丢失了,待会还要重发,SACK (Selective Acknowledgment)选择性确认机制解决了这个问题,接收方通过 TCP 头部选项字段精准反馈已接收的非连续数据段信息,使发送方仅重传真正丢失的报文段。

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

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

相关文章

【前端】vue工程环境配置

环境准备(Windows版本) nodejs安装 (base) PS C:\Users\Administrator> nvm install 18.8.0 (base) PS C:\Users\Administrator> nvm use 18.8.0 Now using node v18.8.0 (64-bit) (base) PS C:\Users\Administrator> npm -v 8.18.0 (base) PS C:\Users\Administrat…

什么是data version control?为什么需要它?它能解决什么问题?

Data Version Control (DVC) 是一个开源工具,专为数据科学和机器学习项目设计。它的核心目标是像 Git 管理代码一样来管理机器学习项目中的数据和模型文件。 简单来说,DVC 是什么? Git for Data & Models: 它扩展了 Git 的功…

简约计生用品商城简介

计生用品商城简介:uniapp结合thinkphp实现的全开源代码, 内置基本功能:1.后台商品excel一键导入 2.分销利润,按照利润加个分红

go中自动补全插件安装-gopls

vscode中安装gopls失败,导致go中代码无提示,无法自动补全引用 环境变量中设置go的代理:setx GOPROXY “https://goproxy.cn,direct”go install golang.org/x/tools/goplslatest

力扣寻找数组中心索引-性能优化思考

如下代码 var pivotIndex function(nums) {// 空数组返回-1if (nums.length 0) return -1// 计算数组总和const totalSum nums.reduce((sum, num) > sum num, 0);let leftSum 0;// 遍历数组查找中心索引for (let i 0; i < nums.length; i) {// 右侧和 总和 - 左侧…

SVN 分支管理(本文以Unity项目为例)

文章目录 1.准备工作2.新建SVN仓库2.拉取远端空 trunk 到Unity项目目录下3.设置忽略&#xff0c;提交unity项目至仓库3.创建分支4.切换分支5.合并分支回主干&#xff08;例如将 trunk_01 合并回 trunk&#xff09;5.删除分支&#xff08;可选&#xff09; 1.准备工作 下载Tort…

数据结构学习day6---流+读写函数+缓冲+定义函数

目录 1.标准io&#xff1b; stdio.h 1.1标准io的概念 1.2Linux操作系统当中IO都是对文件的操作 1.3标准IO&#xff1a;ANSI C 设计的一组用文件IO 封装的操作库函数 2.文件 2.1作用 2.2linux中文件的类型 3.man 5.流: FILE* 5.1流的定义 5.2流的分类 6.c语言文…

互联网医院,正在发生的医疗新变革

随着信息技术的飞速发展&#xff0c;互联网医院作为医疗服务的新形态&#xff0c;正在全球范围内迅速崛起。在中国&#xff0c;这一变革尤为显著&#xff0c;互联网医院不仅改善了医疗服务的可及性和便捷性&#xff0c;还极大地提升了医疗服务的质量和效率。 一、互联网医院的发…

rabbitmq动态创建交换机、队列、动态绑定,销毁

// 缓存已创建的绑定&#xff0c;避免重复声明private final Map<String, Date> createdBindings new ConcurrentHashMap<>(); public void createAndBindQueueToExchange(String type,String clinetId, String routingKey) {String queueName routingKey;lo…

云效代码仓库导入自建gitlab中

登录自建GitLab 在浏览器中输入GitLab访问地址http://192.168.1.111:81/users/sign_in&#xff0c;输入账号和密码登录GitLab服务&#xff0c;如下图&#xff1a; 新建一个空的代码库 按照以下截图顺序&#xff0c;创建一个新的空项目&#xff0c;如下&#xff1a; 克隆镜像 …

业界优秀的零信任安全管理系统产品介绍

腾讯 iOA 零信任安全管理系统 简介&#xff1a;腾讯 iOA 零信任安全管理系统是腾讯终端安全团队针对企业安全上云和数字化转型&#xff0c;提供的企业网络边界处的应用访问管控系统&#xff0c;为企业应用提供统一、安全、高效的访问入口&#xff0c;同时提供终端安全加固、软…

从设计到开发一个小程序页面

巧妇难为无米之炊&#xff0c;想写功能但是没有好看的设计&#xff0c;边写边设计效率又不够高。mastergoAi生成的页面又不够好看&#xff0c;而且每月给的免费积分用得又超快&#xff0c;so决定自给自足。能有多难&#xff0c;先做&#xff0c;做了再改。 于是决定踏足设计&a…

Linux系统 / Ubuntu虚拟机 安装DHCP服务

一、安装DHCP服务 xxx:~$ sudo apt install isc-dhcp-server 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 将会同时安装下列软件&#xff1a; libirs-export161 libisccfg-export163 建议安装&#xff1a; isc-dhcp-s…

Spring中 BeanFactory和FactoryBean分别是什么?

Spring 中 BeanFactory 是什么? BeanFactory其实就是IoC的底层容器&#xff0c;它本身只是一个接口&#xff0c;顾名思义Bean工厂&#xff0c;定义了Spring的基本功能框架&#xff0c;主要功能就是 负责从配置源中读取 Bean 的定义&#xff0c;并创建、管理这些 Bean 的生命周…

langchain从入门到精通(三十二)——RAG优化策略(八)自查询检索器实现动态数据过滤

1. 查询构建与自查询检索器 在 RAG 应用开发中&#xff0c;检索外部数据时&#xff0c;前面的优化案例中&#xff0c;无论是生成的 子查询、问题分解、生成假设性文档&#xff0c;最后在执行检索的时候使用的都是固定的筛选条件&#xff08;没有附加过滤的相似性搜索&#xff…

面向安全产品测试的静态混淆型 Shellcode Loader 设计与对抗分析

github 地址&#xff1a;https://github.com/LilDean17/ShellcodeLoader2025 一、项目背景 近年来&#xff0c;随着 C2 框架广泛应用于安全对抗模拟&#xff0c;各大安全厂商也不断提升其检测能力&#xff0c;那么安全厂商自研的安全软件&#xff0c;是否能有效防御此类威胁&…

深度强化学习DRL——策略学习

一、策略网络 策略函数 π \pi π的输入是状态 s s s和动作 a a a&#xff0c;输出是一个介于0和1之间的概率值&#xff0c;用神经网络 π ( a ∣ s ; θ ) \pi(a \mid s; \boldsymbol{\theta}) π(a∣s;θ)近似策略函数 π ( a ∣ s ) \pi(a\mid s) π(a∣s)&#xff0c; θ …

ISP Pipeline(5): Auto White Balance Gain Control (AWB) 自动白平衡

G_gain 1.0 # 常作为参考通道 R_gain G_avg / R_avg B_gain G_avg / B_avgAuto White Balance Gain Control&#xff08;AWB&#xff09;自动调整图像中红色、绿色、蓝色通道的增益&#xff0c;使图像中灰白区域的颜色看起来为“中性白”或“灰白”&#xff0c;从而矫正因光…

Python中钩子函数的实现方式

在Python中&#xff0c;钩子函数(Hook)是一种允许你在程序执行的特定点插入自定义代码的技术。它本质上是一种回调机制&#xff0c;当特定事件发生时自动调用预先注册的函数。 Python中钩子函数的实现方式 Python中实现钩子主要有以下几种方式&#xff1a; ​回调函数​&…

【RTSP从零实践】3、实现最简单的传输H264的RTSP服务器

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…