关于网络:TCP和Go Back N的区别

Differences between TCP and Go Back N

我正在阅读 Kurose 的 Computer Networking,在阅读 TCP 章节关于 TCP 和 Go Back N 之间的区别时,我发现了一些我不完全理解的东西。这本书对两种协议之间的一些差异进行了以下说明:

"many TCP implementations buffer correctly received but out-of-order segs rather than discard.

also, suppose a seqof segs 1, 2, a€|N, are received correctively in-order,ACK(n),
n < N, gets lost, and remaining N-1 acks arrive at sender before their respective timeouts TCP retransmit most one seg, i.e., seg n, instead of pkts, n, n+1, a€|, N TCP wouldna€?t even retransmit seg n if ACK(n+1) arrived before timeout for seg n"

我了解无序段的缓冲,但我不了解其他行为,我认为这是因为我不完全了解 Go Back N。按照那个例子,如果 ACK(nt)在 Go Back N 超时之前到达,协议将继续,就好像实际上接收到了 seg n,这是这种情况,因为累积的 ACKS......所以,Go Back N 也不会重新传输该段......或者我错过了什么吗?


我正在查看这个问题的答案,在找到它之后,我认为即使这是旧的,它可能会对某人有所帮助,所以我从 Kurose-Ross 计算机网络 - 自上而下的方法中复制了一个片段:

TCP 是 GBN 还是 SR 协议?回想一下,TCP 确认是
累积和正确接收但无序的段不会由接收器单独确认。因此,TCP 发送方只需要维护已发送但未确认字节的最小序列号(SendBase)和下一个要发送的字节的序列号(NextSeqNum)。从这个意义上说,TCP 看起来很像 GBN 风格的协议。但
TCP 和 Go-Back-N 之间存在一些显着差异。许多 TCP 实现
将缓冲正确接收但无序的段 [Stevens 1994]。
还要考虑当发送方发送一系列分段 1、2、...时会发生什么。 . . ,
N,并且所有分段都按顺序到达接收器,没有错误。进一步假设
数据包 n < N 的确认丢失,但剩余的 N a€" 1 确认 在各自的超时之前到达发件人。在这个例子中,GBN 不仅会重新传输数据包 n,还会重新传输所有后续数据包 n 1、n 2、 . . . , N. 另一方面,TCP 最多会重传一个段,即段 n.此外,如果确认,TCP 甚至不会重新传输段 n 对于段 n 1 在段 n.

的超时之前到达

我的结论:实际上 TCP 是 GBN 和 SR 的混合体。


看这些链接,GBN和SR就很容易理解了:

返回 N 协议 (GBN):
在此处输入链接描述

选择性重复协议 (SR):
https://www.youtube.com/watch?v=Cs8tR8A9jm8

在GBN和SR协议中,接收方必须为它在滑动窗口中接收到的所有段发送ACK消息。

在 TCP 协议中,接收方不会为它在滑动窗口中接收到的所有段发送 ACK 消息。接收方仅发送 ACK 以获取它期望的下一个段。这意味着将更少的 ACK 消息发送给发送者。因此,它有利于减少网络拥塞。

在异常情况下,一些段丢失(由于网络拥塞或误码),TCP 传输时间比 GBN 和 SR 长,因为接收方不能同时发送 2 个 ACK?? 消息。

在我看来,丢失部分很少发生。因此 TCP 协议针对正常情况而不是异常情况进行优化。一般情况下,TCP优于GBN和SR


我也被书中的陈述弄糊涂了,但我想我找到了答案:

Consider also what happens when the sender sends a sequence of segments 1, 2, . . . , N, and all of the segments arrive in order without error at the receiver. Further suppose that the acknowledgment for packet n < N gets lost, but the remaining N a€" 1 acknowledgments arrive at the sender before their respective timeouts. In this example, GBN would retransmit not only packet n, but also all of the subsequent packets n + 1, n + 2, . . . , N. TCP, on the other hand, would retransmit at most one segment, namely, segment n. Moreover, TCP would not even retransmit segment n if the acknowledgment for segment n + 1 arrived before the timeout for segment n.

实际上,在上面的示例中,即使数据包 n+1 的 ACK 在其超时之前到达发送方,我们也必须知道数据包 n 的计时器可能在该到达之前已经超时。所以,由于数据包n超时,GBN到目前为止还没有看到ACK(n+1)ACK(n+2)...,它会触发n之后所有数据包的重传。

但是,对于 TCP,发送方只会在这个特定时刻再次发送数据包 n

附言这个问题已经很老了。但是,无论如何,希望这对任何人都有帮助。


引用说 ACK(n) 丢失了,而不是第 n 段丢失了。在这种情况下,不需要重新传输任何内容,因为 ACK(n x) 意味着成功接收到 n x 的所有内容。


ACK(n) 确认直到 n 的整个流的到达。所以 ACK(n+1) 表示直到 n+1 的所有内容都已到达,包括 n.