美文网首页考研408
动画:停止等待协议Stop-and-Wait

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

作者: 考研摩天轮 | 来源:发表于2019-01-18 17:31 被阅读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);            //发送副本检查
        }
    }
    
    

    相关文章

      网友评论

        本文标题:动画:停止等待协议Stop-and-Wait

        本文链接:https://www.haomeiwen.com/subject/kpnmdqtx.html