您的位置:首页 > 财经 > 金融 > TCP协议参数设置说明

TCP协议参数设置说明

2024/12/23 10:25:52 来源:https://blog.csdn.net/John_ToStr/article/details/139629694  浏览:    关键词: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耗时

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com