后退 N \rm N N帧协议 G B N \rm GBN GBN

G B N \rm GBN GBN发送方

.上层调用

上层要发送数据时,发送方先检查发送窗口是否已满。

如果未满,则产生一个帧并将其发送;如果窗口已满,发送方只需将数据返回给上层,暗示窗口已满.

.收到 A C K \rm ACK ACK

G B N \rm GBN GBN协议中,对 n n n号帧的确认采用累计确认,标明接收方已经收到 n n n号帧和它之前的全部帧

.超时事件

若出现丢失和时延过长帧时,发送方将重传所有已发送但未收到确认的帧


G B N \rm GBN GBN接收方

.若正确收到 n n n号帧,并且按序,那么接收方为 n n n帧返回一个 A C K \rm ACK ACK,并将该帧中的数据部分交给上层

.其余情况都丢弃帧,并为最近按序接收的帧重新发送 A C K \rm ACK ACK.接收方无需缓存任何失序帧,只需要维护一个信息: e x p e c t e d s e q n u m \rm expectedseqnum expectedseqnum(下一个按序接收的帧序号)

例子:

比如现在接收方收到了序号 0 , 1 0,1 0,1的帧,那么 e x p e c t e d s e q n u m = 2 \rm expectedseqnum=2 expectedseqnum=2

但是此时来了一个序号为 3 3 3的帧,那么会直接丢弃,并返回一个 A C K 1 \rm ACK1 ACK1

一个 G B N \rm GBN GBN协议的工作图解

GBN(后退n帧协议)与SR(选择性重传协议)_数据

这样做的弊端其实非常明显!!

一旦中间有一个帧丢失,那么需要重发后续所有帧!!这就做了很多无用功,所以有了

选择性重传协议 S R \rm SR SR

S R \rm SR SR发送方

Ⅰ Ⅰ .上层的调用

从上层收到数据后, S R \rm SR SR发送方检查下一个可用于该帧的序号.如果序号位于发送窗口内,则发送该数据帧.否则要么将数据缓存,要么返回给上层之后再传输

Ⅱ . Ⅱ. .收到 A C K \rm ACK ACK

S R \rm SR SR发送方将这个被确认的帧标记为已接收.如果该帧序号是窗口的下界,则窗口向前移动到最小序号的未被确认帧处.如果窗口移动了且有序号在窗口内的未发送帧,则发送这些帧.

Ⅲ . Ⅲ. .超时事件

只重传超时帧


S R \rm SR SR接收方

来者不拒(窗口内的帧)

S R \rm SR SR接收方将确认一个正确接收的帧而不管其是否按序,失序的帧将被缓存,并返回给发送方一个该帧的确认帧[收谁确认谁],直到所有帧(序号更小的帧)都被收到为止,这时将一批帧顺序交付上层,然后向前移动滑动窗口

GBN(后退n帧协议)与SR(选择性重传协议)_重传_02