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