使用选择性重复的协议
选择性重复协议,也称为选择性重复ARQ(自动重复请求),是一种数据链接层协议,它使用滑动窗口方法来可靠地传递数据帧。在这里,只有错误或丢失的帧才被重发,而好的帧则被接收和缓冲。
它使用两个大小相等的窗口:一个用于存储要发送的帧的发送窗口和一个用于存储接收方接收的帧的接收窗口。该大小是帧最大序列号的一半。例如,如果序列号从0到15,则窗口大小将为8。
工作原则
选择性重复协议提供了根据发送窗口中帧的可用性来发送多个帧的方法,即使该协议在过渡期间未收到任何帧的确认。可以发送的最大帧数取决于发送窗口的大小。
接收器记录最早的不正确或未接收帧的序列号。然后,它将接收到的后续帧填充到接收窗口中。它发送丢失帧的序列号以及每个确认帧。
发送方继续发送其发送窗口中的帧。一次,它已发送了窗口中的所有帧,然后重新传输其序列号由确认给出的帧。然后,它继续发送其他帧。
选择性重复协议的发件人站点算法
beginframe s; //s denotes frame to be sent
frame t; //t is temporary frame
S_window = power(2,m-1); //Assign maximum window size
SeqFirst = 0; // Sequence number of first frame in window
SeqN = 0; // Sequence number of Nth frame window
while (true) //check repeatedly
do
Wait_For_Event(); //wait for availability of packet
if ( Event(Request_For_Transfer)) then
//检查窗口是否已满
if (SeqN–SeqFirst >= S_window) then
doNothing();
end if;
Get_Data_From_Network_Layer();
s = Make_Frame();
s.seq = SeqN;
Store_Copy_Frame(s);
Send_Frame(s);
Start_Timer(s);
SeqN = SeqN + 1;
end if;
if ( Event(Frame_Arrival) then
r = Receive_Acknowledgement();
//重新发送序列号为ACK的帧
if ( r.type = NAK) then
if ( NAK_No > SeqFirst && NAK_No < SeqN ) then
Retransmit( s.seq(NAK_No));
Start_Timer(s);
end if
//从发送窗口中删除带有肯定ACK的帧
else if ( r.type = ACK ) then
Remove_Frame(s.seq(SeqFirst));
Stop_Timer(s);
SeqFirst = SeqFirst + 1;
end if
end if
//如果未收到确认,则重新发送帧
if ( Event(Time_Out)) then
Start_Timer(s);
Retransmit_Frame(s);
end if
end
选择性重复协议的接收者站点算法
Beginframe f;
RSeqNo = 0; // Initialise sequence number of expected frame
NAKsent = false;
ACK = false;
For each slot in receive_window
Mark(slot)=false;
while (true) //check repeatedly
do
Wait_For_Event(); //wait for arrival of frame
if ( Event(Frame_Arrival) then
Receive_Frame_From_Physical_Layer();
if ( Corrupted ( f.SeqNo ) AND NAKsent = false) then
SendNAK(f.SeqNo);
NAKsent = true;
end if
if ( f.SeqNo != RSeqNo AND NAKsent = false ) then
SendNAK(f.SeqNo);
NAKsent = true;
if ( f.SeqNo is in receive_window ) then
if ( Mark(RSeqNo) = false ) then
Store_frame(f.SeqNo);
Mark(RSeqNo) = true;
end if
end if
else
while ( Mark(RSeqNo))
Extract_Data(RSeqNo);
Deliver_Data_To_Network_Layer();
RSeqNo = RSeqNo + 1;
Send_ACK(RSeqNo);
end while
end if
end if
end while
end
以上是 使用选择性重复的协议 的全部内容, 来源链接: utcz.com/z/334938.html