版权声明:转载请附上文章地址 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;
}
}
}
}
}
捎带