TCP协议参数设置说明

2024-06-13 09:20
文章标签 协议 说明 参数设置 tcp

本文主要是介绍TCP协议参数设置说明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ip route下的tcp参数设置

能设置的参数不止这些,只列出了我们关心的

rto_min

通过路由表覆盖全局rto_min,最好是对端配合设置quickack

避坑:这玩意是用jiffies为单位记录的,jiffies的单位是4ms,配10ms的话生效的时候是16ms

1 在tcp_rtt_estimator这个函数里面,rttvar_us初始化为rto_min,后续经一系列逻辑判断,rttvar_us只增不减

2 在__tcp_set_rto这个函数里面,rto = usecs_to_jiffies((tp->srtt_us >> 3) + tp->rttvar_us)

所以设置10ms的时候,实际rttvar_us就不会小于12ms,再加上srtt_us就大于12ms了,再转一次jiffies就是16ms

这也间接说明了,这两周的观察期间,实车未出现过>4ms的rtt

quickack

设置为1会关闭delayed ack,相关代码分析见delayed ack代码和实车环境影响分析

cwnd

实际上是拥塞窗口上限,是否有效取决于拥塞算法实现。对我们用的cubic是有效的

搜内核变量snd_cwnd_clamp,函数tcp_cong_avoid_ai

避坑:这玩意是当tcp_metrics没有缓存时,从路由更新到tcp_metrics才能生效。设置完之后要ip tcp_metrics delete xxx

initcwnd

初始拥塞窗口,如果开了tcp_slow_start_after_idle + rto_min,比较有用

因为定频通信的特征,会不停初始化

initrwnd

没仔细看代码,反正跟initcwnd一块配就行了

ssthresh

初始拥塞窗口,如何开了tcp_slow_start_after_idle + rto_min,比较有用

因为定频通信的特征,会不停初始化

/proc/sys/net/ipv4/tcp相关参数说明

/proc/sys/net/ipv4/tcp_frto

forward RTO-Recovery;虚假超时重传检测

/proc/sys/net/ipv4/tcp_recovery

rack重传,通过已ack数据包-时间差,判断未确认数据是否丢包

/proc/sys/net/ipv4/tcp_retrans_collapse

重传时重组数据包,不会对未发送数据做重组

/proc/sys/net/ipv4/tcp_dsack

sack的第一个块用于通知重复包

/proc/sys/net/ipv4/tcp_thin_dupack

缓存中无待发送数据时一个dup ACK就可以触发快速重传。

tcp_thin_dupack使能的时候,一定会关闭early retransmit。

/proc/sys/net/ipv4/tcp_reordering和tcp_max_reordering

设置快速重传需要的ack包阈值;linux要求tcp_reordering为3的时候才会使能ER

/proc/sys/net/ipv4/tcp_early_retrans

early retransmit:无待发送包时,快速重传需要的dup ack数量=“待确认包”-1;

发了1,2包,SACK确认2包,即可触发快速重传;

如果有可发送包,受拥塞控制发不出去,不算无待发送包。

tail loss probe:一段时间没收到ack,则强制传输最后一个未ack的报文或未发送的报文。不受拥塞控制, 受接收窗口限制。

但是linux写死了,只有一个未确认包时,TLP超时受200ms间隔限制。

/proc/sys/net/ipv4/tcp_moderate_rcvbuf

非0,且未设置连接SO_RCVBUF时,自动调整接收缓存,不超过tcp_rmem[2]

/proc/sys/net/ipv4/tcp_slow_start_after_idle

空闲后重新计算拥塞窗口

在这个函数tcp_slow_start_after_idle_check里进行判断,如未关闭此功能,则触发tcp_cwnd_restart

tcp_cwnd_restart根据“发送间隔是rto的倍数”,来执行cwnd>>1,取更新后cwnd和init_cwnd中的min值

同时用tcp_current_ssthresh更新tp->snd_ssthresh

/proc/sys/net/ipv4/tcp_limit_output_bytes

TSQ,tcp small queue,在发包时,如果单tcp待网卡发送数据较多,则缓存起来,通过TSQ tasklet发送

这个值默认256KB,tcp_wmem的default比这个小很多,感觉一般不会触发

主要用于同机器,不同tcp往外发包时,别让一个tcp把网卡队列占满了

/proc/sys/net/ipv4/tcp_min_rtt_wlen

在函数tcp_update_rtt_min中,根据sysctl_tcp_min_rtt_wlen调用minmax_running_min计算rtt_min

minmax_running_min实现在lib/win_minmax.c,计算wlen,wlen/2,wlen/4时间内的极值

目前从代码上看,这个参数无用,相关功能应该是未实现,4.9.337里面也是无用的

但是4.5内核里tcp_update_rtt_min函数很长,也用了rtt_min,不知道是不是误判太多被删掉了

/proc/sys/net/ipv4/tcp_low_latency

tcp_prequeue_process出队

tcp_prequeue入队,perf火焰图没看到他的占用,反而是tcp_v4_do_rcv很高

没太仔细看,应该是要有进程使用阻塞socket read的时候,tp->ucopy.task不为空,才会触发prequeue

原理上是将原本软中断上下文中的tcp协议处理(tcp_v4_do_rcv),放到了进程上下文(tcp_prequeue_process)

如果要用的话,需考虑rtt上升等一系列影响;收益是减少软中断耗时,减少CPU0耗时

这篇关于TCP协议参数设置说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

MySQL常见的存储引擎和区别说明

《MySQL常见的存储引擎和区别说明》MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY、Archive、CSV和Blackhole,每种引擎有其特点和适用场景,选择存储引擎时需根... 目录mysql常见的存储引擎和区别说明1. InnoDB2. MyISAM3. MEMORY4. A

MyBatis的配置对象Configuration作用及说明

《MyBatis的配置对象Configuration作用及说明》MyBatis的Configuration对象是MyBatis的核心配置对象,它包含了MyBatis运行时所需的几乎所有配置信息,这个对... 目录MyBATis配置对象Configuration作用Configuration 对象的主要作用C

在Dockerfile中copy和add的区别及说明

《在Dockerfile中copy和add的区别及说明》COPY和ADD都是Dockerfile中用于文件复制的命令,但COPY仅用于本地文件或目录的复制,不支持自动解压缩;而ADD除了复制本地文件或... 目录在dockerfile中,copy 和 add有什么区别?COPY 命令ADD 命令总结在Doc

解读Pandas和Polars的区别及说明

《解读Pandas和Polars的区别及说明》Pandas和Polars是Python中用于数据处理的两个库,Pandas适用于中小规模数据的快速原型开发和复杂数据操作,而Polars则专注于高效数据... 目录Pandas vs Polars 对比表使用场景对比Pandas 的使用场景Polars 的使用

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Spring Boot Actuator使用说明

《SpringBootActuator使用说明》SpringBootActuator是一个用于监控和管理SpringBoot应用程序的强大工具,通过引入依赖并配置,可以启用默认的监控接口,... 目录项目里引入下面这个依赖使用场景总结说明:本文介绍Spring Boot Actuator的使用,关于Spri

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s