2013-02-25 119 views
14

好吧,所以我正在为我的网络课程进行编程,并且必须使用UDP实现一个使用Java的Java项目。我们正在实现一个HTTP服务器和客户端以及一个'gremlin'函数,该函数以指定的概率破坏数据包。 HTTP服务器必须在应用层将大文件分成多个段,并通过UDP发送到客户端。客户端必须在应用层重组收到的段。但是我想知道的是,如果UDP在定义上不可靠,为什么我不得不在这里模拟不可靠性?丢失UDP数据包的机会是多少?

我的第一个想法是,也许这只是因为我的老师认为在我们的情况下,客户端和服务器都将在同一台机器上运行,并且文件将从一个进程转移到另一个100%通过UDP,因为它位于同一台计算机上的两个进程之间。

这让我不禁要问,如果服务器和客户端是同一台机器上的两个进程,并且不需要出去,UDP是否会丢失数据包,是否会损坏数据包或将数据包乱序发送实际的网络。

我也想知道实际上丢失数据包的机会是什么,如果数据包损坏,或者让它们在现实中乱序发生,通常会通过互联网在两个地理上遥远的主机之间。

非常感谢任何能够帮助我解决这些问题的人。

+1

猜测你从来没有遇到过糟糕的互联网连接; p UDP主要用于场景中接收者不可能响应的场景。通过卫星,无线电波传输数据的示例 – leppie 2013-02-25 04:45:14

+0

而不是“接收机无法响应的地方”我会说它用于丢失数据包并不重要的场景,比如音频/视频流媒体,视频会议等 – Trap 2016-07-04 13:24:19

+0

从这里的经验讲,我有一个项目,其中两个程序通过UDP进行通信,并不时发生丢包,我无法想象为什么,他们运行在同一台计算机上并通过回环接口。所以是的,你必须实现你的gremlin函数是一件好事,因为尽管可靠性很高(我没有任何统计信息,但是我在回环上高于99.9%甚至更高),数据包丢失仍然会发生。 – soger 2016-12-31 14:52:30

回答

7

如果UDP定义不可靠,为什么我不得不在这里模拟不可靠性?

有一个受控的机制来模拟最坏的情况以及您的客户端和服务器如何响应它们是非常有用的。教练可能会希望您证明系统的可靠性。

您也在讨论有效负载有效性,而不仅仅是丢包。

这使我怀疑是否UDP,失去一个包,损坏的数据包,或提供其无序如果服务器和客户端是在同一台机器上的两个进程,它是不用去超出实际网络。

它明显不太可能通过回送适配器,但这不是不可能的。

我在主题herehere上发现了一些论坛帖子。

我也想知道,实际上失去了一个包,让它损坏,或让他们在现实中按顺序发送的机会通常会是在互联网上两个地理上遥远的主机之间。

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

我找不到任何硬数字,但它似乎相当低...像5%以下。

您可能会感兴趣The Internet Traffic Report以及可能的页面,如this

7

丢包发生的原因有很多。主要是由于个别链路和网络拥塞的错误。

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

拥塞造成的包丢失显然取决于链路的繁忙程度。如果整个路径上有剩余容量,则该数字将为0%。但是随着网络繁忙,这个数字会增加。当流量控制正确完成时,这个数字不会很高。一些丢失的数据包通常足以让某些人降低传输速度,足以阻止因拥塞而丢失数据包。

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

对于包丢失情况下的软件测试行为,我会建议两种不同的模拟。

  1. 在每个分组具有10%的概率下降,并以90%的概率
  2. 发送高达每秒或高达100个数据包以每秒100KB发送它,并且如果该应用程序拖放其余会发送更多。
+3

这里的数字来源会很有用。 – 2016-10-29 15:43:43