GBN 接收方没收到 n ,就不会传送 n 及之后包的 ACK ,即使它收到了 n+1 到 N 的包,也只会发送 ACK(n-1)
ruimz
2022-02-26 13:04:14 +08:00
感觉 OP 的理解是对的,对此我想到的可能解释是此处的 GBN 没有启用累计确认
jedihy
2022-02-27 03:45:41 +08:00
这段文字的第一句话就概括了区别,TCP 缓存失序报文段,GBN 不会。所以 TCP 看到重复的 ACK(n),只会重传 n 。接受方收到重传的 n 之后就会发送 ACK(N+1),到此所有报文得到确认。
GBN 重传 n...N ,就是因为它的接受缓存里面没有这些报文,乱序报文都会被丢弃。
说实话,这些书和真正的实现有一些脱轨了,特别是 loss recovery ,RACK 完全改变了 loss recovery 。建议看看 RFC6675 (SACK), RFC6582 (NewReno style loss recovery) 以及 RFC 8985 (RACK)。这三种 loss recovery 是真正主流操作系统在用的 ( Windows 和 Linux )。RFC6582 是在 SACK 没有启用的时候的 loss recovery 。