9

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

“许多 TCP 实现缓冲正确接收但无序的段而不是丢弃。

另外,假设一个 seqof segs 1, 2, ...N,按顺序正确接收,ACK(n),n < N,丢失,并且剩余的 N-1 个 ack 在它们各自的超时之前到达发送方 TCP 重传大多数一个 seg "

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

4

5 回答 5

16

我正在查看这个问题的答案,在找到它之后,我想即使这很旧,它可能会对某人有所帮助,所以我从 Kurose-Ross Computer Networking - A top down approach 复制了一个片段:

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

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

于 2014-02-20T03:06:40.450 回答
2

看到这些链接,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

于 2017-09-18T05:11:01.610 回答
1

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

于 2012-09-27T18:40:13.363 回答
1

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

还要考虑当发送方发送一系列分段 1、2、...时会发生什么。. . , N, 并且所有段都按顺序到达接收器,没有错误。进一步假设数据包 n < N 的确认丢失,但剩余的 N – 1 个确认在它们各自的超时之前到达发送方。在本例中,GBN 不仅会重传数据包 n,还会重传所有后续数据包 n+1、n+2、……。. . , N。另一方面,TCP 最多会重传一个段,即段 n。此外,如果对段 n + 1 的确认在段 n 的超时之前到达,TCP 甚至不会重新传输段 n。

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

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

PS这个问题已经很老了。但是,无论如何,希望这可以帮助任何人。

于 2017-03-15T13:05:35.287 回答
0

ACK(n)确认整个流到达n. 所以ACK(n+1)说一切都n+1已经到来,包括n.

于 2012-09-27T06:43:04.387 回答