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

Why do XMPP messages sometimes get lost on mobile devices

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

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

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

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

Why isn't TCP enough to ensure a proper transmission (or proper error handling, so the server knows the message has to be sent again) in this scenario?

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

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

如果有丢包,确认不会到达。 TCP 进行重新传输。最终给出 up.Notifies 需要采取行动的申请。数据包丢失可能超出 TCP 的控制范围。因此,TCP 提供尽力而为的可靠服务。