这里先说明一下,如果同时发送多个分组时,最需要处理的问题就是接受方收到分组时,并非按照顺序收到分组的,有可能序号小的分组先达到,这时就会出现了乱序。
回退N步协议(GBN)
在回退N步法中允许发送多个分组而不需要等待确认,但它也受限于在流水线中未确认的分组数不能超过某个最大允许数N。如下图,我们将基序号定义为最早的未确认分组的序号,将下一个序号(nextseqnum)定义为最小的未使用序号(即下一个待发送分组)。
此时我们可以将序号分成4段。在[0, base-1]段内的序号对应已发送并且已经确认的分组序号,[base,nextseqnum]段内对应已经发送但未确认的分组序号,[nextseqnum, base+N-1]段内表示即将要被发送的分组序号。而那些大于base+N的序号目前还不能使用,直到当前流水线中未被确认的分组得到确认,窗口整体向右移动之后,才能够被使用。
所以,我们常把N称之为窗口长度,由于窗口在序号范围内移动,也被GBN协议称之为滑动窗口协议。
对于GBN协议,计算机A(发送方)需要响应以下两个事件:
1、收到一个ACK:在GBN协议中,对序号为n的分组的确认采取累计确认的方式。也就是说,当A收到序号为n的分组时,表明分组n以及n之前的分组已经被B正确接受了。
2、超时事件: 当久久没有收到ACK时,A就认为它发送的分组已经丢失了,这时A会重传所有已发送但还未被确认的分组。这个时候需要注意的是,并不是为每个分组设置一个定时器,而是在序号[base,nextseqnum-1]中,设置一个定时器,当base发送的那一刻,就开始计时,当收到一个ACK时,则刷新重新开始计时。
计算机B(接收方)则需要处理一下事件:
如果一个序号为n的分组被正确收到,并且按序(所谓按序就是指n-1的分组也已经收到了),则B为分组n发送一个ACK,否则,丢弃该分组,并且为最近按序接收的分组重新发送ACK。
接收方的这种处理方式,意味着如果n被正确交付,则意味着比n小的所有分组也被正确交付了。