那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

TCP協議是不是快被UDP協議淘汰了

Wildesbeast ? 來源:今日頭條 ? 作者:水獸 ? 2020-02-07 15:39 ? 次閱讀

TCP 協議可以說是今天互聯網的基石,作為可靠的傳輸協議,在今天幾乎所有的數據都會通過 TCP 協議傳輸,然而 TCP 在設計之初沒有考慮到現今復雜的網絡環境,當你在地鐵上或者火車上被斷斷續續的網絡折磨時,你可能都不知道這一切可能都是 TCP 協議造成的。本文會分析 TCP 協議為什么在弱網環境下有嚴重的性能問題[^1]。

底層的數據傳輸協議在設計時必須要對帶寬的利用率和通信延遲進行權衡和取舍,所以想要解決實際生產中的全部問題是不可能的,TCP 選擇了充分利用帶寬,為流量而設計,期望在盡可能短的時間內傳輸更多的數據[^2]。

網絡通信中,從發送方發出數據開始到收到來自接收方的確認的時間被叫做往返時延(Round-Trip Time,RTT)。

弱網環境是丟包率較高的特殊場景,TCP 在類似場景中的表現很差,當 RTT 為 30ms 時,一旦丟包率達到了 2%,TCP 的吞吐量就會下降 89.9%[^3],從下面的表中我們可以看出丟包對 TCP 的吞吐量極其顯著的影響:

RTTTCP 吞吐量TCP 吞吐量(2% 丟包率)0 ms93.5 Mbps3.72 Mbps30 ms16.2 Mbps1.63 Mbps60 ms8.7 Mbps1.33 Mbps90 ms5.32 Mbps0.85 Mbps


本文將分析在弱網環境下(丟包率高)影響 TCP 性能的三個原因:

TCP 的擁塞控制算法會在丟包時主動降低吞吐量;

TCP 的三次握手增加了數據傳輸的延遲和額外開銷;

TCP 的累計應答機制導致了數據段的傳輸;

在上述的三個原因中,擁塞控制算法是導致 TCP 在弱網環境下有著較差表現的首要原因,三次握手和累計應答兩者的影響依次遞減,但是也加劇了 TCP 的性能問題。

擁塞控制

TCP 擁塞控制算法是互聯網上主要的擁塞控制措施,它使用一套基于線増積減(Additive increase/multiplicative decrease,AIMD)的網絡擁塞控制方法來控制擁塞[^4],也是造成 TCP 性能問題的主要原因。

第一次發現的互聯網擁塞崩潰是在 1986 年,NSFnet 階段一的骨干網的處理能力從 32,000bit/s 降到了 40bit/s,該骨干網的處理能力直到 1987 和 1988 年,TCP 協議實現了擁塞控制之后才得到解決[^5]。正是因為發生過網絡阻塞造成的崩潰,所以 TCP 的擁塞控制算法就認為只要發生了丟包當前網絡就發生了擁堵,從這一假設出發,TCP 就使用了慢啟動和線增積減[^6]的機制實現擁塞控制。

tcp-congestion-control

圖 1 - TCP 的擁塞控制機制

每一個 TCP 連接都會維護一個擁塞控制窗口(Congestion Window),擁塞控制窗口的作用有兩個:

防止發送方向接收方發送了太多數據,導致接收方無法處理;

防止 TCP 連接的任意一方向網絡中發送大量數據,導致網絡擁塞崩潰;

除了擁塞窗口大小(cwnd)之外,TCP 連接的雙方都有接收窗口大小(rwnd),在 TCP 連接建立之初,發送方和接收方都不清楚對方的接收窗口大小,所以通信雙方需要一套動態的估算機制改變數據傳輸的速度,在 TCP 三次握手期間,通信雙方會通過 ACK 消息通知對方自己的接收窗口大小,接收窗口大小一般是帶寬延遲乘積(Bandwidth-delay product, BDP)決定的[^7],不過在這里我們就不展開介紹了。

客戶端能夠同時傳輸的最大數據段的數量是接收窗口大小和擁塞窗口大小的最小值,即 min(rwnd, cwnd)。TCP 連接的初始擁塞窗口大小是一個比較小的值,在 Linux 中是由 TCP_INIT_CWND 定義的[^8]:

/* TCP initial congestion window as per rfc6928 */#define TCP_INIT_CWND10

初始擁塞控制窗口的大小從出現之后被多次修改,幾個名為 Increasing TCP's Initial Window 的 RFC 文檔:RFC2414[^9]、RFC3390[^10] 和 RFC6928[^11] 分別增加了 initcwnd 的值以適應不斷提高的網絡傳輸速度和帶寬。

tcp-congestion-window

圖 2 - TCP 擁塞控制窗口的線増積減

