使用選擇重發協議


選擇重發協議,也稱為選擇重發 ARQ(自動重發請求),是一種資料鏈路層協議,它使用滑動視窗方法來可靠地傳送資料幀。在這裡,只有錯誤的或丟失的幀被重新傳輸,而良好的幀被接收並緩衝。

它使用兩個大小相等的視窗:一個傳送視窗,用於儲存要傳送的幀;一個接收視窗,用於儲存接收器接收到的幀。視窗大小是幀最大序列號的一半。例如,如果序列號為 0-15,則視窗大小為 8。

工作原理

選擇重發協議允許傳送多個幀,這取決於傳送視窗中幀的可用性,即使它在此期間沒有收到任何幀的確認。可以傳送的最大幀數取決於傳送視窗的大小。

接收器記錄最早的錯誤或未接收幀的序列號。然後,它用它已接收的後續幀填充接收視窗。它將缺失幀的序列號與每個確認幀一起傳送。

傳送器繼續傳送其傳送視窗中的幀。一旦它傳送了視窗中的所有幀,它就會重新傳輸確認中給出的序列號的幀。然後它繼續傳送其他幀。

選擇重發協議的傳送端演算法

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();
            //Resend frame whose sequence number is with ACK
            if ( r.type = NAK) then
               if ( NAK_No > SeqFirst && NAK_No < SeqN ) then
                  Retransmit( s.seq(NAK_No));
                  Start_Timer(s);
               end if
                  //Remove frames from sending window with positive ACK
               else if ( r.type = ACK ) then
                  Remove_Frame(s.seq(SeqFirst));
                  Stop_Timer(s);
                  SeqFirst = SeqFirst + 1;
               end if
         end if
         // Resend frame if acknowledgement haven’t been received
         if ( Event(Time_Out)) then
            Start_Timer(s);
            Retransmit_Frame(s);
         end if
end

選擇重發協議的接收端演算法

Begin
   frame f;
   RSeqNo = 0; // Initialise sequence number of expected frame
   NAKsent = false;
   ACK = false;
   For each slot in receive_window
   Mark(slot)=false;
   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 ) AND NAKsent = false) then
               SendNAK(f.SeqNo);
               NAKsent = true;
            end if
            if ( f.SeqNo != RSeqNo AND NAKsent = false ) then
               SendNAK(f.SeqNo);
               NAKsent = true;
               if ( f.SeqNo is in receive_window ) then
                  if ( Mark(RSeqNo) = false ) then
                     Store_frame(f.SeqNo);
                     Mark(RSeqNo) = true;
                  end if
               end if
               else
               while ( Mark(RSeqNo))
                  Extract_Data(RSeqNo);
                  Deliver_Data_To_Network_Layer();
                  RSeqNo = RSeqNo + 1;
                  Send_ACK(RSeqNo);
               end while
            end if
         end if
   end while
end

更新於:2019年7月30日

11K+ 次檢視

啟動你的職業生涯

透過完成課程獲得認證

開始
廣告