sockets - 如何使用 UDP 找到正确的发送速度?

标签 sockets networking udp

我想传输大量消息。消息不需要是可靠的。 UDP 是一种协议(protocol)选择。

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

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

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

最佳答案

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

也就是说,从个人经验来看:
如果它是本地千兆网络和同一子网上的客户端/服务器,我非常怀疑你会丢失任何数据包。我之前在这种类型的环境中使用 iperf 进行过测试,并且从未丢失任何数据包; iperf 将成为将 UDP 数据包从 PC 传输到线路的最快和最有效的方法之一,而且我们仍然不会丢失数据包。我们甚至通过基于 intel Atom 的 Linux 主机运行数据包并设置了桥接端口,同时进行 tcpdump 并且仍然从未丢失数据包(请注意,即使是便宜的交换机也可以与 PC 中的桥接设置一样好或更好) .我们能够让数据包丢失的唯一方法是使用 FPGA/ASIC 测试设备,该设备可以长时间以真正的线速将数据包放到线路上。即便如此,测试设置仅在数据包小于 500 字节时才会丢失数据包。

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

关于sockets - 如何使用 UDP 找到正确的发送速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35417947/

相关文章:

linux - 如何向套接字提供目标MAC地址

c++ - recvfrom 超时(winsock2 和 udp)

C UDP服务器访问问题

c - 如何实现无限循环

c++ - 使用 Boost.Asio 只读取所需的字节数

java - Java 和 C/C++ 程序之间的命名管道

linux - 结合sento()写writev()?

java - 用于基于 LAN 的多用户游戏的 XMPP

python - Python套接字编程如何接收所有数据

java - 在局域网中查找java服务器