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耗时

相关推荐

  1. TCP协议参数设置&说明

    2024-06-15 19:04:02       6 阅读
  2. <span style='color:red;'>TCP</span><span style='color:red;'>协议</span>

    TCP协议

    2024-06-15 19:04:02      31 阅读
  3. <span style='color:red;'>TCP</span><span style='color:red;'>协议</span>

    TCP协议

    2024-06-15 19:04:02      33 阅读
  4. <span style='color:red;'>TCP</span><span style='color:red;'>协议</span>

    TCP协议

    2024-06-15 19:04:02      22 阅读
  5. <span style='color:red;'>TCP</span><span style='color:red;'>协议</span>

    TCP协议

    2024-06-15 19:04:02      19 阅读
  6. <span style='color:red;'>TCP</span><span style='color:red;'>协议</span>

    TCP协议

    2024-06-15 19:04:02      13 阅读
  7. <span style='color:red;'>TCP</span><span style='color:red;'>协议</span>

    TCP协议

    2024-06-15 19:04:02      13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-15 19:04:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-15 19:04:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-15 19:04:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-15 19:04:02       18 阅读

热门阅读

  1. 探索机器学习:深入理解Sklearn基础

    2024-06-15 19:04:02       8 阅读
  2. vue3delete请求报403forbidden,前后端解决方式

    2024-06-15 19:04:02       11 阅读
  3. Vue小记——如何理解 $nextTick( ) ?

    2024-06-15 19:04:02       12 阅读
  4. IDM(Internet Download Manager)简介

    2024-06-15 19:04:02       11 阅读
  5. 深度神经网络是什么?

    2024-06-15 19:04:02       9 阅读
  6. 设计模式-组合模式Composite(结构型)

    2024-06-15 19:04:02       8 阅读
  7. 使用 Python进行自动备份文件

    2024-06-15 19:04:02       8 阅读
  8. React <> </>的用法

    2024-06-15 19:04:02       9 阅读
  9. 《Vue3 基础知识》Pinia 02 之 项目中从 Vuex 转 Pinia

    2024-06-15 19:04:02       8 阅读