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

相关文章

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

idea报错java: 非法字符: ‘\ufeff‘的解决步骤以及说明

《idea报错java:非法字符:‘ufeff‘的解决步骤以及说明》:本文主要介绍idea报错java:非法字符:ufeff的解决步骤以及说明,文章详细解释了为什么在Java中会出现uf... 目录BOM是什么?1. BOM的作用2. 为什么会出现 \ufeff 错误?3. 如何解决 \ufeff 问题?最

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

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