如上圖所示,TCP 連接發送方的擁塞控制窗口大小會根據接收方的響應而變化:

線性增長:當發送方收到了接收方的 ACK 時,擁塞窗口大小會加一;

積式減少:當發送方發送的數據包丟包時,擁塞控制窗口會減半;

如果 TCP 連接剛剛建立,由于 Linux 系統的默認設置,客戶端能夠同時發送 10 個數據段,假設我們網絡的帶寬是 10M,RTT 是 40ms,每個數據段的大小是 1460 字節,那么使用 BDP 計算的通信雙方窗口大小上限應該是 35,這樣才能充分利用網絡的帶寬:

然而擁塞控制窗口的大小從 10 漲到 35 需要 2RTT 的時間,具體的過程如下:

發送方向接收方發送 initcwnd = 10 個數據段(消耗 0.5RTT);

接收方接收到 10 個數據段后向發送方發送 ACK(消耗 0.5RTT);

發送方接收到發送方的 ACK,擁塞控制窗口大小由于 10 個數據段的成功發送 +10,當前擁塞控制窗口大小達到 20;

發送方向接收方發送 20 個數據段(消耗 0.5RTT);

接收方接收到 20 個數據段后向發送方發送 ACK(消耗 0.5RTT);

發送方接收到發送方的 ACK,擁塞控制窗口大小由于 20 個數據段的成功發送 +20,當前擁塞控制窗口大小達到 40;

從 TCP 三次握手建立連接到擁塞控制窗口大小達到假定網絡狀況的最大值 35 需要 3.5RTT 的時間,即 140ms,這是一個比較長的時間了。

早期互聯網的大多數計算設備都通過有線網絡連接,出現網絡不穩定的可能性也比較低,所以 TCP 協議的設計者認為丟包意味著網絡出現擁塞,一旦發生丟包,客戶端瘋狂重試就可能導致互聯網的擁塞崩潰,所以發明了擁塞控制算法來解決該問題。

但是如今的網絡環境更加復雜,無線網絡的引入導致部分場景下的網絡不穩定成了常態,所以丟包并不一定意味著網絡擁堵,如果使用更加激進的策略傳輸數據,在一些場景下會得到更好的效果。

三次握手

TCP 使用三次握手建立連接應該是全世界所有工程師都十分了解的知識點,三次握手的主要目的是避免歷史錯誤連接的建立并讓通信的雙方確定初始序列號[^12],然而三次握手的成本相當高,在不丟包的情況下,它需要建立 TCP 連接的雙方進行三次通信。

basic-3-way-handshake

圖 3 - 常見的 TCP 三次握手

如果我們要從北京訪問上海的服務器,由于北京到上海的直線距離約為 1000 多公里,而光速是目前通信速度的極限,所以 RTT 一定會大于 6.7ms:

然而因為光在光纖中不是直線傳播的,真正的傳輸速度會比光速慢 ~31%[^13],而且數據需要在各種網絡設備之間來回跳轉,所以很難達到理論的極限值。在生產環境中從北京到上海的 RTT 大概在 40ms 左右,所以 TCP 建立連接所需要最短時間也需要 60ms(1.5RTT)。

在網絡環境較差的地鐵、車站等場景中,因為丟包率較高,客戶端很難與服務端快速完成三次通信并建立 TCP 連接。當客戶端長時間沒有收到服務端的響應時,只能不斷發起重試,隨著請求次數逐漸增加,訪問的延遲也會越來越高。

由于大多數的 HTTP 請求都不會攜帶大量的數據,未被壓縮的請求和響應頭大小在 ~200B 到 2KB 左右,而 TCP 三次握手帶來的額外開銷是 222 字節,其中以太網數據幀占 3 * 14 = 42 字節,IP 數據幀占 3 * 20 = 60 字節,TCP 數據幀占 120 字節:

tcp-three-way-handshake-overhead

圖 4 - TCP 三次握手的額外開銷

雖然 TCP 不會為每一個發出的數據段建立連接,但是三次握手建立連接需要的成本還是相當高,不僅需要額外增加 1.5RTT 的網絡延時,還需要增加 222 字節的額外開銷,所以在弱網環境下,通過三次握手建立連接會加劇 TCP 的性能問題。

重傳機制

TCP 傳輸的可靠性是通過序列號和接收方的 ACK 來保證的,當 TCP 傳輸一個數據段時,它會將該數據段的副本放到重傳隊列上并開啟計時器[^14]:

如果發送方收到了該數據段對應的 ACK 響應,當前數據段就會從重傳隊列中刪除;

如果發送方在計時器到期之間都沒有收到該數據段對應的 ACK,就會重新發送當前數據段;

