使用tc,我希望TCP和UDP使用相同的缓冲区

使用tc,我希望TCP和UDP使用相同的缓冲区

我有两种类型的流量

  1. 传输控制协议
  2. 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 和缓冲区共享来编写此函数?你想展示什么?

相关内容