为啥 XMPP 消息有时会在移动设备上丢失

Posted

技术标签:

【中文标题】为啥 XMPP 消息有时会在移动设备上丢失【英文标题】:Why do XMPP messages sometimes get lost on mobile devices为什么 XMPP 消息有时会在移动设备上丢失 【发布时间】:2016-10-14 12:29:09 【问题描述】:

This question 询问当移动设备没有稳定连接时丢失 XMPP 消息该怎么办,但我真的不明白为什么包首先会丢失。

我记得曾经读过服务器和客户端之间的流在连接突然丢失时保持打开状态,并且只有在连接超时时才会被破坏。这意味着服务器通过流发送到达的消息,即使断开连接的客户端无法再接收这些消息。

一段时间以来,我对这个解释感到满意,但开始想知道为什么核心 XMPP 会缺少如此重要的功能。最终我注意到确保 XMPP 协议中的正确传输是多余的,因为底层 TCP 应该已经确保消息的正确传输,但是由于丢失消息引起的各种问题,这似乎不是真的。

为什么 TCP 不足以确保消息正确发送或正确失败,以便服务器知道它必须稍后发送消息?

【问题讨论】:

【参考方案1】:

为什么在这种情况下 TCP 不足以确保正确传输(或正确的错误处理,以便服务器知道必须再次发送消息)?

应用程序提供需要发送到其 TCP 的数据。 TCP 根据需要对数据进行分段,并在已建立的连接上将它们发送出去。应用程序将确保数据包到达另一端的负担转交给 TCP。 (这并不意味着应用程序不应该重新传输。如果没有正确的响应,应用程序级协议可以定义重新发送消息)

TCP 具有重传机制。发送给对等方的每个数据包都需要得到确认。在 TCP 收到确认之前,它的 sendQ 中应该有数据包。一旦收到对发送数据包的确认,它们就会被删除。

如果数据包丢失,确认不会到达。 TCP 进行重新传输。最终放弃。通知需要采取行动的应用程序。数据包丢失可能超出 TCP 的控制范围。因此,TCP 提供了尽力而为的可靠服务。

【讨论】:

当然TCP不能总是成功传输消息,但是如你所说,它应该通知应用程序,在这种情况下,将消息添加到离线消息中,并在连接时重新提交再次可用。 当连接消失时,它的所有状态也消失了。客户端和服务器应用程序应该从一开始就重新启动。他们应该有能力查看需要重新发送哪些数据。不是 TCP 当然服务器应该知道它必须稍后发送消息,但它没有。这就是我要问的。

以上是关于为啥 XMPP 消息有时会在移动设备上丢失的主要内容,如果未能解决你的问题,请参考以下文章

由于 openfire 连接丢失而丢失消息

Youtube API:搜索可在移动设备上播放的视频

Youtube API:搜索可在移动设备上播放的视频

为啥字体大小(和其他元素)在移动设备上显得如此之小

为啥在移动设备上点击时会应用悬停样式?

为啥这个脚本不能在 android、iphone、ipad 等移动设备上运行?