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