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

标签 linux tcp network-programming

我正在尝试使用 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 一个端口或做一些等效的事情来测试延迟?

谢谢!

最佳答案

试试这个:

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 netem。

为了测试此设置,我将过滤器更改为 dport 80 而不是 sport 7000,并对 运行 wget 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]

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

关于linux - 使用 tc 模拟特定端口上的网络延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40196730/

相关文章:

java - p2p0 是 android 中 WIFI DIRECT 的无线接口(interface)吗?

docker - Docker Flask服务器容器无法通过主机访问

linux - ansible - 通过 ansible-playbook 执行 InstallHalyard.sh 脚本时没有任何反应

php - 连接存储服务器与前端服务器的最有效方法?

linux - 使用 linux cut 将一个字段一分为二

go - 如何获取可用 TCP 数据的大小?

c++ - Qt双向客户端服务器使用QTcpSocket和QTcpServer

linux - 进程的虚拟地址范围

c++ - 多线程 - 断开 TCP 连接

objective-c - Objective-C/Cocoa 中客户端-服务器通信的方法