点到点链路的滑动窗口协议
目錄
- 傳輸的可靠性
- ARQ算法一:停止—等待
- 算法
- 三種情形
- 分析
- ARQ算法二:滑動窗口
- 算法
- 發送方
- 接收方
- 例如
- 分析
- 序號的范圍
- 點到點傳輸
傳輸的可靠性
??在通信過程中,幀的傳輸而可能出錯時,可以用像CRC這樣的差錯碼來檢測。但是雖然有些差錯碼功能很強,并且還能夠糾錯,但實際上由于開銷太大以至于無法處理網絡鏈路上發生的比特錯和成組差錯。即使使用糾錯碼,某些差錯因為過于嚴重仍需丟棄其對應差錯幀,因此可靠的鏈路協議必須能以某種方式回復這些丟失的幀。
??通常使用兩種基本的機制——**確認(ackonwledegment)和超時(timeout)**的組合來實現差錯幀的重傳,這個策略叫做:自動請求重發(Automatic Repeat Request,簡稱ARQ)
- 確認:接收端發送確認信號ACK給發送端用以告知成功接收某一幀
- 超時:發送端長時間未收到確認信號,重傳該原始幀給接收端
?
?
ARQ算法一:停止—等待
算法
??stop-and-wait 算法是最簡單的ARQ算法,發送方傳輸一幀后,在傳輸下一幀前等待接受方發來的確認信號。如果在規定時間內沒有接收到確認信號,則發送方超時,重傳原始幀。
?
三種情形
?分析
??在stop-and-wait 算法中,接受方的確認信號如果丟失或者遲到了,那么如上面后兩種情形一樣,發送方會超時并重傳原始幀,而接受方卻會誤以為收到的是下一幀。解決此問題的方法可以是給發送幀添加一個1比特的首部表示其序號,每一幀的序號在0、1間交替使用。
??stop-and-wait 算法的主要缺點是鏈路資源浪費。它允許發送方每次在鏈路上只有一個未確定幀,這可能遠遠低于鏈路容量。
?
?
ARQ算法二:滑動窗口
??考慮到stop-and-wait 算法的缺點,滑動窗口算法允許鏈路上同時傳輸的幀數達到鏈路的容量上限,也就是說滑動窗口算法的發送端在接收到確認信號前可以發送不止一幀數據后才進入等待。
?
算法
發送方
發送方對每一幀賦予一個序號,記為SeqNum,并維護三個變量:
- LFS:最近發送的幀(last frame sent),即還未確認成功發送的幀中序號最大者
- LAR:最近收到的確認幀(last ackoneledgement received),即已確認成功發送的幀中序號最大者
- SWS:發送窗口大小(send window size),即鏈路容量允許的同時發送幀數上限
??發送窗口的大小是根據一段時間內鏈路上有多少待傳輸的幀來選擇的,可根據給定延遲帶寬積和幀的大小來計算得到。
??當確認到達時,發送方向右移動LAR,從而允許發送方發送另一幀。同時發送方為所發送的每個幀設置一個定時器用于檢測是否超時重傳,因此發送方必須緩存SWS個幀。
接收方
接受方記錄SeqNumToAck為當前已收到的連續序號幀中未回復ACK的最大序號,并維護三個變量:
- LAF:最大的可接收幀序號(largest accpetable frame)
- LFR:最后收到的幀序號(last frame received),是已經發送過ACK的幀中最大序號
- RWS:接收窗口的大小(receive window size),即接受方所能接收的無序幀數上限
接收窗口RWS的大小可以設置為任意值,但通常有兩種:
當有新的數據幀發來時,接收方先做兩種處理:
??接受了新幀后,SeqNumToAck對應移動,但應明確一點:SeqNumToAck代表著接收到的連續序號的幀中序號最大者。如果序號不連續(序號低的幀有延遲或者丟失并待重傳),則SeqNumToAck暫時不會變化。
??一但當SeqNumToAck變化之后,接受方回傳一個SeqNumToAck對應幀的ACK信號(而不是前面所有幀的),并賦值:LFR = SeqNumToAck,LAF = LFR + RWS。
例如
??LFR=5(即上次接受方發送的ACK是確認5號幀),并且RWS=4,意味著LFR=9。若7、8號幀到達,則被存入緩沖區,但SeqNumToAck不會變化,因為6號幀還沒到達。稱7和8號幀是錯序到達的。如果隨后6號幀到達了(延遲或者丟失后重傳來的),SeqNumToAck從5變成8,接收方回傳8號幀的ACK信號;如果6號幀一直不來,則出現發送方超時,引發重傳。
?
分析
??在上例中可以看到,當發生超時時,窗口的滑動就會停滯,傳輸數據量減少。這意味著當分組丟失時,此方案不再保證管道滿載,且分組丟失時間越長,這個問題越嚴重。
??同時在上例中,可以不只是確認按順序收到的最高序號的幀SeqNumToAck。就是說接收方在收到7、8號幀但是沒有6號幀時,不管SeqNumToAck有沒有變化,直接回傳7、8號幀的ACK信號來確認二者的接收,這樣能保證管道滿載,但是增加了實現的復雜性,這個機制叫做選擇確認。
?
序號的范圍
??由于幀首部的序號字段長度有限,不可能序號上限無窮大,因此幀的序號必須循環使用,這就帶來了一個問題:要保證同一時刻鏈路上一個序號唯一確認一個幀,要求可用序號數必須大于所允許的待確認幀的數量。例如上面stop-and-wait算法中允許一次有一個待確認幀,并有兩個不同序號。
對不同RWS,序號空間有不同要求:
??例如,有8個序號0~8,且RWS=SWS=7。假設發送方傳輸幀0~6,并且接收方成功接收,但是ACK丟失發送方沒收到,那么接收方期待收到幀7和下一輪的幀0~5,但是發送方因為沒收到ACK所以超時重傳本輪的幀0~6,也就是說此時必須把(本輪的0~6幀) 和 (幀7+下輪0~5幀)通過序號區分開來,否則就會誤識別。而這就要求序號必須要多于發送窗口大小的二倍。
?
點到點傳輸
??上面算法建立在“幀在傳輸過程過程中不重新排序”的假設基礎上,也就是點到點鏈路。如果是不同環境中的滑動窗口算法則需要設計其他規則。
總結
以上是生活随笔為你收集整理的点到点链路的滑动窗口协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【进程通信】Signal信号
- 下一篇: 波束管理 Beam Management