使用回退N协议
回退N协议,也称为回退N自动重传请求,是一个数据链路层协议,它使用滑动窗口方法来可靠且顺序地传递数据帧。它是一种滑动窗口协议的示例,发送窗口大小为N,接收窗口大小为1。
工作原理
回退N ARQ允许在收到第一个帧的确认之前发送多个帧。这些帧按顺序编号,并且数量有限。可以发送的最大帧数取决于发送窗口的大小。如果在商定的时间段内未收到某个帧的确认,则从该帧开始的所有帧都将重新传输。
发送窗口的大小决定了出站帧的序列号。如果帧的序列号是一个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。
回退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 //check if window is full 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 // Resend all frames if acknowledgement havn’t been received 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 end
回退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
广告