使用回退N協議
回退N協議,也稱為回退N自動重傳請求,是一個資料鏈路層協議,它使用滑動視窗方法來可靠且順序地傳遞資料幀。它是一種滑動視窗協議的示例,傳送視窗大小為N,接收視窗大小為1。
工作原理
回退N ARQ允許在收到第一個幀的確認之前傳送多個幀。這些幀按順序編號,並且數量有限。可以傳送的最大幀數取決於傳送視窗的大小。如果在商定的時間段內未收到某個幀的確認,則從該幀開始的所有幀都將重新傳輸。
傳送視窗的大小決定了出站幀的序列號。如果幀的序列號是一個n位欄位,則可以分配的序列號範圍為0到2n−1。因此,傳送視窗的大小為2n−1。因此,為了容納大小為2n−1的傳送視窗,選擇n位序列號。
序列號按模n編號。例如,如果傳送視窗大小為4,則序列號將為0、1、2、3、0、1、2、3、0、1,依此類推。序列號中的位數為2,以生成二進位制序列00、01、10、11。
接收視窗的大小為1。
回退N協議的傳送端演算法
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(); if ( AckNo > SeqFirst && AckNo < SeqN ) then while ( SeqFirst <= AckNo ) Remove_copy_frame(s.seq(SeqFirst)); SeqFirst = SeqFirst + 1; end while Stop_Timer(s); end if end if // Resend all frames if acknowledgement havn’t been received if ( Event(Time_Out)) then TempSeq = SeqFirst; while ( TempSeq < SeqN ) t = Retrieve_Copy_Frame(s.seq(SeqFirst)); Send_Frame(t); Start_Timer(t); TempSeq = TempSeq + 1; end while end if end
回退N協議的接收端演算法
Begin frame f; RSeqNo = 0; // Initialise sequence number of expected frame 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 ) doNothing(); else if ( f.SeqNo = RSeqNo ) then Extract_Data(); Deliver_Data_To_Network_Layer(); RSeqNo = RSeqNo + 1; Send_ACK(RSeqNo); end if end if end while end
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP