我刚刚发现,在我在 Linux 用户空间上编写的一个简单的 UDP 客户端/服务器应用程序中,UDP 客户端(1 Gbit 以太网接口)以 1 Gbit 的速度将数据发送到只有 100 Mbit 以太网接口的 UDP 服务器。当然,这会导致服务器端出现大量丢包。
我必须通过在客户端执行此操作来调整 NIC 设置:
ethtool -s eth0 speed 100 duplex full autoneg on
为什么我必须这样做?这不应该自动处理吗?
我刚刚发现,在我在 Linux 用户空间上编写的一个简单的 UDP 客户端/服务器应用程序中,UDP 客户端(1 Gbit 以太网接口)以 1 Gbit 的速度将数据发送到只有 100 Mbit 以太网接口的 UDP 服务器。当然,这会导致服务器端出现大量丢包。
我必须通过在客户端执行此操作来调整 NIC 设置:
ethtool -s eth0 speed 100 duplex full autoneg on
为什么我必须这样做?这不应该自动处理吗?
UDP是一种“即发即弃”的传输方式,因此它不关心数据包在发送后会发生什么。这意味着您可以以源系统的出口速率发送,而不管到目的地的路径特征如何;显然,如果源接口发送数据包的速度超过网络可以承受的速度,则会导致数据包丢失。
如果您需要自动处理此问题,则需要切换到 TCP 或 SCTP。或者,您可以在 UDP 之上构建自己的错误处理协议...
在您的特定情况下,如果您可以依靠 100Mbits/s 到达目的地,则最好在客户端上使用流量整形,而不是将所有流量限制为 100Mbits/s 接口速度。
正如斯蒂芬已经指出的那样:UDP 缺乏你想要的手段。
如果您的应用程序看起来很愚蠢,那么您可以通过在主机之间设置虚拟
ipip
接口 (ip link
) 并使用流量整形 (tc
) 来限制使用的带宽来强制降低速度。正如其他答案正确指出的那样,UDP 流量控制必须在第 7 层进行管理。
如果您是该应用程序的一个作者,您可以为其定义一个选项: