如何使用 UDP 找到合适的发送速度?

How to find the right sending speed with UDP?

我要传输大量消息。消息不需要是可靠的。 UDP 作为一种协议选择浮现在脑海中。

延迟也很重要。我不想遭受 TCP 线头阻塞。

我担心刚开始以最大速度发送消息时网络可能会过载(例如 while (messagesRemaining != 0) Send(...);)。如果我发送的消息超过某个中间盒可以中继的数量,那么我认为可能会丢弃大量消息。丢弃一些消息没问题,但大多数消息应该会到达。

我该如何解决这个问题?我怎样才能知道我可以发送多快?我想保持合理的数据包丢失(百分之几),否则最大化带宽。

是否会使网络过载取决于发送方和接收方主机之间的情况。 iperf 实用程序有一个 UDP 选项,可以帮助您确定可以发送的最大速率,以达到一定程度的可接受的数据包丢失。

也就是说,根据个人经验: 如果它是本地千兆网络并且 client/server 在同一个子网上,我非常怀疑你会丢失任何数据包。我之前在这种类型的环境中使用 iperf 进行过测试,并且从未丢失任何数据包; iperf 将成为将 UDP 数据包从 PC 传输到网络的最快、最有效的方法之一,而且我们仍然从未丢失过数据包。我们甚至 运行 通过基于英特尔 Atom 的 Linux 具有桥接端口设置的主机发送数据包,同时进行 tcpdump 并且仍然没有丢失数据包(请注意,即使是便宜的交换机也会表现得一样好或更好而不是 PC 中的网桥设置)。我们能够让数据包丢失的唯一方法是使用 FPGA/ASIC 测试设备,这些设备可以长时间以真正的线速将数据包发送到线路上。即使那样,测试设置也只会在数据包小于 500 字节左右时丢失数据包。

如果您不在本地网络上(即通过互联网或路由器),您只需要使用 iperf 进行一些测试,看看您的环境可以接受什么。问题是,一天可以维持的利率并不能保证第二天保持不变。 UDP 没有像 TCP 那样的任何类型的 congestion/flow 控制算法,所以你必须自己弄清楚你可以发送多快。