使用回退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

更新于: 2023年11月3日

34K+ 浏览量

启动您的职业生涯

通过完成课程获得认证

开始学习
广告