主頁 >  其他 > TCP 協議快被淘汰了,UDP 協議才是新世代的未來?

TCP 協議快被淘汰了,UDP 協議才是新世代的未來?

2020-09-20 16:07:44 其他

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 ms 93.5 Mbps 3.72 Mbps
30 ms 16.2 Mbps 1.63 Mbps
60 ms 8.7 Mbps 1.33 Mbps
90 ms 5.32 Mbps 0.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),擁塞控制視窗的作用有兩個:

  1. 防止發送方向接收方發送了太多資料,導致接收方無法處理;

  2. 防止 TCP 連接的任意一方向網路中發送大量資料,導致網路擁塞崩潰;

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

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

  1.   /* TCP initial congestion window as per rfc6928 */
  2.   #define TCP_INIT_CWND 10

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

tcp-congestion-window

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

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

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

  2. 積式減少:當發送方發送的資料包丟包時,擁塞控制視窗會減半;

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

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

  1. 發送方向接收方發送 initcwnd = 10 個資料段(消耗 0.5RTT);

  2. 接收方接收到 10 個資料段后向發送方發送 ACK(消耗 0.5RTT);

  3. 發送方接收到發送方的 ACK,擁塞控制視窗大小由于 10 個資料段的成功發送 +10,當前擁塞控制視窗大小達到 20;

  4. 發送方向接收方發送 20 個資料段(消耗 0.5RTT);

  5. 接收方接收到 20 個資料段后向發送方發送 ACK(消耗 0.5RTT);

  6. 發送方接收到發送方的 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. 發送方向接收方發送了序號為 1-10 的訊息;

  2. 接收方向發送方發送 ACK 8 回應;

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

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

tcp-retransmission-al

圖 5 - TCP 的重傳策略

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

總結

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

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

  2. 通過不同的手段優化 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 的性能?

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/90023.html

標籤:其他

上一篇:adb -- cannot connect to x.x.x.x:5555“由于目標計算機積極拒絕,無法連接”

下一篇:物聯網連接性:塑造2020年及以后的4個最新標準

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more