一位滑动窗口协议


滑动窗口协议是数据链路层协议,用于可靠且顺序地交付数据帧。滑动窗口也用于传输控制协议。在这些协议中,发送方有一个称为发送窗口的缓冲区,接收方有一个称为接收窗口的缓冲区。

在一比特滑动窗口协议中,窗口大小为1。因此,发送方发送一个帧,等待其确认,然后发送下一个帧。因此,它使用了停止等待协议的概念。此协议提供全双工通信。因此,确认信息通过捎带附加到要发送的下一个数据帧中。

工作原理

要传输的数据帧还具有一个确认字段,即 *ack* 字段,其长度为几位。*ack* 字段包含最后接收到的无错误帧的序号。如果此序号与要发送的帧的序号匹配,则可以推断没有错误并且帧已传输。否则,可以推断帧中存在错误,并且重新传输前一个帧。

由于这是一个双向协议,因此相同的算法适用于两个通信方。

一位滑动窗口协议的算法

begin
   frame s, r; //s and r denotes frames to be sent and received
   SeqNo = 0; // Initialise sequence number of outbound frame  
   RSeqNo = 0; // Initialise sequence number of expected frame
   while (true) //check repeatedly
   do
      Wait_For_Event(); //wait for availability of packet
      if ( Event(Request_For_Transfer) AND canSend) then
         Get_Data_From_Network_Layer();
         s = Make_Frame(SeqNo);
         Store_Copy_Frame(s);
         Start_Timer(s);
         SeqNo = SeqNo + 1;
      end if;
      Wait_For_Event(); //wait for arrival of frame
      if ( Event(Frame_Arrival) then
         r = Receive_Frame_From_Physical_Layer();
         if ( r.SeqNo = RSeqNo ) then
            Extract_Data(r);
            Deliver_Data_To_Network_Layer(r);
            Stop_Timer(r);
            RSeqNo = RSeqNo + 1;
         end if
      end if
      s.ack = r.SeqNo;
      Send_Frame_To_Physical_Layer(s);
      Start_Timer(s);
      SeqNo = SeqNo + 1;
   end while
end

示例

下图描述了一个序列号为 0、1、2、3、0、1、2 等等的场景。它描述了帧传输过程中发送站和接收站中的滑动窗口。

更新于:2019年7月30日

18K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告