TCP 的 ACK 機制可能會導致發送方重新傳輸接收方已經收到了數據段。TCP 中的 ACK 消息表示該消息之前的全部消息都已經被成功接收和處理,例如:

發送方向接收方發送了序號為 1-10 的消息;

接收方向發送方發送 ACK 8 響應;

發送方認為序號為 1-8 的消息已經被成功接收;

這種 ACK 的方式在實現上比較簡單,更容易保證消息的順序性,但是在以下情況可能會導致發送方重傳已經接收的數據:

tcp-retransmission-al

圖 5 - TCP 的重傳策略

如上圖所示,接收方已經收到了序號為 2-5 的數據,但是由于 TCP ACK 的語義是當前數據段前的全部數據段都已經被接收和處理,所以接收方無法發送 ACK 消息,由于發送方沒有收到 ACK,所有數據段對應的計時器就會超時并重新傳輸數據。在丟包較為嚴重的網絡下,這種重傳機制會造成大量的帶寬浪費。

總結

TCP 協議的一些設計在今天來看雖然仍然具有巨大的價值,但是并不能適用于所有場景。為了解決 TCP 的性能問題,目前業界有兩種解決方案:

使用 UDP 構建性能更加優異、更靈活的傳輸協議,例如:QUIC[^15] 等;

通過不同的手段優化 TCP 協議的性能,例如:選擇性 ACK(Selective ACK, SACK)[^16],TCP 快開啟(TCP Fast Open, TFO)[^17];

由于 TCP 協議在操作系統內核中,不利于協議的更新,所以第一種方案目前發展的更好,HTTP/3 就使用了 QUIC 作為傳輸協議[^18]。我們在這里重新回顧一下導致 TCP 性能問題的三個重要原因:

TCP 的擁塞控制在發生丟包時會進行退讓,減少能夠發送的數據段數量,但是丟包并不一定意味著網絡擁塞,更多的可能是網絡狀況較差;

TCP 的三次握手帶來了額外開銷,這些開銷不只包括需要傳輸更多的數據,還增加了首次傳輸數據的網絡延遲;

TCP 的重傳機制在數據包丟失時可能會重新傳輸已經成功接收的數據段,造成帶寬的浪費;

TCP 協議作為互聯網數據傳輸的基石可以說是當之無愧,雖然它確實在應對特殊場景時有些問題,但是它的設計思想有著非常多的借鑒意義并值得我們學習。

到最后,我們還是來看一些比較開放的相關問題,有興趣的讀者可以仔細思考一下下面的問題:

QUIC 協議是能否保證丟包率較高時的傳輸性能?

除了 SACK 和 TFO 之外還有哪些手段可以優化 TCP 的性能?

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 互聯網
    +關注

    關注

    54

    文章

    11185

    瀏覽量

    103863
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1378

    瀏覽量

    79301
  • UDP
    UDP
    +關注

    關注

    0

    文章

    327

    瀏覽量

    34043
