TCP如何實現可靠傳輸
可靠:發送方發送的數據到達接收方的時候不會發生錯誤,不會丟失,不會重複,不會亂序!
-
差錯檢測(校驗和)
- 目的:檢測數據在傳輸過程中是否發生變化。如果檢驗和出錯,丟棄該報文段。(發送端超時重傳)
-
接收端反饋(序列號和確認應答)
- 序列號的目的:解決亂序問題,將數據以正確順序送到應用層,提供確認應答的條件。
- 確認應答信號ACK:當發送端將數據發出之後會等待接收端的確認應答。如果有確認應答,說明數據已經成功到達接收端主機了。反之,若沒有收到確認應答,則數據包丟失的可能性比較大。
-
發送端重傳(超時重傳)
- 當發送端遲遲沒有等到接收端的確認應答,則可能丟失數據包。 數據包丟失的原因兩種:(1)發送端的數據包丟失,沒有到達接收端,;(2)接收端的確認應答信號ACK丟失。
- 超時重傳機制:簡單理解就是發送端在發送完數據後等待一個特定時間,時間到達沒有接收到確認應答信號ACK,那麼對剛纔發送的數據進行重新發送。
- 如果針對發送端數據丟失,當超時重傳後,接受端接受到二次重發的數據後,便進行確認應答信號ACK的發送。如果針對接收端的確認應答信號ACK丟失,當再次收到該數據報文,會判斷重複並將其丟棄,仍然發送確認應答信號ACK。
- 超時重傳計時器RTT:平均往返時延RTT=α×(舊的RTT)+(1-α)×(新的往返時延樣本),1 ≤ α < 1 典型的值爲α爲7/8.
- 超時重發時間間隔RTO:RTO = β × RTT, β > 1, 推薦是2
-
連接管理
-
流量控制(滑動窗口)
-
滑動窗口協議在在發送方和接收方之間各自維持一個滑動窗口,發送發是發送窗口,接收方是接收窗口,而且這個窗口是隨着時間變化可以向前滑動的。它允許發送方發送多個分組而不需等待確認。TCP的滑動窗口是以字節爲單位的。
-
發送窗口中有四個概念:(1)已發送並收到確認的數據(不在發送窗口和發送緩衝區之內)、(2)已發送但未收到確認的數據(位於發送窗口之內)、(3)允許發送但尚未發送的數據(位於發送窗口之內)、(4)發送窗口之外的緩衝區內暫時不允許發送的數據。
-
接收窗口中也有四個概念:(1)已發送確認並交付主機的數據(不在接收窗口和接收緩衝區之內)、(2)未按序收到的數據(位於接收窗口之內)、(3)允許接收的數據(位於接收窗口之內)、(4)不允許接收的數據(位於發送窗口之內)。
-
規則:(1)凡是已經發送過的數據,在未收到確認之前,都必須暫時保留,以便在超時重傳時使用。
(2)只有當發送端收到了接收端的確認報文段時,發送端窗口纔可以向前滑動對應長度。
(3)當發送端發送的數據經過一段時間沒有收到確認(由超時計時器控制),就要使用回退N步協議,回到最後接收到確認號的地方,重新發送這部分數據。
-
選擇性確認(Selective ACK, SACK)機制。在 SACK 支持下,僅可以重傳缺少部分的數據,而不會重傳那些已經正確接受的數據段。
-
擁塞控制
- 慢啓動和擁塞控制: (1)擁塞窗口cwnd:大小取決於網絡的擁塞程度,並且動態變化。(2)慢開始門限ssthresh:防止cwnd增長過大引起網絡擁塞
- 當cwnd<ssthresh時,使用慢開始算法。(1,2,4,8..)
- 當cwnd=ssthresh時,慢開始與擁塞避免算法任意。
- 當cwnd>ssthresh時,改用擁塞避免算法。(16,17,18.....)
- 當出現丟包時(超時重傳), ssthresh = 發生網絡擁塞時的cwd一半,然後cwd = 0 並重新回到 1
- 快恢復/快重傳:
- 當cwnd<ssthresh時,使用慢開始算法。(1,2,4,8..)
- 當cwnd=ssthresh時,慢開始與擁塞避免算法任意。
- 當cwnd>ssthresh時,改用擁塞避免算法。(16,17,18.....)
- 當出現丟包時 (三個重複ACK),cwd = 發生網絡擁塞時的cwd一半,然後回到(2)
TCP和UDP的區別:
- TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接
- TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付
- TCP面向字節流,實際上是TCP把數據看成一連串無結構的字節流;UDP是面向報文的
- TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
- TCP首部開銷20字節;UDP的首部開銷小,只有8個字節
- 每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
- TCP有擁塞控制,UDP沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)
本系列文章目的爲個人準備面試的簡單總結,文中多有不足,敬請批評指正!