【问题标题】:Should I resend or reconnect if the acknowledgement for a sent message is missing?如果已发送消息的确认丢失,我应该重新发送还是重新连接?
【发布时间】:2021-04-27 02:59:09
【问题描述】:

在分布式系统中,为了确保对端正确接收到消息,我们可能会使用应用层确认机制(ACK)。

但是当客户端和服务端通过TCP或WebSocket连接时,如果发送者没有收到发送消息的应用层ACK,是否意味着连接断开,需要重新连接?

是否有可能数据或应用程序级别的 ACK 从应用程序级别丢失但实际上在 TCP 级别成功传输? (在这种情况下,重新发送消息可能更经济。)

【问题讨论】:

  • TCP 为您处理:“当 TCP 传输包含数据的段时,它会将副本放入重传队列并启动计时器;当收到该数据的确认时,段从队列中删除。如果在计时器用完之前没有收到确认,则重新传输该段。" TCP 保证传递和顺序到应用程序。
  • @RonMaupin 是的,我知道 TCP 中有确认,这就是为什么它被认为比 UDP 更可靠的原因。但是,为什么我们在应用程序级别需要 ACK 呢?我认为应用程序级别的 ACK 对于应用程序知道数据发送结果是必要的。我的问题更多是关于当应用程序级别的 ACK 接收失败时,应该重新连接 TCP 或 WebSocket 连接还是应该断开 TCP 连接?
  • 对于未确认的消息,通常有应用程序级别的重新发送逻辑。但是当你重新发送时,连接是否仍然存在?
  • 使用 TCP,您的应用程序不需要 ACK。连接的每一端都确保它发送的任何东西都会被另一端按顺序接收。这就像在每一侧的应用程序之间建立直接连接。 UDP 没有连接或任何保证,因此如果需要,您可以使用 TCP 或将其构建到应用层协议或应用程序中。

标签: sockets networking websocket server tcp


【解决方案1】:

通过跟踪建议的相关问题,我找到了一些很好的答案,说明为什么需要应用级 ACK:

Are application level Retransmission and Acknowledgement needed over TCP?

Can websocket messages get lost or not?

if my application is using tcp protocal? then do i need a retry mechanism in my Application?

因此,如果应用程序级别的问题可能导致消息(或其应用程序级别的 ACK)无法成功接收,重试可能是一种有意义的补救措施。

【讨论】:

    猜你喜欢
    • 2014-02-25
    • 1970-01-01
    • 2015-11-08
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多