考研408

动画:停止等待协议Stop-and-Wait

2019-01-18  本文已影响0人  考研摩天轮

停止等待协议就是每发送完一组数据包后,等待对方确认并且收到确认后,再发送下一组数据

流程简单可以理解为:发送数据,收到数据,发送确认,收到确认

分别有以下的四种情况:数据帧正常接收、数据帧丢失、确认帧丢失、数据帧错误

发送方发送数据的同时,设置定时器开始计时。

数据帧正常接收

数据能够正常发送,正常接收,正常确认,正常收到确认的一个过程

正常接收.gif

数据帧丢失

超过一段时间仍然没有收到确认,就认为刚才所发送的数据丢失,然后重传前面发送的数据

数据帧丢失.gif

确认帧丢失

但传输过程中确认帧丢失。而主机A并不知道,在超时计时过后,主机A重传数据帧,主机B再次收到该消息后采取以下两点措施:

  1. 丢弃这个重复的数据帧,不向上层交付。

  2. 向A发送确认消息。(不会认为已经发送过了,就不再发送。主机A能重传,就证明主机B的确认消息丢失)。

确认帧丢失.gif

数据帧错误

数据帧错误.gif

Stop-and-Wait ARQ 协议中发送方站点的算法


Sn=0;                        //帧0被最先发出
canSend=true;                //允许最初请求
while(true){                //无休止重发
 
    WaitForEvent();            //当一个事件发生时,唤醒它
    if(Event(RequestToSend) AND canSend){
        GetData();
        MakeFrame(Sn);          //顺序号为Sn
        StoreFrame(Sn);        //保留副本
        sendFrame(Sn);
        StartTimer();
        Sn=Sn+1;
        canSend=false;
    }
    WaitForEvent();        //休眠
    if(Event(ArrivalNotification)){   //ACK帧到达
        ReceiveFrame(ackNo);             //接收ACK帧
        if(not corrupted AND ackNo==Sn){        //有效ACK帧
            Stoptimer();                 
            PurgeFrame(Sn-1);         //不需要的副本
            canSend=true;
        }
    }
    if(Event(TimeOut)){              //超时
        StartTimer();                
        ResendFrame(Sn-1);            //发送副本检查
    }
}

上一篇下一篇

猜你喜欢

热点阅读