使用选择重发协议
选择重发协议,也称为选择重发 ARQ(自动重发请求),是一种数据链路层协议,它使用滑动窗口方法来可靠地传送数据帧。在这里,只有错误的或丢失的帧被重新传输,而良好的帧被接收并缓冲。
它使用两个大小相等的窗口:一个发送窗口,用于存储要发送的帧;一个接收窗口,用于存储接收器接收到的帧。窗口大小是帧最大序列号的一半。例如,如果序列号为 0-15,则窗口大小为 8。
工作原理
选择重发协议允许发送多个帧,这取决于发送窗口中帧的可用性,即使它在此期间没有收到任何帧的确认。可以发送的最大帧数取决于发送窗口的大小。
接收器记录最早的错误或未接收帧的序列号。然后,它用它已接收的后续帧填充接收窗口。它将缺失帧的序列号与每个确认帧一起发送。
发送器继续发送其发送窗口中的帧。一旦它发送了窗口中的所有帧,它就会重新传输确认中给出的序列号的帧。然后它继续发送其他帧。
选择重发协议的发送端算法
begin frame 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 //check if window is full 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(); //Resend frame whose sequence number is with ACK if ( r.type = NAK) then if ( NAK_No > SeqFirst && NAK_No < SeqN ) then Retransmit( s.seq(NAK_No)); Start_Timer(s); end if //Remove frames from sending window with positive ACK else if ( r.type = ACK ) then Remove_Frame(s.seq(SeqFirst)); Stop_Timer(s); SeqFirst = SeqFirst + 1; end if end if // Resend frame if acknowledgement haven’t been received if ( Event(Time_Out)) then Start_Timer(s); Retransmit_Frame(s); end if end
选择重发协议的接收端算法
Begin frame 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
广告