我們都知道TCP是面向連接的可靠傳輸協議,保證數據的傳輸安全、順序准確性及數據可達性。
那么保證這些安全的原理或是機制到底是什么呢?
接下來稱TCP的發送方為A,接收方為B
TCP保證可靠性的兩個協議:
1. 停止等待協議
每發送完一個分組,就停止發送,等待對方確認,收到確認后再發送下一個分組。
出現差錯的情況:
(1)A在發送之后設置一個定時器,若超過定時器時間還沒有收到確認,就重新發送次分組(A發送的分組必須要留一個副本,為超時重傳所用)。如果B檢測收到的分組有錯,就丟棄分組,什么也不做(TCP將保持它首部和數據的檢驗和CRC。這個檢驗和目的是檢測數據在傳輸過程中的任何變化)。當發現在超過計時器時間還未收到確認信號,則采用超時重傳功能重新發送。
(2)確認丟失:如果B發送的確認信號丟失后,A定時器超出時間,則重新發送這個分組,B丟棄這個分組,不向上層交付,同時向A重新發送確認。
(3)確認遲到:
流程圖如上所示,A收到這個遲到的確認后會丟棄這個確認,什么都不做。
至此,就是停止等待協議中會出現的問題。而一一解決這些問題的重傳機制,就是ARQ(自動重傳請求)協議,也就是重傳的請求是自動的,不需要B請求A發送某一個丟失或者出錯的數據。
很顯然,這種方式信道利用率很低,這個時候我們就采用連續ARQ協議。
2. 連續ARQ協議
利用滑動窗口,位於滑動窗口內的所有分組都可以連續的發送出去,而不需要逐個等待對方的確認。A每收到一個確認,就把發送窗口向前滑動一個分組的位置。B采用累積確認的方式,對按序到達的最后一個分組發送確認(就是最后這個分組的編號),就表示這個分組之前的所有分組都收到了。
(1)優點:信道利用率高,容易實現,即使確認丟失,也不必重傳。
(2) 缺點:不能向發送方反映出接收方已經正確收到的所有分組的信息。
比如:發送方發送了5條消息,中間第三條丟失(3號),這時接收方只能對前兩個發送確認。發送方無法知道后三個分組的下落,而只好把后三個全部重傳一次。這也叫
Go-Back-N(回退N),表示需要退回來重傳已經發送過的N個消息。
保證數據的順序性:
TCP報文段作為IP數據來進行傳輸,而IP數據報的到達可能會失序,因此TCP到達也可能會失序,所以如果有必要,TCP將對收到的數據進行重新排序,將收到的數據以正確的順序交給應用層。
轉載自:https://www.pianshen.com/article/1585300388/