使用Go-Back-N的协议

Go-Back-N 协议,也称为 Go-Back-N 自动重复请求协议,是一种数据链路层协议,它使用滑动窗口方法实现数据帧的可靠和顺序传递。这是一个滑动窗口协议的情况下,必须发送窗口大小 n 和接收窗口大小为1。

工作原理

Go – Back – N ARQ提供发送多个帧,然后再接收第一个帧的确认。帧被顺序编号,并且帧数量有限。可以发送的最大帧数取决于发送窗口的大小。如果在约定的时间段内未收到帧的确认,则将从该帧开始的所有帧重新发送。

发送窗口的大小确定出站帧的序列号。如果帧的序列号是n位字段,则可以分配的序列号范围是0到2 n -1。因此,发送窗口的大小为2 n -1。因此,为了适应2 n -1的发送窗口大小,选择了一个n位序列号。

序列号被编号为modulo-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表示要发送的帧

   frame t;                      //t是临时帧

   S_window = power(2,m) – 1;    //指定最大窗口大小

   SeqFirst = 0;       // 窗口中第一帧的序列号

   SeqN = 0;          //第N帧窗口的序列号

   while (true)       //重复检查

   do

      Wait_For_Event();       //等待数据包可用

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

         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

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

      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; //初始化预期帧的序列号

   while (true) //重复检查

   do

      Wait_For_Event(); //等待帧到达

      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

以上是 使用Go-Back-N的协议 的全部内容, 来源链接: utcz.com/z/343221.html

回到顶部