UDP 客户端/服务器如何“知道”有多少带宽可用

How does UDP clients/servers "know" how much bandwidth is available

提问人:Kaiden Prince 提问时间:9/13/2022 更新时间:9/13/2022 访问量:98

问:

我将尝试制作一个高带宽应用程序,该应用程序可以与本地局域网中的两台计算机以及互联网上的两台计算机进行通信。UDP 因其无状态以及其用于 LAN 的组播功能而变得很有吸引力。

不过,我注意到,我不知道如何处理两台快速计算机之间的缓慢连接。假设计算机 A 和计算机 B 的速度无限快。但是,在网络中的某个点上,存在512kbit/s的瓶颈。如果您尝试发送的邮件数量超过瓶颈允许的范围,会发生什么情况?这与TCP有何不同?

数据包是否只是被丢弃,并且您必须实现错误处理以重新发送数据包并提高/减少您自己设置的带宽限制?需要执行的操作是否根据您的操作系统而变化?

网络编程 UDP 语言无关

评论

0赞 Some programmer dude 9/13/2022
除非通信可以在这里和那里处理一些丢失的包,否则您需要在 UDP 之上实现某种协议来处理排序和重传等事情。然后,您还可以添加拥塞处理来克服此类瓶颈。基本上重新实现TCP,或者至少是其中的一些主要部分。

答:

1赞 evansrhonda 9/13/2022 #1

UDP 最适合概率系统,这些系统可以处理缺失数据。例如,如果通过 UDP 的实时语音连接丢失了数据包,则可以只让用户听到音频中断,而不是尝试修复数据包丢失。

当然,一些粗略的纠错和检测通常是有用的。但是,每当您这样做时,您都处于一个以重新实现 TCP 而终止的频谱上。因此,如果您可以对数据包问题进行非常基本的处理,那么 UDP 就可以了。如果您需要更复杂的流量保护,也许 UDP 不是最佳方法。

带宽就是一个很好的例子。发送方可以记录自给定时间以来发送的数据包数量,并定期将其与其他数据一起发送给接收方。接收方可以使用这个简单的计数和时间范围来确定他们只获得了发送的数据包的 10% 左右,并可能要求发送方使用保真度较低的格式。这不是很复杂,可以作为一种粗略的措施。但是,如果您尝试执行诸如发送所有数据包的索引之类的操作,以便收件人可以找出丢失的数据包列表并请求它们,那么您将进入重新实现 TCP 区域。

至于瓶颈到底发生了什么,就要看瓶颈到底是什么了。如果将数据包放入队列中,接收方将观察到时间膨胀(数据包以“慢动作”到达),并最终突然停止(当瓶颈耗尽数据包缓冲区并崩溃时)。或者瓶颈可能只是在繁忙时丢弃数据包,因此实际上每个数据包只有 x% 的几率成功传输。

使用 TCP 时,确认消息将开始延迟或无法到达。TCP 非常复杂,但从本质上讲,它会注意到这些缺失的 ack 并降低传输速率。一段时间后,连接应自动调整为 512 kbps 左右。与 UDP 不同,这是自动的,应用程序程序员无需实现任何特定机制。

评论

0赞 Kaiden Prince 9/13/2022
我追求的是“最终的一致性”。需要发送的总数据是预先确定的,所有数据是否按顺序排列并不重要。确认每个数据包并不重要,但所有数据最终到达很重要。只有一个客户端说“我需要对象 302 的 0-100 部分”,如果客户端错过了部件,只需重新请求它们,这似乎是微不足道的。即使使用 TCP,我也可能会实现大部分相同的处理,例如,如果对象的一小部分需要更新。TCP 的缺点是 ACK,但优点是自动带宽控制。
0赞 Matt Timmermans 9/14/2022
@KaidenPrince en.wikipedia.org/wiki/Fountain_code