Go-Back-N ARQ協議


Go-Back-N 自動重傳請求 (Go-Back-N ARQ) 是一種資料鏈路層協議,它使用滑動視窗方法來可靠地順序傳輸資料幀。它是一種滑動視窗協議,傳送視窗大小為 N,接收視窗大小為 1。

工作原理

Go-Back-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。

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
         //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

Go-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

更新於:2019年7月30日

11K+ 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.