使用 TCP 时是否需要 ACK?

使用 TCP 时是否需要 ACK?

使用 TCP 等可靠协议时是否需要 ACK?它会产生多少开销/吞吐量损失?

答案1

使用 TCP 等可靠协议时是否需要 ACK?

是的。ACK 是使 TCP 成为可靠协议的机制。

如果从协议中删除 ACK,那么 TCP 将不再知道数据包是否已被丢弃或丢失,因此需要重新传输。

这会使它更像 UDP。


它会造成多少开销/吞吐量损失?

一般来说,这个问题无法回答,因为这取决于两个端点之间的网络状况。

显然,如果没有数据包丢失,则开销最低,但如果有大量数据包丢失,则开销将会高得多,因为数据被重新传输。


进一步阅读

答案2

您问的是“像 TCP/IP 这样的可靠协议”;我会回答 TCP/IP。

使用 TCP 时是否需要 ACK?

是的,它是 TCP/IP 的一个组成部分。TCP/IP 是一个滑动窗口协议ACK 允许接收方“滑动窗口”,从而允许发送方发送更多数据。如果没有 ACK,TCP/IP 将不会发送比窗口大小允许的更多的未确认数据。

如果没有滑动窗口,发送方就必须保留数据流的全部内容,以防接收方想要重新传输其中的某些部分。滑动窗口允许发送方只保留数据流的一小部分,以备可能的重新传输。

它会造成多少开销/吞吐量损失?

如果窗口大小适合网络条件,并且接收方到发送方的带宽未饱和,则 ACK(以及与之相伴的序列号)不会造成吞吐量损失。这是因为 TCP/IP 不要求在发送后续数据包之前确认数据包。在有利条件下,发送方可以不间断地发送,同时从接收方接收一连串 ACK。

答案3

为了知道另一端是否确实处理了数据,最好使用应用层 ACK。TCP 的可靠性本身并不能帮助应用程序了解数据是否确实已到达并已被另一端处理。人们普遍误以为 TCP 本身使通信可靠。通过 TCP 连接的数据可能会在发送方或接收方的缓冲区中滞留任意时间,并且如果连接中断,除非使用应用层 ACK,否则发送方无法知道接收方处理了多少数据。

开销是双方之间的额外往返,但如果通信持续进行,则并行发送数据时无需增加任何延迟。带宽开销非常小,接收方至少可以使用简单的 1 字节数据包进行 ACK,但在更复杂的情况下,ACK 数据包可能需要几十个字节。

相关内容