使用选择性重复的协议

选择性重复协议,也称为选择性重复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

            //检查窗口是否已满

            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();

            //重新发送序列号为ACK的帧

            if ( r.type = NAK) then

               if ( NAK_No > SeqFirst && NAK_No < SeqN ) then

                  Retransmit( s.seq(NAK_No));

                  Start_Timer(s);

               end if

                  //从发送窗口中删除带有肯定ACK的帧

               else if ( r.type = ACK ) then

                  Remove_Frame(s.seq(SeqFirst));

                  Stop_Timer(s);

                  SeqFirst = SeqFirst + 1;

               end if

         end if

         //如果未收到确认,则重新发送帧

         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

以上是 使用选择性重复的协议 的全部内容, 来源链接: utcz.com/z/334938.html

回到顶部