1、王道書上的:
2.僞代碼:
2.1後退N幀協議僞代碼:
來源:https://en.wikipedia.org/wiki/Go-Back-N_ARQ
These examples assume an infinite number of sequence and request numbers.
這些例子假定幀序列和請求號的數量是無限的。
N := window size //窗口大小
Rn := request number //接收方要求的接收的幀的序號(王道上說期待的序號 expectedSequentNumber
Sn := sequence number //發送方在一個發送週期內正在發送的幀的序號
Sb := sequence base //發送方窗口的基
Sm := sequence max //幀序列序號最大值
function receiver is //接收方程序
Rn := 0
Do the following forever: // while(true)
if the packet received = Rn and the packet is error free then //error free沒錯
Accept the packet and send it to a higher layer //接收個上一層
Rn := Rn + 1
else
Refuse packet
Send a Request for Rn
function sender is //發送方程序
Sb := 0
Sm := N + 1
Repeat the following steps forever: // while(true)
if you receive a request number where Rn > Sb then
Sm := (Sm − Sb) + Rn
Sb := Rn
if no packet is in transmission then
Transmit a packet where Sb ≤ Sn ≤ Sm.
Packets are transmitted in order.
2.2 選擇性重複協議僞代碼:
來源:https://www.tutorialspoint.com/a-protocol-using-selective-repeat
選擇性重複協議的發件人站點算法
begin
frame s; //s denotes frame to be sent //s 指向要發送的幀
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
3 其他資料:
https://www.bilibili.com/video/av70228743?p=25
https://www.geeksforgeeks.org/sliding-window-protocol-set-1/
https://www.geeksforgeeks.org/sliding-window-protocol-set-2-receiver-side/
https://www.geeksforgeeks.org/sliding-window-protocol-set-3-selective-repeat/
動畫網站:這個網站的動畫模擬的幀都連續收到的,而且GNB使用的對立確認而不是累計確認。
https://www.ccs-labs.org/teaching/rn/animations/gbn_sr/