我正在开发一个 bash 实用程序,它将使用 tc Linux 命令行实用程序的多个方面来模拟各种网络条件。我已经成功构建了几个 qdisc 层次结构,一个用于 HTB 带宽控制、NetEM 延迟和数据包操作以及 TBF 速率控制,以及用于 HTB-NetEM 和 TBF-NetEM 的组合处理程序我正在努力将这三个组合成一个单一的结构,适用于我需要在一个连接上控制所有这些因素的情况。这是我到目前为止所拥有的:
sudo tc qdisc add dev $interface root handle 1:0 htb
sudo tc class add dev $interface parent 1:0 classid 1:1 htb #htb args
sudo tc qdisc add dev $interface parent 1:1 handle 10:0 tbf #tbf args
sudo tc qdisc add dev $interface parent 10:1 handle 101:0 netem #netem args
由于我的范围较小,我知道问题不在于输入的语法,而可能在于我的 tc qdiscs 和类的结构。当我尝试在我的网桥的两个以太网端口中运行这些命令以及速率和带宽整形参数(分别为 10 和 15 Mbit/s)时,在 TCP 或 UDP 中显示 iperf 测试的带宽没有变化。任何意见,将不胜感激。
这是我的其他工作复合结构,以防它们可能有所帮助:
HTB 和 NetEM:
sudo tc qdisc add dev $interface root handle 1: htb
sudo tc class add dev $interface parent 1:0 classid 1:1 htb #htb args
sudo tc qdisc add dev $interface parent 1:1 handle 10:0 netem #netem args
TBF 和 NetEM:
sudo tc qdisc add dev $interface root handle 1:0 tbf #tbf args
sudo tc qdisc add dev $interface parent 1:1 handle 10:0 netem #netem args
您想要的不是 HTB/TBF,而是 HFSC。
http://man7.org/linux/man-pages/man7/tc-hfsc.7.html
您可以将 netem 附加到叶类。
这是一个示例脚本,可帮助您入门..
这将创建一个 100mbit 类,其中 50mbit 属于默认类(但可以突发到 100mbit),而另一个类允许实时要求,因此 1500 字节数据包必须在 50ms 内离开队列,该类的最大速率为 10mbit每时每刻。
最后,我们在该类上添加了一个叶子 qdisc,它实际上将离开队列的数据包延迟了 150 毫秒。
进入实时类的流量是根据它具有源端口 22 属性(因此所有 ssh 流量)来选择的。