在 Java 中删除文件或目录

java 8object oriented programmingprogramming

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表示要发送的帧
   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

相关文章