使用tc模拟特定端口上的网络延迟

Kap*_*pil 3 linux network-programming tcp

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

该过滤器似乎没有造成任何延迟,请有人指出我要去哪里了吗?另外,是否可以通过任何方式ping端口或进行等效的测试延迟?

谢谢!

Mal*_*alt 5

尝试这个:

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
Run Code Online (Sandbox Code Playgroud)
  • 我已经将全零PRIOMAP添加到了,prio因此所有常规流量都将流经一个频段
    • 缺省情况下,prio根据报文的DSCP值将流量分配到不同的频段
    • 这意味着某些与您的过滤器不匹配的流量可能会与延迟的流量归为同一类
  • 然后,我将netem分配给其中一个类- 1:2
  • 最后,我添加了您的过滤器,以便它将流ID分配1:2给匹配的数据包
    • 这可能是您出问题的地方
    • 您需要将过滤器分配到1:2的的有类 PRIO队列规定,而不是阶级 netem。

为了测试它,我将过滤器更改为d端口80而不是s端口7000,并连接checkip.amazonaws.com了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]
Run Code Online (Sandbox Code Playgroud)

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