好的,我正在为网络课程编程,并且必须使用 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,如果应用程序要发送更多数据包,则丢弃其余数据包。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)