最近在恶补计算机网络的知识,看到了 TCP 协议部分,在第七版 164 页,阐述 TCP 是回退 N 步( GBN )还是选择重传(SR)有这样的论述:
“TCP 看起来更像是 GBN 风格的协议,但是 TCP 和 GBN 有着显著的区别。许多 TCP 实现会将正确接收但失序上网报文段缓存起来。
另外考虑一下,当发送方发送一组报文段 1,2 ,…,N ,并且所有报文段都按序无差错地到达接收方时会发生的情况。
进一步假设对分组 n<N 的确认报文丢失,但是其余 N-1 个确认报文分别在超时以前到达发送端,这时又会发生的情况。在该例中,Go-Back-N 不仅会重传分组 n ,还会重传所有后继的分组 n+1,n+2,….,N 。
在另一方面,TCP 却至多重传一个报文段,即报文段 n 。此外,如果对报文段 n+1 的确认报文在报文段 n 超时之前达到,TCP 甚至不会重传报文段 n.”
很疑惑,GBN 不是累计确认吗? 如果除了 n 其余的 ACK 传回发送方,那么发送方收到了比 n 更高的比如 N > n 的 ACK ,不就确认了这个 N 之前的分组都已经被交付了吗?为什么还会重传 n, n + 1 ,n + 2 ,……,N ?
“TCP 看起来更像是 GBN 风格的协议,但是 TCP 和 GBN 有着显著的区别。许多 TCP 实现会将正确接收但失序上网报文段缓存起来。
另外考虑一下,当发送方发送一组报文段 1,2 ,…,N ,并且所有报文段都按序无差错地到达接收方时会发生的情况。
进一步假设对分组 n<N 的确认报文丢失,但是其余 N-1 个确认报文分别在超时以前到达发送端,这时又会发生的情况。在该例中,Go-Back-N 不仅会重传分组 n ,还会重传所有后继的分组 n+1,n+2,….,N 。
在另一方面,TCP 却至多重传一个报文段,即报文段 n 。此外,如果对报文段 n+1 的确认报文在报文段 n 超时之前达到,TCP 甚至不会重传报文段 n.”
很疑惑,GBN 不是累计确认吗? 如果除了 n 其余的 ACK 传回发送方,那么发送方收到了比 n 更高的比如 N > n 的 ACK ,不就确认了这个 N 之前的分组都已经被交付了吗?为什么还会重传 n, n + 1 ,n + 2 ,……,N ?