networking - 丢失 UDP 数据包的可能性有多大?

标签 networking udp packet-loss

好的,所以我正在为我的网络类(class)编程,我必须使用 UDP 在 Java 中实现一个项目。我们正在实现一个 HTTP 服务器和客户端以及一个以指定概率破坏数据包的“gremlin”函数。 HTTP 服务器必须在应用层将一个大文件分成多个段,然后通过 UDP 发送给客户端。客户端必须在应用层重新组装接收到的段。然而,我想知道的是,如果 UDP 根据定义是不可靠的,为什么我必须在这里模拟不可靠性?
我的第一个想法是,也许这仅仅是因为我的导师在我们的案例中计算,客户端和服务器都将在同一台机器上运行,并且即使通过 UDP,文件也会从一个进程传输到另一个进程 100% 可靠,因为它位于同一台计算机上的两个进程之间。
这使我首先质疑如果服务器和客户端被保证是同一物理机器上的两个进程,UDP 是否真的会丢失数据包、损坏数据包或无序传递数据包,保证严格路由仅在本地主机上,这样它就不会通过网络出去。
我还想知道,一般来说,对于给定的数据包,UDP 在用于促进​​两个地理位置相当的主机之间通过开放互联网进行通信时丢弃/损坏/或乱序传递数据包的大致概率是多少彼此相距很远(比如说类似于美国普通宽带用户与 Google 的 CDN 之一之间的路由)?我主要是想大致了解通过 UDP 通信时所经历的情况,它是否会丢弃/损坏/错误排序大约 25% 的数据包,或者更像是大约 0.001% 的数据包数据包?
非常感谢任何可以为我解答这些问题的人。

最佳答案

数据包丢失的发生有多种原因。这主要是由个别链路上的错误和网络拥塞引起的。

当链路正常工作时,由于链路错误导致的丢包率非常低。低于 0.01% 并不罕见。

由于拥塞导致的数据包丢失显然取决于链路的繁忙程度。如果整个路径上有备用容量,则此数字将为 0%。但是随着网络变得繁忙,这个数字会增加。当流量控制正确时,这个数字不会很高。几个丢失的数据包通常就足够了,以至于有人会降低其传输速度以阻止数据包由于拥塞而丢失。

如果丢包率达到 1%,那就是有问题。这可能是您的拥塞控制算法如何响应数据包丢失的错误。如果它一直以相同的速率发送数据包,当网络拥塞和丢包时,丢包可以推得更高,如果软件行为不端,丢包可能达到 99%。但这取决于所涉及的链接类型。千兆以太网使用背压来控制流量,因此如果从源到目的地的路径是单个千兆以太网段,则发送应用程序可能会简单地变慢并且永远不会看到实际的数据包丢失。

为了在丢包的情况下测试软件的行为,我建议进行两种不同的模拟。

  • 在每个数据包上以 10% 的概率丢弃它并以 90% 的概率传输它
  • 每秒最多传输 100 个数据包或每秒最多 100KB,如果应用程序发送更多数据包,则丢弃其余数据包。
  • 关于networking - 丢失 UDP 数据包的可能性有多大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15060180/

    相关文章:

    python - Twisted Python 通过网络交换机连接

    java - 如何检查指定端口是否可以通信?

    c# - C#套接字编程错误

    ios - codenameone 多播 udp 的 IOS 权利

    c - 调试想法来调查数据包丢失?

    sockets - HTTP 丢包

    java - 安卓UDP丢包

    swift - Alamofire:缓存下载到 Documents 文件夹的大文件

    linux - 状态 FIN_WAIT_1 出现问题

    c++ - UDP 服务器发送回复失败,sendto 返回 -1,errno 为 22