1

在课堂上开始使用 Mininet 和 OpenFlow。我想做的是给 ping 数据包增加一些延迟。我有一个基本的 python 脚本,它将添加带宽和延迟约束,如下所示:

self.addLink(host1, switch1, bw=10, delay='10ms')
self.addLink(host2, switch1, bw=10, delay='10ms')
self.addLink(host3, switch1, bw=10, delay='10ms')

现在,让我感到困惑的是,每个 ping 数据包的时间对我来说似乎有点奇怪。毫不拖延地,我的数据包看起来像这样:

mininet> h1 ping h2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=1.22 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=1.51 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=1.53 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=1.27 ms
64 bytes from 10.0.0.2: icmp_seq=5 ttl=64 time=1.25 ms
64 bytes from 10.0.0.2: icmp_seq=6 ttl=64 time=0.760 ms
64 bytes from 10.0.0.2: icmp_seq=7 ttl=64 time=1.04 ms
^C
--- 10.0.0.2 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6013ms
rtt min/avg/max/mdev = 0.760/1.230/1.534/0.247 ms

我预计延迟会“为每个数据包增加 10 毫秒”,但是当我以 10 毫秒的延迟运行 ping 时会得到以下输出:

mininet> h1 ping h2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=85.1 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=46.3 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=43.5 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=43.9 ms
64 bytes from 10.0.0.2: icmp_seq=5 ttl=64 time=42.3 ms
64 bytes from 10.0.0.2: icmp_seq=6 ttl=64 time=43.1 ms
64 bytes from 10.0.0.2: icmp_seq=7 ttl=64 time=45.0 ms
64 bytes from 10.0.0.2: icmp_seq=8 ttl=64 time=43.2 ms
64 bytes from 10.0.0.2: icmp_seq=9 ttl=64 time=45.5 ms
64 bytes from 10.0.0.2: icmp_seq=10 ttl=64 time=44.5 ms
64 bytes from 10.0.0.2: icmp_seq=11 ttl=64 time=43.3 ms
^C
--- 10.0.0.2 ping statistics ---
11 packets transmitted, 11 received, 0% packet loss, time 10019ms
rtt min/avg/max/mdev = 42.373/47.836/85.146/11.851 ms

我看不到数据包已显式延迟了“10ms”

我的数据包时间有这么大的价值有什么原因吗?是不是因为交换机和两个主机在我 ping 它们时都增加了延迟,因此时间增加了?

4

2 回答 2

1

我会说你所做的是你为每个主机添加了 10 毫秒的延迟,因此对两者都添加了h1h2因此进行数学运算:从到传递到 10 毫秒,从h1switch1传递到 10 毫秒,从到传递switch1到响应h2需要10 毫秒,10毫秒传递到: 。对我来说似乎是合法的。h2switch1switch1h210+10+10+10=40

于 2015-10-13T18:22:28.753 回答
0

在 h1 和 h2 之间有两个链接,每个链接都有 10 毫秒的延迟。因此,数据包在一个方向上传输大约需要 20 毫秒。所以一个往返大约需要 40 毫秒。

由于 ping 由一对数据包组成 - ICMP Echo Request(由源发送)和ICMP Echo reply(由目标发送),因此从第二个开始的所有 ping 都会有大约 40 毫秒的延迟。

第一次 ping 延迟较长的原因有点棘手。一对主机要在 LAN 中交换 IP 级消息(例如通过交换机),它们必须知道彼此的 MAC 地址。在第一个数据包之前,h1 不知道 h2 的 MAC,所以它必须解析它。解析由一对数据包组成——一个由 h1 发送的 ARP 请求和一个由 h2 发送的 ARP 响应。这些消息还在 LAN 中传播 40 毫秒。只有收到响应后,才能发送第一个 ICMP 数据包。这就是你获得80ms延迟的方式。

于 2015-10-14T15:28:36.560 回答