我是 tc 的新手,我发现它非常令人困惑,我能够找到并理解一些命令流,在特定 IP 上发出延迟,但我认为它不能正常工作 - 延迟此 IP 的所有可能的流量。我想我误解/不理解一些参数。
有时它确实有效,但我对此表示怀疑,因为它并不一致,好像流量有时会采用不同的优先级,但可能不会延迟?不确定
(我怎么知道的 - 有时我能够破坏向服务器发送查询的应用程序,从而延迟流量,有时它只是工作,好像没有任何延迟,即使使用 50000 毫秒)
这就是我正在使用的:
tc qdisc add dev eth1 root handle 1: prio
tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip src 1.1.1.1 flowid 1:3
tc qdisc add dev eth1 parent 1:1 handle 2: netem delay 20000ms
答案1
您只能将过滤器定向到类或根 qdisc。因此,如果您想根据 IP 源应用不同的 qdisc,则需要多个类。然后您将拥有:
根 qdisc <--> 多个类 <--> 每个类中的 qdisc
然后,您的过滤器会将流量引导至某个类,该类的叶 qdisc 将使用 netem。例如(这是我的一个脚本的一部分,它不完全一样,此代码用于解释根和叶):
# root qdisc
# Interface eth1, qdisc: htb, default leaf: 1000
tc qdisc add dev $LAN_IFACE root handle 1:0 htb default 1000 r2q 200
# root class
# Interface eth1, parent: 2:0, id: 2:11
tc class add dev $LAN_IFACE parent 1:0 classid 1:10 htb rate ${LOCAL_DL_USED}kbit ceil ${LOCAL_DL_USED}kbit quantum 100
# CLASS 1
tc class add dev $LAN_IFACE parent 1:10 classid 1:100 htb rate ${LOCAL_DL_INTERACTIVE}kbit ceil ${LOCAL_DL_INTERACTIVE}kbit burst 5k prio 0 linklayer ethernet quantum 1000
# QDISC of class 1
tc qdisc add dev $LAN_IFACE parent 1:100 handle 110: pfifo limit 1000
# FILTER to class 1
tc filter add dev $LAN_IFACE parent 1:0 protocol ip prio 0 handle 100 fw flowid 1:100
# CLASS 2
tc class add dev $LAN_IFACE parent 1:10 classid 1:200 htb rate ${LOCAL_DL_SSH}kbit ceil ${LOCAL_DL_SSH}kbit prio 1 linklayer ethernet quantum 1000
# QDISC of class 2
tc qdisc add dev $LAN_IFACE parent 1:200 handle 210: sfq perturb 10
# FILTER to class 2
tc filter add dev $LAN_IFACE parent 1:0 protocol ip prio 1 handle 200 fw flowid 1:200
你可以看看走进 Linux 内核以获得详细解释。