收藏 人收藏

    評論

    相關推薦

    TCP協議UDP協議的區別

    UDP(用戶數據報協議) : 無連接 :UDP不建立連接,數據可以直接發送,不需要任何握手過程。 不可靠性 :UDP不保證數據的可靠傳輸,數據包可能會丟失,不會重傳。 2. 數據傳
    的頭像 發表于 01-22 09:44 ?121次閱讀

    什么是TCP協議及其工作原理

    協議之一。它提供一種可靠的、有序的、基于字節流的數據傳輸服務。TCP協議的主要特點包括: 面向連接 :在數據傳輸之前,TCP需要在通信雙方
    的頭像 發表于 01-22 09:41 ?257次閱讀

    ID讀卡器TCP協議QT小程序開發

    、基本概念 TCP是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。它工作在OSI模型的第四層,即傳輸層,為用戶提供可靠的、有序的和無差錯的數據傳輸服務。TCP協議
    的頭像 發表于 12-31 10:19 ?156次閱讀
    ID讀卡器<b class='flag-5'>TCP</b><b class='flag-5'>協議</b>QT小程序開發

    socket 和 UDP 協議的對比

    。 Socket 定義 Socket 是一個抽象層,它提供一種方式,使得應用程序能夠發送和接收數據。在網絡編程中,Socket 允許程序創建一個通信端點,通過這個端點,程序可以與其他程序進行數據交換。Socket 可以基于不同的傳輸層協議,如
    的頭像 發表于 11-12 14:28 ?398次閱讀

    什么是socket編程 socket與tcp/ip協議的關系

    基于TCP/IP協議族,這是一組用于網絡通信的協議,包括傳輸控制協議TCP)和互聯網協議(IP
    的頭像 發表于 11-01 16:01 ?476次閱讀

    TCP協議是什么

    在網絡通信的廣闊領域中,TCP(Transmission Control Protocol,傳輸控制協議)扮演著舉足輕重的角色。作為TCP/IP協議族中的核心
    的頭像 發表于 10-09 13:54 ?850次閱讀

    功能強大的網絡通訊工具,支持各類TCPUDP、HTTP的通訊協議

    功能強大的網絡通訊工具,支持各類TCPUDP、HTTP的通訊協議,簡單方便,包含歷史記憶功能,體積小,服務器調試最合適
    發表于 09-05 11:51 ?0次下載

    深度解析TCPUDP協議

    計算機與網絡設備要相互通信,它們必須遵循一種共同的方法或標準。對于不同硬件平臺和操作系統之間的交互而言,這種共同遵循的規范尤為關鍵。我們將這一系列指導通信過程的規則稱為“協議”。TCPUDP
    的頭像 發表于 09-02 14:53 ?477次閱讀
    深度解析<b class='flag-5'>TCP</b>與<b class='flag-5'>UDP</b><b class='flag-5'>協議</b>

    tcpudp的區別和聯系

    一、引言 在現代網絡通信中,數據傳輸是至關重要的。為了確保數據的可靠傳輸,網絡協議發揮著關鍵作用。傳輸控制協議TCP)和用戶數據報協議UDP
    的頭像 發表于 08-16 11:06 ?676次閱讀

    一文了解TCP/IP協議

    TCP/IP協議是現代計算機網絡通信的基礎,是互聯網及局域網廣泛使用的一套協議TCP/IP協議集包括許多
    的頭像 發表于 08-07 15:38 ?2369次閱讀
    一文了解<b class='flag-5'>TCP</b>/IP<b class='flag-5'>協議</b>

    華納云:TCP IP協議的發展和優勢

    TCP/IP(Transmission Control Protocol/Internet Protocol,傳輸控制協議/互聯網協議)是互聯網和現代計算機網絡的基礎協議集。它定義
    的頭像 發表于 07-25 16:49 ?555次閱讀

    西門子S7協議TCP協議的區別

    在工業自動化領域,通信協議的選擇對于確保設備間的順暢通信和數據的可靠傳輸至關重要。西門子S7協議TCP協議作為兩種常用的通信協議,各自具有
    的頭像 發表于 06-19 15:54 ?4228次閱讀

    udp是什么協議udp協議介紹

    UDP(User Datagram Protocol,用戶數據報協議)是一種無連接的傳輸層協議,不保證數據傳輸的可靠性,只負責把數據包發送給目標地址。它提供簡單、高效的數據傳輸方式,
    的頭像 發表于 04-19 15:57 ?1559次閱讀

    mqtt協議tcp協議區別

    MQTT協議TCP協議在設計和應用上存在以下主要區別: 1. 起源與設計:MQTT協議誕生于1999年互聯網初期,而TCP
    的頭像 發表于 04-01 09:15 ?1752次閱讀

    通信必備知識!TCPUDP協議介紹及使用

    TCPUDP是兩個最常用的通訊協議TCP是面向連接的協議,需要在收發數據前與對方建立可靠的連接,建立連接的過程為3次握手,斷開連接的過程
    的頭像 發表于 03-15 08:19 ?2029次閱讀
    通信必備知識!<b class='flag-5'>TCP</b>與<b class='flag-5'>UDP</b><b class='flag-5'>協議</b>介紹及使用
    百家乐官网游戏单机牌| 太阳城御园| 百家乐官网视频游戏客服| 网上百家乐导航| 百家乐官网连闲几率| 博彩百家乐规则| 自治县| 澳门百家乐赢钱秘| 百家乐官网下注稳赢法| 太阳城百家乐赌博害人| 百家乐官网中的概率| 澳门百家乐官网怎么| 太阳城77娱乐城| 百家乐官网官网站| 362娱乐城开户| 足球赌球规则| 百家乐赌法| 网上百家乐官网危险| 百家乐哪条路准| 游戏机百家乐官网的技术| 大发888真钱游戏下载到桌面| 百家乐官网赢退输进有哪些| 大发888在线投注| 百家乐有没有攻略| 大佬百家乐官网现金网| 太阳百家乐破解| 女优百家乐官网的玩法技巧和规则| 温州牌九| 大发888送58体验金| 澳门百家乐园游戏| 博E百百家乐官网娱乐城| 大发888金皇冠娱乐城| 百家乐千术道具| 百家乐官网视频游戏平台| 威尼斯人娱乐上网导航| 24山辰山戍向| 百家乐官网专家赢钱打法| 大发888官网e世博官方网站| 百家乐视频双扣| 哪个百家乐官网投注比较好| 莆田棋牌游戏下载|