繁体   English   中英

UDP根本不可靠吗?

[英]UDP is not reliable at all?

我设计了一个系统,在该系统中,我使用UDP向与同一访问点连接的某些客户端发送广播消息。 我正在使用访问点连接服务器和所有其他客户端。 问题出在广播上。 当我向客户端广播一条800字节的消息时,接收完全是随机的。 有时客户可以获取消息,有时则不能。 我尝试过多次广播,以便至少通过一次广播并覆盖所有客户。 但是,即使这样有时也不起作用。 为什么丢包? 数据包大小有问题吗? 我应该如何使其可靠? 哪些因素可能导致这种情况? 我有40-50个客户端连接到AP。 接入点专用于此应用程序,并且没有Internet连接。

在以下方面,UDP本质上是不可靠的:

  • UDP数据包可能会丢失,并且
  • UDP协议没有提供机制来判断数据包是否丢失或重新发送。

为什么丢包?

通常,有多种可能的原因:

  • 数据包可能路由错误,
  • 数据包可能被防火墙“吞噬”,
  • 数据包可能由于网关拥塞而被丢弃,
  • 数据包可能由于端点拥塞而被丢弃,或者
  • 数据包可能由于网络级问题而丢失; 例如碰撞或传输错误。

数据包大小有问题吗?

是。 如果UDP数据包太大,则可能需要分段(在IP数据包级别)。 如果任何碎片丢失,则接收方无法重组数据包,并且整个UDP数据包都会丢失。 (没有重新传输丢失的碎片的机制。)

参考: http : //pcvr.nl/tcpip/udp_user.htm#11

因此,大UDP数据包丢失的可能性更大。

请注意,当IP数据包大小超过链接的MTU时,就会发生分段。 对于以太网链路,MTU通常约为1500个八位位组或更多。 但是IPv4规范允许MTU低至576个八位位组。 如果减去IP和UDP标头的大小,则在可能进行分段之前,UDP数据包的最小有效载荷大小为534个八位位组。

我应该如何使其可靠?

这些事情可能会有所帮助:

  • 选择不会导致碎片的最大UDP数据包大小。
  • 实施您的软件以尽快读取数据包...避免接收操作系统丢弃数据包。
  • 避免通过(可能)拥塞的网络链路发送UDP数据包。
  • 避免在太短的时间内发送太多的数据包。

但是,从上述意义上讲,没有什么能使UDP可靠。 该协议本质上是不可靠的。 如果需要可靠性,请使用TCP或在应用程序协议级别实现自己的可靠性机制。 前者可能是更好的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM