【发布时间】: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