【网络通信与信息安全】之深入解析TCP的“拥塞控制”原理
生活随笔
收集整理的這篇文章主要介紹了
【网络通信与信息安全】之深入解析TCP的“拥塞控制”原理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、前言
① TCP 與 UDP 概念
- 在涉及到網絡知識的面試中,TCP 和 UDP 是經常被提及的兩個概念,它們是 OSI 模型中的運輸層中的協議;
- TCP 全稱為傳輸控制協議。這種協議可以提供面向連接的、可靠的、點到點的通信,所謂可靠,在于 TCP 建立連接時雙方需要互相確認,類似打電話,在專業術語中稱為 3 次握手。
- UDP 全稱為用戶數據報協議,它可以提供非連接的不可靠的點到多點的通信,所謂不可靠,在于 UDP 每一次發送數據需要綁定 IP 和端口號,但是對于已經發送出去的數據來說并不去確認,也不需要類似 TCP 的三次握手的過程,由于沒有了這個過程,所以其傳輸效率較之 TCP 來說要高許多。
② TCP 與 UDP 區別
- 對于這兩者,有一些簡單且重要的區別,在面試中也經常被問到:
③ TCP 與 UDP 面試點
- 「TCP 3 次握手的過程」,「TCP 4 次揮手的過程」等點,大家可能已經比較清楚了,在此就不多做敘述。在字節跳動的面試中還問了這么一道題:TCP 的擁塞控制原理是什么?UDP 有對應的擁塞控制功能嘛?
- 這個問題似乎看起來比較冷門,前段時間「BBR」這個概念很火,大家都給自己的服務器跟風加上了「BBR」并感受到了傳輸數據效率的提升,但是也許并不是很清楚具體的原理。那么,TCP 的擁塞控制究竟是什么呢?
二、什么是 TCP 擁塞控制?
- TCP 擁塞控制的目標是最大化利用網絡上瓶頸鏈路的帶寬。
- 簡單來說是將網絡鏈路比喻成一根水管,如果我們希望盡可能地使用網絡傳輸數據,方法就是給水管注水,就有如下公式:水管內的水的數量 = 水管的容積 = 水管粗細 × 水管長度。
- 對應的網絡名詞就是:網絡內尚未被確認收到的數據包數量 = 網絡鏈路上能容納的數據包數量 = 鏈路帶寬 × 往返延遲。
- 為了保證水管不會爆管,TCP 維護一個擁塞窗口cwnd(congestion window),用來估計在一段時間內這條鏈路(水管中)可以承載和運輸的數據(水)的數量,擁塞窗口的大小取決于網絡的擁塞程度,并且動態地在變化,但是為了達到最大的傳輸效率,我們該如何知道這條水管的運送效率是多少呢?
- 一個簡單的方法就是不斷增加傳輸的水量,直到水管破裂為止(對應到網絡上就是發生丟包),用 TCP 的描述就是:只要網絡中沒有出現擁塞,擁塞窗口的值就可以再增大一些,以便把更多的數據包發送出去,但只要網絡出現擁塞,擁塞窗口的值就應該減小一些,以減少注入到網絡中的數據包數。
三、常見的 TCP 擁塞控制算法
① Reno 算法
- Reno 被許多教材(例如:《計算機網絡——自頂向下的方法》)所介紹,適用于低延時、低帶寬的網絡,它將擁塞控制的過程分為四個階段:慢啟動、擁塞避免、快重傳和快恢復,對應的狀態如下所示:
- 慢啟動階段思路是不要一開始就發送大量的數據,先探測一下網絡的擁塞程度,也就是說由小到大逐漸增加擁塞窗口的大小,在沒有出現丟包時每收到一個 ACK 就將擁塞窗口大小加一(單位是 MSS,最大單個報文段長度),每輪次發送窗口增加一倍,呈指數增長,若出現丟包,則將擁塞窗口減半,進入擁塞避免階段;
- 當窗口達到慢啟動閾值或出現丟包時,進入擁塞避免階段,窗口每輪次加一,呈線性增長;當收到對一個報文的三個重復的 ACK 時,認為這個報文的下一個報文丟失了,進入快重傳階段,要求接收方在收到一個失序的報文段后就立即發出重復確認(為的是使發送方及早知道有報文段沒有到達對方,可提高網絡吞吐量約20%)而不要等到自己發送數據時捎帶確認;
- 快重傳完成后進入快恢復階段,將慢啟動閾值修改為當前擁塞窗口值的一半,同時擁塞窗口值等于慢啟動閾值,然后進入擁塞避免階段,重復上述過程。
② BBR 算法
- BBR 是谷歌在 2016 年提出的一種新的擁塞控制算法,已經在 Youtube 服務器和谷歌跨數據中心廣域網上部署,據 Youtube 官方數據稱,部署 BBR 后,在全球范圍內訪問 Youtube 的延遲降低了 53%,在時延較高的發展中國家,延遲降低了 80%。
- BBR 算法不將出現丟包或時延增加作為擁塞的信號,而是認為當網絡上的數據包總量大于瓶頸鏈路帶寬和時延的乘積時才出現了擁塞,所以 BBR 也稱為基于擁塞的擁塞控制算法(Congestion-Based Congestion Control),其適用網絡為高帶寬、高時延、有一定丟包率的長肥網絡,可以有效降低傳輸時延,并保證較高的吞吐量,與其他兩個常見算法發包速率對比如下:
- BBR 算法周期性地探測網絡的容量,交替測量一段時間內的帶寬極大值和時延極小值,將其乘積作為作為擁塞窗口大小,使得擁塞窗口始的值始終與網絡的容量保持一致。
- 所以 BBR 算法解決了兩個比較主要的問題:
-
- 在有一定丟包率的網絡鏈路上充分利用帶寬,適合高延遲、高帶寬的網絡鏈路。
-
- 降低網絡鏈路上的 buffer 占用率,從而降低延遲,適合慢速接入網絡的用戶。
四、總結
- 目前有非常多的 TCP 的擁塞控制協議,例如:
-
- 基于丟包的擁塞控制:將丟包視為出現擁塞,采取緩慢探測的方式,逐漸增大擁塞窗口,當出現丟包時,將擁塞窗口減小,如 Reno、Cubic 等。
-
- 基于時延的擁塞控制:將時延增加視為出現擁塞,延時增加時增大擁塞窗口,延時減小時減小擁塞窗口,如 Vegas、FastTCP 等。
-
- 基于鏈路容量的擁塞控制:實時測量網絡帶寬和時延,認為網絡上報文總量大于帶寬時延乘積時出現了擁塞,如 BBR。
-
- 基于學習的擁塞控制:沒有特定的擁塞信號,而是借助評價函數,基于訓練數據,使用機器學習的方法形成一個控制策略,如 Remy。
- 從使用的角度來說,我們應該根據自身的實際情況來選擇自己機器的擁塞控制協議(而不是跟風 BBR),同時對于擁塞控制原理的掌握(尤其是掌握 Reno 的控制機理和幾個重要階段)可以加強對于網絡發包機制的了解,在排查問題或面對面試的時候有更好的表現。
- 此外,擁塞控制只是 TCP 相關考點中的一個部分,還有許多的常見的高頻考點可以順帶去看看,例如:
-
- OSI 模型是什么?
-
- 有哪些協議是基于 TCP 的,哪些是基于 UDP 的?
-
- 為什么建立連接需要三次握手,而斷開連接需要四次握手?
-
- TCP首部長度,有哪些字段?
-
- 三次握手過程中有哪些不安全性?
總結
以上是生活随笔為你收集整理的【网络通信与信息安全】之深入解析TCP的“拥塞控制”原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【网络通信与信息安全】之深入解析HTTP
- 下一篇: 【数据结构与算法】之面试必考的“二分算法