假设我在同一个数据中心有两台机器,但不一定在同一个机架中。
在这两台机器之间使用 UDP 发送数据包时,丢包有多常见?
我的假设是,由于机器之间最多只有几个交换机,因此根本不会丢弃数据包。
同一数据中心内的无序数据包到达有多常见?我的假设是 99.9% 的时间只有一条路线,所以这不会发生。
然而,每当我发现自己以绝对的方式思考时,我知道我一定错过了一些东西!
我需要哪些背景信息才能更好地了解何时会丢弃数据包,以及它们可能被丢弃的频率,以及同一数据中心中的机器乱序到达的频率?
最终,当位于同一数据中心的不同 Linode VPS 实例之间进行通信时,我试图在使用多播 UDP 或 PGM 之间做出决定。信息必须按顺序到达。当然,那时 UDP 听起来并不那么好!
但是,如果可以期望在同一个数据中心内实现几乎完美或完美的交付,那就没问题了。但是,我正在测试这个假设。
谢谢。
您不能依赖 UDP 按顺序传送数据包,因为规范不提供这些保证。即使假设最理想的情况是两台主机之间的一根以太网电缆,仍然存在操作系统、网络堆栈、NIC 驱动程序和您编写的 libc 实现的问题。
在该链中的每一步,该代码的编写者将选择不优先排序 UDP 数据包,即使它们按顺序到达,原因很简单,他们不必这样做。
一个人为的例子可能是传入数据包被读入的数据结构,它可能是一个环形缓冲区。按顺序到达的数据包将按顺序放入环形缓冲区,但驱动程序编写者将它们按内存顺序转储到网络代码的上层可能更简单,因此它们的顺序随机化。
以您的情况为例,在共享基础架构上运行的虚拟机将针对卷而不是性能运行,那么预测将接收 UDP 数据包的顺序的概率将很低。
简而言之,如果规范说您不能依赖 UDP 数据包排序。您不能依赖它,也不能尝试调整环境以提供比规范承诺的更强大的保证。
如果有人对实验感兴趣,只需使用 Wireshark。如果有人真的了解我们关于慢速连接或丢包的情况,我们只需在交换机上镜像一个端口,用 Wireshark 连接一台笔记本电脑并查看一下。
几乎任何交换机都会在任何时候导致两个数据包的重新排序,并且被许多网络协议(如 PGM)考虑在内。
需要考虑的一件事是,大多数数据中心会阻止数据报并阻止多播,以简化和减少其网络基础设施的开销。
仅当您启用了 PGM 路由器辅助并感知服务器和客户端之间的网络元素时,才需要使用 IP/PGM 协议本身,否则请坚持使用封装在 UDP 中的 PGM 并节省管理应用程序权限的负担。
如果您使用像 ØMQ 这样的消息传递层,您可以将 IP/PGM、UDP/PGM 或 TCP 覆盖网络的选择推迟到部署和集成。
我编写了一个简单的 .net 多播应用程序,可以测量在指定压力下丢弃的数据包。
你可以在这里下载它:SimpleMulticastAnalyzer。
享受。