在 Ubuntu(4.15.x 内核)中,IP 标头中的 ECN 标记是默认执行的吗?还是应该使用特殊选项重新编译内核?我在一台 Ubuntu 机器上配置了一个 RED 入口队列,在网络的所有主机中将 net.ipv4.tcp_ecn 设置为 1,并在 tc qdisc 命令中启用了 ECN。
我使用 4 台采用此拓扑的 ubuntu 机器:客户端 --- rt1 --- rt2 --- 服务器。
iperf -s
在服务器端和iperf -c server -P 100 -d
客户端运行。
(客户端 --- rt1):100mbit 1 ms 延迟; (rt1 --- rt2):10mbit 1ms 延迟; (rt2 --- 服务器):100mbit 1ms 延迟;
RED队列在rt1面向客户端的接口上配置如下:
在外部接口上创建入口
tc qdisc add dev $ext handle ffff: ingress
ifconfig $ext_ingress up
将所有入口流量转发到 IFB 设备
tc filter add dev $ext parent ffff: protocol all u32 match u32 0 0 action mirred egress redirect dev $ext_ingress
在 IFB 设备上应用 RED
tc qdisc add dev $ext_ingress root red limit 50000 min 4167 max 12500 burst 7 avpkt 1000 probability 0.5 bandwidth 100mbit ecn
我看到由于拥塞而早期丢弃的数据包,但没有标记的数据包。
答案1
您应该验证内核配置:
IP_NF_TARGET_ECN
NETFILTER_XT_MATCH_ECN
也许对于 Ubuntu 内核来说,它只是一个需要加载的额外模块。