C++/java網絡常見題目3_TCP如何實現可靠傳輸

TCP如何實現可靠傳輸

可靠:發送方發送的數據到達接收方的時候不會發生錯誤,不會丟失,不會重複,不會亂序!

 

  • 差錯檢測(校驗和)

  1. 目的:檢測數據在傳輸過程中是否發生變化。如果檢驗和出錯,丟棄該報文段。(發送端超時重傳)
  • 接收端反饋(序列號和確認應答)

  1. 序列號的目的:解決亂序問題,將數據以正確順序送到應用層,提供確認應答的條件。
  2. 確認應答信號ACK:當發送端將數據發出之後會等待接收端的確認應答。如果有確認應答,說明數據已經成功到達接收端主機了。反之,若沒有收到確認應答,則數據包丟失的可能性比較大。
  • 發送端重傳(超時重傳)

  1. 當發送端遲遲沒有等到接收端的確認應答,則可能丟失數據包。                                                                                              數據包丟失的原因兩種:(1)發送端的數據包丟失,沒有到達接收端,;(2)接收端的確認應答信號ACK丟失。
  2. 超時重傳機制:簡單理解就是發送端在發送完數據後等待一個特定時間,時間到達沒有接收到確認應答信號ACK,那麼對剛纔發送的數據進行重新發送。
  3. 如果針對發送端數據丟失,當超時重傳後,接受端接受到二次重發的數據後,便進行確認應答信號ACK的發送。如果針對接收端的確認應答信號ACK丟失,當再次收到該數據報文,會判斷重複並將其丟棄,仍然發送確認應答信號ACK。
  4. 超時重傳計時器RTT:平均往返時延RTT=α×(舊的RTT)+(1-α)×(新的往返時延樣本),1 ≤ α < 1 典型的值爲α爲7/8.
  5. 超時重發時間間隔RTO:RTO = β × RTT, β > 1, 推薦是2
  • 連接管理

  1. 見博文:https://blog.csdn.net/zzhang_12/article/details/81285860
  • 流量控制(滑動窗口)

  1. 滑動窗口協議在在發送方和接收方之間各自維持一個滑動窗口,發送發是發送窗口,接收方是接收窗口,而且這個窗口是隨着時間變化可以向前滑動的。它允許發送方發送多個分組而不需等待確認。TCP的滑動窗口是以字節爲單位的。

  2. 發送窗口中有四個概念:(1)已發送並收到確認的數據(不在發送窗口和發送緩衝區之內)、(2)已發送但未收到確認的數據(位於發送窗口之內)、(3)允許發送但尚未發送的數據(位於發送窗口之內)、(4)發送窗口之外的緩衝區內暫時不允許發送的數據。

  3. 接收窗口中也有四個概念:(1)已發送確認並交付主機的數據(不在接收窗口和接收緩衝區之內)、(2)未按序收到的數據(位於接收窗口之內)、(3)允許接收的數據(位於接收窗口之內)、(4)不允許接收的數據(位於發送窗口之內)。

  4. 規則:(1)凡是已經發送過的數據,在未收到確認之前,都必須暫時保留,以便在超時重傳時使用。

               (2)只有當發送端收到了接收端的確認報文段時,發送端窗口纔可以向前滑動對應長度。

               (3)當發送端發送的數據經過一段時間沒有收到確認(由超時計時器控制),就要使用回退N步協議,回到最後接收到確認號的地方,重新發送這部分數據。

  5. 選擇性確認(Selective ACK, SACK)機制。在 SACK 支持下,僅可以重傳缺少部分的數據,而不會重傳那些已經正確接受的數據段。

  • 擁塞控制

  • 慢啓動和擁塞控制: (1)擁塞窗口cwnd:大小取決於網絡的擁塞程度,並且動態變化。(2)慢開始門限ssthresh:防止cwnd增長過大引起網絡擁塞 
  1. 當cwnd<ssthresh時,使用慢開始算法。(1,2,4,8..)
  2. 當cwnd=ssthresh時,慢開始與擁塞避免算法任意。
  3. 當cwnd>ssthresh時,改用擁塞避免算法。(16,17,18.....)
  4. 當出現丟包時(超時重傳), ssthresh = 發生網絡擁塞時的cwd一半,然後cwd = 0 並重新回到 1                                                                                                        
  • 快恢復/快重傳:
  1. 當cwnd<ssthresh時,使用慢開始算法。(1,2,4,8..)
  2. 當cwnd=ssthresh時,慢開始與擁塞避免算法任意。
  3. 當cwnd>ssthresh時,改用擁塞避免算法。(16,17,18.....)
  4. 當出現丟包時 (三個重複ACK),cwd = 發生網絡擁塞時的cwd一半,然後回到(2)

 

TCP和UDP的區別:

  1. TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接
  2. TCP提供可靠的服務。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付
  3. TCP面向字節流,實際上是TCP把數據看成一連串無結構的字節流;UDP是面向報文的
  4. TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
  5. TCP首部開銷20字節;UDP的首部開銷小,只有8個字節
  6. 每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
  7. TCP有擁塞控制,UDP沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)

 

本系列文章目的爲個人準備面試的簡單總結,文中多有不足,敬請批評指正!

參考:

https://blog.csdn.net/guoweimelon/article/details/50878503

https://blog.csdn.net/ls5718/article/details/52141571

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章