为什么我在 Linux 中看不到 TCP 流的丢弃

网络工程 tcp linux 第 4 层 iperf
2022-02-05 15:15:32

我想观察 TCP 流的拥塞窗口,因此我必须通过 veth 对和网桥将节点(使用 Linux 命名空间)相互连接。

为了将带宽限制为 10mbps,我在每个接口中使用了一个 htb qdisc,队列长度为 1000 个数据包。

然后我在它们之间设置了一个 iperf 会话:

1)您可以观察到比特率确实适应了 qdisc 将为我们塑造的带宽。

2)但是检查 pcap 文件和队列丢弃计数器也看到没有丢弃或作为效果重新传输

如果我开始第二个流量,他们都会获得 5mbps 的公平份额。

这是怎么回事?如果拥塞控制没有收到信号,TCP 如何调整流量大小?我错过了什么吗?

1个回答

您正在减慢每个主机内部的传输速度,但实际上并没有利用 TCP 流机制,因为您正在排队数据包而不是丢失数据包。即使使用没有流量控制机制的 UDP,您所做的也将起作用。您应该使用监管(丢弃)来减慢传输速度,而不是排队,然后您将看到 TCP 做出反应。

排队和整形旨在尽量不丢失数据包,但监管会故意丢弃数据包。您还可以尝试像 RED 那样随机丢弃队列中的数据包以防止队列被填满。这将有助于通过利用 TCP 流控制来防止 TCP 全局同步(一件坏事)。

如果您真的想观察 TCP 流控制的实际效果,请使用不同的监管速率进行不同的测试。