1

感谢您点击我的问题。

我正在做一个小实验来了解 TCP 流在拥塞时的行为。

在这个实验中,我发现当拥塞发生时,tcp 流的速率比我想象的要大得多。

由于拥塞控制,我认为它的速率最多应该减半。

但在我的实验中并没有。

你能给我一点提示吗?下面是我的实验。

感谢您再次点击



我通过使用Mininet由两台主机和一个交换机组成的小型网络。

H1 - S1 - H2 , 所有链路带宽 80Mbps

iperf3然后,我使用如下方式生成了从 H2 到 H1 的流量

#H1
iperf3 -s -p 1212 -f m -i 1

#H2
iperf3 -c 10.0.0.1 -p 1212 -t 10000 -f m -b 70M

这意味着 H2 以 70Mbit/s 的速度向 H1 发送 TCP 数据包

(iperf3 在应用层控制它的 TCP 速率。)

然后我们可以在H1(服务器端)看到报告

-----------------------------------------------------------
Server listening on 1212
-----------------------------------------------------------
Accepted connection from 10.0.0.2, port 51786
[ 17] local 10.0.0.1 port 1212 connected to 10.0.0.2 port 51788
[ ID] Interval           Transfer     Bandwidth
[ 17]   0.00-1.00   sec  7.49 MBytes  62.8 Mbits/sec                  
[ 17]   1.00-2.00   sec  8.14 MBytes  68.3 Mbits/sec                  
[ 17]   2.00-3.00   sec  8.54 MBytes  71.7 Mbits/sec                  
[ 17]   3.00-4.00   sec  8.60 MBytes  72.2 Mbits/sec                  
[ 17]   4.00-5.00   sec  7.98 MBytes  66.9 Mbits/sec                  
[ 17]   5.00-6.00   sec  8.80 MBytes  73.9 Mbits/sec                  
[ 17]   6.00-7.00   sec  8.21 MBytes  68.9 Mbits/sec                  
[ 17]   7.00-8.00   sec  7.77 MBytes  65.1 Mbits/sec                  
[ 17]   8.00-9.00   sec  8.30 MBytes  69.7 Mbits/sec                  
[ 17]   9.00-10.00  sec  8.45 MBytes  70.9 Mbits/sec                  
[ 17]  10.00-11.00  sec  8.32 MBytes  69.7 Mbits/sec   

此时,我通过使用限制 S1 端口(s1-eth1,从 H2 到 H1 的出口)linux tc

sudo tc qdisc del dev s1-eth1 root
sudo tc qdisc add dev s1-eth1 root tbf rate 40mbit latency 10ms burst 1mbit

然后结果如下

[ 17]   0.00-1.00   sec  7.76 MBytes  65.0 Mbits/sec                  
[ 17]   1.00-2.00   sec  8.09 MBytes  67.9 Mbits/sec                  
[ 17]   2.00-3.00   sec  8.53 MBytes  71.5 Mbits/sec                  
[ 17]   3.00-4.00   sec  8.47 MBytes  71.0 Mbits/sec                  
[ 17]   4.00-5.00   sec  8.08 MBytes  67.8 Mbits/sec                  
[ 17]   5.00-6.00   sec  8.09 MBytes  67.9 Mbits/sec                  
[ 17]   6.00-7.00   sec  8.74 MBytes  73.3 Mbits/sec                  
[ 17]   7.00-8.00   sec  7.81 MBytes  65.6 Mbits/sec                  
[ 17]   8.00-9.00   sec  8.35 MBytes  70.0 Mbits/sec                  
[ 17]   9.00-10.00  sec  4.56 MBytes  38.3 Mbits/sec                  
[ 17]  10.00-11.00  sec  4.56 MBytes  38.2 Mbits/sec                  
[ 17]  11.00-12.00  sec  4.56 MBytes  38.2 Mbits/sec                  
[ 17]  12.00-13.00  sec  4.56 MBytes  38.2 Mbits/sec                  
[ 17]  13.00-14.00  sec  4.56 MBytes  38.2 Mbits/sec       

如您所见,它的速率约为 40Mbps。

我认为当拥塞发生时,TCP状态应该变成slow start然后它的速率应该变得更小。但它没有。

我检查了iperf3源代码,但它只是使 TCP 流量从应用层传输到一定数量。因此它对 TCP 算法的行为没有影响。

为什么会这样?我不知道...

你能给我一点提示吗?我感激你!

4

1 回答 1

0

首先,我必须在实验前正确设置参数。

1)在设置链路带宽时,我们可以在设置时设置突发大小(或mtu大小)TC

它看起来对iperfTCP 流量的波动有影响。

当突发大小较小时,其速率波动或较低,超出我的预期。

2)另外,我们可以在开关处设置MTU大小(Jumbo frame size)。

因为我使用 OVS( OpenVSwitch),所以我将参数设置为site

3) 并且,我们可以使用 设置接口卡的 MTU 大小ethtool 你可以看到这个网站


正确设置上述参数后,最好观察 TCP 速率。

尽管拥塞,TCP 速率仍然不小的原因似乎是RTT 值很小

幻灯片中所示,TCP 在每个 RTT 传输其数据包。

在我的实验中,RTT 的值要小得多,因为两个主机之间只有一条边。

因此,在第二个尺度上,看起来主机并没有降低它的速率,但实际上它确实降低了它的速率。

于 2020-01-04T02:57:10.063 回答