情景演示
准备开始
接收方Receiver
发送方Sender
情景演示会在关键时刻自动暂停,按“继续”或空格键往下看。自由运行时,点击飞行中的数据段或 ACK 可以把它丢弃。调大“发送间隔”可以看到窗口没有发满的情况。
下方是发送方的发送缓冲区,上方是接收方的接收缓冲区,数据段从下往上发,ACK 从上往下回。每一格是一个报文段。看窗口怎样随着 ACK 向右滑动,丢包后又怎样靠重传把空缺补上。
情景演示会在关键时刻自动暂停,按“继续”或空格键往下看。自由运行时,点击飞行中的数据段或 ACK 可以把它丢弃。调大“发送间隔”可以看到窗口没有发满的情况。
ACK=n 的意思是:n 之前的字节都收到了,下一个期待 n。中间某个 ACK 丢了也不要紧,后面更大的 ACK 会把它覆盖。
5 没到时,即使 6、7、8 已经到了,接收方的 ACK 也只能是 5,发送窗口左沿就卡在 5。可用窗口用完后发送方只能停下等待。5 补上后,ACK 一次跳过所有已缓存的段。SACK 能告诉发送方 6–8 已到、不必重传,但左沿同样要等 5。
窗口只是上限。应用层数据来得慢时,一个往返时间内发不满窗口,窗口里同时有“已发送未确认”和“可发送未发送”两部分。可用窗口 = W − 已发送未确认。
窗口左沿是 SND.UNA,收到新的 ACK 就右移;发送方最多同时有 W 个“已发送未确认”的报文段,不必发一个等一个。
收到 3 个重复 ACK 说明后面的段到了、只缺这一个,立即快速重传。如果连重复 ACK 也收不到,就只能等重传计时器超时。
每格代表一个报文段,序号按段计数而不是按字节;窗口大小固定,没有模拟拥塞控制和延迟确认;超时只重传最早未确认的那一段。
学完上面的内容,来检验一下。每题作答后马上看到解析;点「重做练习」清空重来。