我想观察 TCP 流的拥塞窗口,因此我有两个节点(使用 Linux 命名空间)通过 veth 对和桥接器相互连接。
为了将 bandwitdh 限制为 10mbps,我在每个接口中使用 htb qdisc,队列长度为 1000 个数据包。
然后我iperf
在他们之间设置了一个会话:
您可以观察到比特率确实适应了 qdisc 为我们塑造的带宽。
然而,检查 pcap 文件和队列丢弃计数器也会发现,从来没有丢弃或作为效果重传
如果我开始第二个流,它们都会获得 5mbps 的公平份额。
这是怎么回事?如果拥塞控制未收到信号,TCP 如何调整流量大小?我错过了什么吗?
答案1
哇,我想您可能已经看到了 TCP 小队列功能的效果。在单台机器内,TCP 小队列会将 qdisc 和设备缓冲区中排队的数据包限制为默认值 128 KB。
当达到该限制时,TCP 将进行限制,而不会实际溢出任何缓冲区。
这表明要获得 Drops,您需要连接 3 个虚拟机(即分离模拟内核)在一起 - 发送者、“路由器”和接收者。
netem
我隐约记得在用于模拟延迟或有限带宽时也可能有使用单独机器/虚拟机的原因。总的来说,这似乎是一个很好的做法。