Skip to the content.

tc 和 tcp congestion control

这里的 tc 指 Linux traffic control,不是 TCP 拥塞控制。

这两个东西很容易混淆,但它们是不同层次的机制:

例如下面这段:

struct tcp_congestion_ops tcp_reno = {
	.flags		= TCP_CONG_NON_RESTRICTED,
	.name		= "reno",
	.owner		= THIS_MODULE,
	.ssthresh	= tcp_reno_ssthresh,
	.cong_avoid	= tcp_reno_cong_avoid,
	.undo_cwnd	= tcp_reno_undo_cwnd,
};

它属于 TCP 拥塞控制,不属于 tc

如果要看默认 qdisc、fq_codelpfifo_fast 一类内容,可以同时参考 qdisc.md

所以,我们的确可以注意到,这里是存在 tc cgroup 和 tcp contestion 三个东西, 他们都是控制发包的。在不同的层次。

可直接跑的实验

旁边新增了一个脚本:tc-demo.sh

这个脚本只用 netns + veth + tc 搭一个最小拓扑,在物理机上也比较安全,不需要碰真实网卡:

tc-left(veth-tc-left, 10.88.0.1) <-> tc-right(veth-tc-right, 10.88.0.2)

支持这些实验:

最常用的运行方式:

# 需要 tc / ip / ping
nix-shell -p iproute2 iputils --run \
  'printf "a\n" | sudo -S env PATH="$PATH" ./net/tc-demo.sh all'

# 如果要看 tbf 的实际吞吐
nix-shell -p iproute2 iputils iperf3 --run \
  'printf "a\n" | sudo -S env PATH="$PATH" ./net/tc-demo.sh rate'

脚本默认不会自动清理,方便实验后继续手工观察:

nix-shell -p iproute2 iputils --run \
  'printf "a\n" | sudo -S env PATH="$PATH" ./net/tc-demo.sh cleanup'

https://wiki.aalto.fi/download/attachments/69901948/TCP-CongestionControlFinal.pdf

万字详文:TCP 拥塞控制详解

下面介绍几种常用的 RTT 算法。

  1. rtt 经典算法 [RFC793]
  2. rtt 标准算法(Jacobson / Karels 算法)
    • Linux 的源代码在:tcp_rtt_estimator
  3. Karn 算法

几种快速重传算法:

丢包是网络波动,还是真的出现了拥塞 ?

tc ai 分析

• 如果你问的是 Linux 内核里的 tc(traffic control),主源码基本都在 net/sched/,再加上少量 net/core/、 include/net/、include/uapi/linux/ 和驱动 offload 代码。

最核心的是这几类:

如果你是想快速建立全貌,建议按这个顺序读:

  1. net/sched/sch_api.c:1581
  2. net/sched/sch_ingress.c:242
  3. net/sched/cls_api.c:230
  4. 具体 classifier:cls_flower.c 或 cls_u32.c
  5. net/sched/act_api.c:1017
  6. 具体 action:act_mirred.c / act_police.c / act_bpf.c
  7. net/core/dev.c:4433

• tc 的核心作用是 控制网络包怎么排队、怎么发、怎么处理。

更具体地说,它主要做这几件事:

可以把它粗略理解成:

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。