22

好的,所以我正在为我的网络课程编程,我必须使用 UDP 在 Java 中实现一个项目。我们正在实现一个 HTTP 服务器和客户端以及一个以指定概率破坏数据包的“gremlin”函数。HTTP 服务器必须在应用层将一个大文件分成多个段,然后通过 UDP 发送给客户端。客户端必须在应用层重新组装接收到的段。然而,我想知道的是,如果 UDP 根据定义是不可靠的,为什么我必须在这里模拟不可靠性?

我的第一个想法是,也许这仅仅是因为我的导师在我们的案例中计算,客户端和服务器都将在同一台机器上运行,并且即使通过 UDP,文件也会从一个进程传输到另一个进程 100% 可靠,因为它位于同一台计算机上的两个进程之间。

这使我首先质疑如果服务器和客户端被保证是同一物理机器上的两个进程,UDP 是否真的会丢失数据包、损坏数据包或无序传递数据包,保证严格路由仅在本地主机上,这样它就不会通过网络出去。

我还想知道,一般来说,对于给定的数据包,UDP 在用于促进​​两个地理位置相当的主机之间通过开放互联网进行通信时丢弃/损坏/或乱序传递数据包的大致概率是多少彼此相距很远(比如说类似于美国普通宽带用户与 Google 的 CDN 之一之间的路由)?我主要只是想大致了解通过 UDP 通信时所经历的情况,它是否会丢弃/损坏/错误排序大约 25% 的数据包,或者更像是大约 0.001% 的数据包数据包?

非常感谢任何可以为我解答这些问题的人。

4

3 回答 3

11

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

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

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

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

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

  1. 在每个数据包上以 10% 的概率丢弃它并以 90% 的概率传输它
  2. 每秒最多传输 100 个数据包或每秒最多 100KB,如果应用程序发送更多数据包,则丢弃其余数据包。
于 2013-05-25T11:09:05.023 回答
10

如果 UDP 根据定义是不可靠的,为什么我必须在这里模拟不可靠性?

拥有一个受控机制来模拟最坏的情况以及您的客户端和服务器如何响应它们是非常有用的。讲师可能会希望您展示该系统的稳健性。

您还在这里谈论有效负载有效性,而不仅仅是丢包。

这让我质疑如果服务器和客户端是同一台机器上的两个进程并且它不必通过实际网络出去,UDP、丢失数据包、损坏数据包还是乱序传递。

环回适配器显然不太可能,但这并非不可能。

我在这里这里找到了一些关于该主题的论坛帖子。

我还想知道实际上丢失数据包、损坏数据包或让它们在现实中乱序交付的可能性通常是通过互联网在两个地理位置相距遥远的主机之间进行的。

这个问题可能需要缩小一点。应用级别(数据包大小和频率)以及沿路径的路由器和交换机的限制/流量有几个因素。

我在这方面找不到任何确切的数字,但它似乎相当低……比如低于 5%。

您可能对Internet 流量报告以及此类页面感兴趣

于 2013-02-25T06:13:29.860 回答
1

我通过 wifi 向一些 nanoleaf 面板发送垃圾邮件 udp 数据包,我的数据包丢失率大约为 1/7000。

我认为这取决于很多因素。

于 2021-06-28T07:59:31.190 回答