Go-Back-N ARQ
Go-Back-N自动重复请求(Go-Back-NARQ)是一种数据链路层协议,它使用滑动窗口方法来可靠且顺序地传递数据帧。在滑动窗口协议的情况下,发送窗口大小为N,接收窗口大小为1。
工作原则
Go–Back–NARQ使用协议流水线的概念,即在接收到第一个帧的确认之前发送多个帧。帧被顺序编号,并且帧数量有限。可以发送的最大帧数取决于发送窗口的大小。如果在约定的时间段内未收到帧的确认,则将从该帧开始的所有帧重新发送。
发送窗口的大小确定出站帧的序列号。如果帧的序列号是n位字段,则可以分配的序列号范围是0到2n-1。因此,发送窗口的大小为2n-1。因此,为了适应2n-1的发送窗口大小,选择了一个n位序列号。
序列号编号为模n。例如,如果发送窗口大小为4,则序列号将为0、1、2、3、0、1、2、3、0、1,依此类推。序列号中的位数为2,以生成二进制序列00、01、10、11。
接收窗口的大小为1。
Go-Back-N协议的发件人站点算法
begin
frame s; //s denotes frame to be sent
frame t; //t is temporary frame
S_window = power(2,m) – 1; //Assign maximum window size
SeqFirst = 0; // Sequence number of first frame in window
SeqN = 0; // Sequence number of Nth frame window
while (true) //check repeatedly
do
Wait_For_Event(); //wait for availability of packet
if ( Event(Request_For_Transfer)) then
//检查窗口是否已满
if (SeqN–SeqFirst >= S_window) then
doNothing();
end if;
Get_Data_From_Network_Layer();
s = Make_Frame();
s.seq = SeqN;
Store_Copy_Frame(s);
Send_Frame(s);
Start_Timer(s);
SeqN = SeqN + 1;
end if;
if ( Event(Frame_Arrival) then
r = Receive_Acknowledgement();
if ( AckNo > SeqFirst && AckNo < SeqN ) then
while ( SeqFirst <= AckNo )
Remove_copy_frame(s.seq(SeqFirst));
SeqFirst = SeqFirst + 1;
end while
Stop_Timer(s);
end if
end if
//如果未收到确认,则重新发送所有帧
if ( Event(Time_Out)) then
TempSeq = SeqFirst;
while ( TempSeq < SeqN )
t = Retrieve_Copy_Frame(s.seq(SeqFirst));
Send_Frame(t);
Start_Timer(t);
TempSeq = TempSeq + 1;
end while
end if
endGo-Back-N协议的接收站点算法
Begin
frame f;
RSeqNo = 0; // Initialise sequence number of expected frame
while (true) //check repeatedly
do
Wait_For_Event(); //wait for arrival of frame
if ( Event(Frame_Arrival) then
Receive_Frame_From_Physical_Layer();
if ( Corrupted ( f.SeqNo )
doNothing();
else if ( f.SeqNo = RSeqNo ) then
Extract_Data();
Deliver_Data_To_Network_Layer();
RSeqNo = RSeqNo + 1;
Send_ACK(RSeqNo);
end if
end if
end while
end