我有两种类型的流量
- 传输控制协议
- UDP协议
我想对它们应用 2 个不同的过滤器,UDP 为 1 Mbps b/w,TCP 为 7 Mbps b/w
但我希望他们的流量使用大小为 100 个数据包的公共缓冲区
我写了以下脚本
#!/bin/bash
#Size of the queue
qlen=$1
#Delay per link
sdelay=$3
tcp_rate=7Mbit
udp_rate=1Mbit
total_rate=8Mbit
function add_qdisc {
# deleting default qdisc
dev=$1
tc qdisc del dev $dev root
echo qdisc removed
# adding custom qdisc
tc qdisc add dev $dev root handle 1:0 htb default 1
echo qdisc added
# creating classes for tcp and udp traffic
tc class add dev $dev parent 1:0 classid 1:1 htb rate $total_rate ceil $total_rate
tc class add dev $dev parent 1:1 classid 1:11 htb rate $udp_rate ceil $udp_rate
tc class add dev $dev parent 1:1 classid 1:12 htb rate $tcp_rate ceil $tcp_rate
echo classes created
# creating link delays and queues
tc qdisc add dev $dev parent 1:1 handle 10: netem delay $sdelay limit $qlen
echo "delay and queue added"
# matching the tcp/udp traffic to the appropriate class
tc filter add dev $dev parent 1:0 protocol ip u32 match ip protocol 0x11 0xff flowid 1:11
tc filter add dev $dev parent 1:0 protocol ip u32 match ip protocol 0x06 0xff flowid 1:12
tc filter add dev $dev parent 1:0 protocol ip u32 match ip protocol 0x01 0xff flowid 1:12
echo filters added
}
add_qdisc s1-eth1
add_qdisc s1-eth2
add_qdisc s3-eth1
add_qdisc s3-eth2
add_qdisc s6-eth1
add_qdisc s6-eth2
RTNETLINK answers: Invalid argument
但是当我将缓冲区大小添加到 tc 树节点时出现错误1:1
1:1
当我为的子级添加缓冲区时,例如1:11
,脚本运行良好。
1:1
因为我希望两个流量都使用公共缓冲区,所以可以添加缓冲区大小吗?
PS:我刚刚开始学习 tc 命令
编辑
更新udp_rate
至 1 Mbps
答案1
您无法在 tc 中的两个 qdisc 之间共享缓冲区。
不过,由于您的带宽是静态的,因此对 split : 12 和 88 数据包进行硬编码是有意义的。
tc qdisc add dev $dev parent 1:11 handle 9: netem delay $sdelay limit $qlen_udp
tc qdisc add dev $dev parent 1:12 handle 10: netem delay $sdelay limit $qlen_tcp
如果您的 UDP 数据包很小,您可能需要将该值从 12 调整为 20-30,以保持缓冲能力并保持较低的延迟(在 netem 操作之前)。
为什么要使用 netem 和缓冲区共享来编写此函数?你想展示什么?