数据链路控制(有噪声通道) Selective Repeat ARQ协议

版权声明:转载请附上文章地址 https://blog.csdn.net/weixin_38134491/article/details/84800563

回退N帧ARQ简化了接收方的程序,接收方只持有一个变量,且没有必要缓冲失序的帧,失序的就丢弃。

窗口

设计

窗口大小

算法

发送方选择性重复算法

Sw=2^m-1;
Sf=0;
Sn=0;

while(true){

WaitForEvent();
if(Event(RequestToSend)){        //有包要发送
    if(Sn-Sf>=Sw)          //如果窗口满
         sleep();
    GetData();
    MakeFrame(Sn);
    StoreFrame(Sn);
    SendFrame(Sn);
    Sn=Sn+1;
    StartTimer(Sn);    

}


if(Event(ArrivalNotification)){    //帧到达
    Receive(Frame);            //接收ACK或NAK
    if(corrupted(frame))
                sleep();
    if(FrameType==NAK)
        if(nakNo between Sf and Sn){
        resend(nakNo);
        StartTimer(nakNo);
    }

if(FrameType==ACK)
    if(ackNo between Sf and Sn){
        while(Sf<ackNo){
            Purge(Sf);
            StoreTimer(Sf);
            Sf=Sf+1;
        }
    }

}



if(Event(TimeOut(t))){        //计时器超时
    StartTimer(t);
    SendFrame(t);
}



}

接收方选择性重复算法

Rn=0;
NakSent=false;
AckNeeded=false;
Repeat(for all slots)
    Marked(slot)=false;

while(true){
    WaitForEvent();

    if(Event(ArrivalNotification)){
        Receive(Frame);
        if(corrupted(Frame))&&(NOT Naksent){
            SendNAK(Rn);
            NakSent=true;
            Sleep();
        }

        if((seqNo<>Rn)&&(NOT NakSent)){
            SentNAK(Rn);
            NakSent=true;
            if((seqNo in window)&&(!Marked(seqNo))){
                StoreFrame(seqNo);
                Marked(seqNo)=true;
                while(Marked(Rn)){
                    DeliverData(Rn);
                    Purge(Rn);
                    Rn=Rn+1;
                    AckNeeded=true;
                }

                if(AckNeeded){
                    SendAck(Rn);
                    AckNeeded=false;
                    NakSent=false;
                }
         

            }
        }

    }


}

捎带

猜你喜欢

转载自blog.csdn.net/weixin_38134491/article/details/84800563