【问题标题】:Simulate network latency on specific port using tc使用 tc 模拟特定端口上的网络延迟
【发布时间】:2016-10-22 20:28:01
【问题描述】:

我正在尝试使用 ubuntu 上的 tc 命令模拟来自源端口 7000 的 tcp 数据包的固定时间延迟。我使用的命令是:

sudo tc qdisc add dev eth1 root handle 1: prio
sudo tc qdisc add dev eth1 parent 1:1 handle 2: netem delay 3000ms
sudo tc filter add dev eth1 parent 1:0 protocol ip u32 match ip sport 7000 0xffff flowid 2:1

这个过滤器似乎没有造成任何延迟,有人可以指出我哪里出错了吗?另外,有什么方法可以 ping 端口或做一些等效的测试来测试延迟?

谢谢!

【问题讨论】:

    标签: linux tcp network-programming


    【解决方案1】:

    试试这个:

    sudo tc qdisc add dev eth1 root handle 1: prio priomap 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    sudo tc qdisc add dev eth1 parent 1:2 handle 20: netem delay 3000ms
    sudo tc filter add dev eth1 parent 1:0 protocol ip u32 match ip sport 7000 0xffff flowid 1:2
    

    解释:

    • 将全零priomap 添加到prio,以便所有常规流量都流经一个频段。默认情况下,prio 根据数据包的 DSCP 值将流量分配到不同的频段。这意味着某些与您的过滤器不匹配的流量最终可能与延迟的流量属于同一类。
    • 将 netem 分配给其中一个类 - 1:2
    • 最后,添加您的过滤器,以便将流 id 1:2 分配给匹配的数据包。这可能是你出错的地方。您需要将过滤器分配给 classful prio qdisc 的 1:2,而不是 classless 网络。

    为了测试此设置,我将过滤器更改为 dport 80 而不是 sport 7000,并针对 checkip.amazonaws.com 运行 wget ,耗时 6 秒(TCP Syn 延迟 3 秒,HTTP GET 延迟 3 秒):

    malt@ubuntu:~$ wget -O - checkip.amazonaws.com
    --2016-10-23 06:21:42--  http://checkip.amazonaws.com/
    Resolving checkip.amazonaws.com (checkip.amazonaws.com)... 75.101.161.183, 54.235.71.200, 107.20.206.176, ...
    Connecting to checkip.amazonaws.com (checkip.amazonaws.com)|75.101.161.183|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 10
    Saving to: ‘STDOUT’
    
    -                                   0%[                                                            ]       0  --.-KB/s               X.X.X.X
    -                                 100%[===========================================================>]      10  --.-KB/s    in 0s
    
    2016-10-23 06:21:48 (3.58 MB/s) - written to stdout [10/10]
    

    但与其他端口的连接(例如 443 - HTTPS、22 - SSH 等)要快得多。您还可以运行sudo tc -s qdisc show dev eth1 以确保 netem 处理的数据包数量是合理的。

    【讨论】:

    • 嗨,由于某种原因,它不适合我。我尝试了同样的方法,最终在执行第二个命令时得到Error: Specified qdisc not found.
    • 你可能需要安装netem
    • 我也安装了 tc 和 kernel-modules-extra。我们有专门安装 netem 的命令吗?
    • 这取决于你的 linux 发行版,但它通常是 iproute2 的一部分 - packages.debian.org/stretch/iproute2
    • 它是 RHEL8,安装 kernel-debug-modules-extra 后我仍然有错误
    猜你喜欢
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    相关资源
    最近更新 更多