TCP協議通過使用連續ARQ協議和滑動窗口協議,來保證數據傳輸的正確性,從而提供可靠的傳輸。
一、ARQ協議
ARQ協議,即自動重傳請求(Automatic Repeat-reQuest),是OSI模型中數據鏈路層和傳輸層的錯誤糾正協議之一。它通過使用確認和超時這兩個機制,在不可靠服務的基礎上實現可靠的信息傳輸。如果發送方在發送後一段時間之內沒有收到確認幀,它通常會重新發送。ARQ包括停止等待ARQ協議和連續ARQ協議,擁有錯誤檢測(Error Detection)、正面確認(Positive Acknowledgment)、超時重傳(Retransmission after Timeout)和 負面確認及重傳(Negative Acknowledgment and Retransmission)等機制。
(1)停止等待ARQ協議
要想弄明白爲什麼TCP要使用連續ARQ協議,首先需要弄清楚停止等待ARQ協議的原理。
TCP 連接是全雙工的連接,也就是說在通信的時候,雙方既是發送方,也是接收方。下面爲了簡化問題,只考慮一方發送,一方接受的情況。其中,A作爲發送方,B作爲接收方。
1.無差錯情況
A發送分組M1,發送完就暫停發送,等待B的確認。B收到M1就向A發送確認。A在收到了對M1的確認後,就再發送下一個分組M2。依次下去發送剩餘的數據...如下圖所示:
2.出現差錯
如果A發送的過程中出現差錯,B在接收M1時檢測出了差錯,就丟棄M1,其他什麼都不做(也不會通知A收到有差錯的分組)。又或者A傳送的過程中分組丟失了,以上這兩種情況下,B不會發送任何信息。
既然說它是可靠傳輸協議,那自然有它可靠的方法:如果發生以上的情況,A只要超過了一段時間仍然沒有收到確認,就認爲剛纔發送的分組丟失了,所以它會重傳剛剛的發送過的分組,也就是所謂的超時重傳。
超時重傳的原理也很簡單:發送方發送完一個分組後,就會設置一個超時計時器,如果超時計時器到期之前沒有收到接收方發來的確認信息,則會重發剛發送過的分組;如果收到確認信息,則撤銷該超時計時器。如下圖所示:
這裏應該注意的是:
①既然發送方發送的分組可能丟失或者有差錯,可能需要重傳,那麼它必須暫時保留已發送的分組副本,只有收到確認後,才清除這個副本。
②分組和確認分組信息都應該有各自的編號,用來標示每一個分組和確認信息。(這樣才知道需要發送哪個分組,收到了哪個分組的確認信息)
③超時計時器設置的時間應該略長於分組傳送往返時間。
3.確認丟失和確認延遲
沒有正常進行通信,除了發送方出現問題外,接收方同時也可能存在問題。
例如,如果A發送了M1分組,到達B,B發送了M1確認信息,但由於網絡原因,該確認信息丟失。那麼這個時候,A在超時重傳時間內,沒有收到B的確認信息,而且它並不知道是自己的分組有差錯、丟失,還是B發生的確認丟失了。因此,A會在超時重傳過後,重傳M1分組。
接收方B會採取這兩個行動:
①B會丟棄M1分組,不向上層交付。(B之前已經收到過M1分組了)
②向A發送確認(因爲A重發了,肯定重傳時間內沒有收到確認信息)
還有可能是另一種情況,就是B發送了確認,沒有丟失,但是延遲了。也就是說,B發送的確認在A超時計時器過期後纔到達。 這種情況下,A收到確認信息後會丟棄,然後重傳剛纔的分組,B收到後,丟棄重複的分組,並重傳確認信息。
根據上述的確認和重傳機制,我們就可以在不可靠的網絡上實現可靠的傳輸。
4.信道利用率
停止等待ARQ協議的優點是簡答,但也有很嚴重的確定,就是信道利用率太低。如下圖所示:
信道利用率U = TD / (TD + RTT + TA)
(2)連續ARQ協議
由於停止等待ARQ協議信道利用率太低,所以需要使用連續ARQ協議來進行改善。這個協議會連續發送一組數據包,然後再等待這些數據包的ACK。
發送方採用流水線傳輸。流水線傳輸就是發送方可以連續發送多個分組,不必每發完一個分組就停下來等待對方確認。如下圖所示:
連續ARQ協議通常是結合滑動窗口協議來使用的,發送方需要維持一個發送窗口,如下圖所示:
圖(a)是發送方維持的發送窗口,它的意義是:位於發送窗口內的5個分組都可以連續發送出去,而不需要等待對方的確認,這樣就提高了信道利用率。
連續ARQ協議規定,發送方每收到一個確認,就把發送窗口向前滑動一個分組的位置。例如上面的圖(b),當發送方收到第一個分組的確認,就把發送窗口向前移動一個分組的位置。如果原來已經發送了前5個分組,則現在可以發送窗口內的第6個分組。
接收方一般都是採用累積確認的方式。也就是說接收方不必對收到的分組逐個發送確認。而是在收到幾個分組後,對按序到達的最後一個分組發送確認。如果收到了這個分組確認信息,則表示到這個分組爲止的所有分組都已經正確接收到了。
累積確認的優點是容易實現,即使確認丟失也不必重傳。但缺點是,不能正確的向發送方反映出接收方已經正確收到的所以分組的信息。比如發送方發送了前5個分組,而中間的第3個分組丟失了,這時候接收方只能對前2個發出確認。而不知道後面3個分組的下落,因此只能把後面的3個分組都重傳一次,這種機制叫Go-back-N(回退N),表示需要再退回來重傳已發送過的N個分組。
二、滑動窗口協議
滑動窗口協議在在發送方和接收方之間各自維持一個滑動窗口,發送發是發送窗口,接收方是接收窗口,而且這個窗口是隨着時間變化可以向前滑動的。它允許發送方發送多個分組而不需等待確認。TCP的滑動窗口是以字節爲單位的。
如下圖所示,發送窗口中有四個概念::已發送並收到確認的數據(不在發送窗口和發送緩衝區之內)、已發送但未收到確認的數據(位於發送窗口之內)、允許發送但尚未發送的數據(位於發送窗口之內)、發送窗口之外的緩衝區內暫時不允許發送的數據。
接收窗口中也有四個概念:已發送確認並交付主機的數據(不在接收窗口和接收緩衝區之內)、未按序收到的數據(位於接收窗口之內)、允許的數據(位於接收窗口之內)、不允許接收的數據(位於發送窗口之內)。
規則:
(1)凡是已經發送過的數據,在未收到確認之前,都必須暫時保留,以便在超時重傳時使用。
(2)只有當發送方A收到了接收方的確認報文段時,發送方窗口纔可以向前滑動幾個序號。
(3)當發送方A發送的數據經過一段時間沒有收到確認(由超時計時器控制),就要使用回退N步協議,回到最後接收到確認號的地方,重新發送這部分數據。
此外,TCP利用滑動窗口協議來進行流量控制,如下圖所示:
參考資料:
1、ARQ-維基百科 https://zh.wikipedia.org/wiki/ARQ
2、TCP/IP(三) —— 可靠傳輸工作原理 http://pmghong.blog.51cto.com/3221425/1242470
3、TCP可靠傳輸&流量控制&擁塞控制 http://my.oschina.net/manmao/blog/601585
4、計算機網絡【七】:可靠傳輸的實現 http://blog.chinaunix.net/uid-26275986-id-4109679.html
5、TCP/IP之TCP協議(3):流量控制(滑動窗口協議)http://blog.csdn.net/wbw1985/article/details/4879224