Linux 如何防止应用程序发送的数据包超出链路可以处理的数量而不丢失数据包?

Linux 如何防止应用程序发送的数据包超出链路可以处理的数量而不丢失数据包?

我无法让问题变得更清楚,所以这里有一个示例场景:

给定一台 Linux 机器通过带宽 10Mbps 的物理接口连接到 IP 网络(或者带有 tc 令牌桶过滤器的更高速度接口,以将速率限制为 10Mbps)。

在远程计算机(具有相同速度或更快的链接)上启动 iperf UDP 服务器:

iperf -s -u -i 1

在本地计算机上启动 bw=20Mbps 的 iperf 客户端:

iperf -c <server ip> -u -i 1 -b 20M

观察:发送方永远不会超过 10Mbps 速率(在硬件或 tc qdisc 中的链路层中定义)。

我预计发送方每秒会推出 20Mbits 的数据包,导致接口的本地 tx 队列建立,并开始发生数据包丢失。但这种情况并非如此。为什么?

我尝试查看 Linux 内核的 net/sched 文件夹,但我似乎找不到此行为的根源。

感谢您的帮助。也请随意建议更改标题以使其更相关。

答案1

这是由于一个称为自动协商,这发生在物理层。就内核而言,该链接(连接)只能处理 10 Mbps 的带宽,并且 iperf 大概尊重该最大连接速度。

好人在https://networkengineering.stackexchange.com/如果您对该交互有更多疑问,可能可以更详细地了解。

答案2

本地机器受限于 NIC 的带宽,该带宽从 NIC 向上传递到堆栈。您将根据该值对流量进行限制。

您可以尝试并行流 (-P) 选项来创建多个流,每个流都限制于 NIC 速度,但都尝试推送 10mb/s

答案3

粗略地说,一般来说,数据包以类似存储转发的方式保存在我们所说的“桶”中,并随着时间的推移通过网络发送,以确保预定义的带宽。它们并不总是被丢弃。这就是为什么根据您使用的 QoS 方法、您正在监视的客户端数量以及一般配置,CPU 和内存成本可能会迅速上升。

我们可以在多个 OSI 级别上实现 QoS(服务质量)。我们可以在 Squid 代理服务器、RouterOS 界面中做到这一点,或者通过特定的网络协议各自的端口授予权限。

此致。

相关内容