TCP 吞吐量

使用 Mathis 公式計算理論 TCP 吞吐量

如何使用TCP 吞吐量

  1. 1輸入 RTT(往返時間)和丟包率。
  2. 2輸入 MSS(最大段大小,通常 1460 位元組)。
  3. 3讀取該路徑可維持的最大 TCP 吞吐率。

TCP 吞吐率(Mathis 公式)

吞吐率 ≤ (MSS / RTT) × C / √(丟包率),C ≈ 0.93

Mathis 公式刻畫了受丟包和往返時間制約的 TCP 連線吞吐上限。

即便極小丟包(如 0.1%)也會在長 RTT 鏈路上大幅壓低吞吐,這正是高丟包衛星/WAN 鏈路感覺慢的原因。

TCP 吞吐量有個硬上限:**吞吐 ≤ 視窗大小 ÷ RTT**。這是滑動視窗協議的根本約束——視窗內的資料發出去後必須等確認(ACK)回來才能繼續發,一個 RTT 內最多隻能發「一個視窗」的資料。所以即使頻寬是 1 Gbps,如果視窗只有 64 KB 而 RTT 是 200 ms,吞吐量就被限制在 64 KB ÷ 0.2 s = 2.6 Mbps。**這叫「長肥管道」問題(Long Fat Network)。**

解決辦法是**開啟 TCP 視窗縮放(Window Scaling,RFC 7323)**:在三次握手時協商一個縮放因子,把視窗從最大 64 KB 擴充套件到最大 1 GB。現代作業系統(Windows Vista+、Linux 2.6.8+、macOS)預設都開啟了。所以現在跑不滿頻寬通常是別的原因:接收方應用讀取慢導致視窗通告變小、中間裝置緩衝不足、或者丟包率過高(**哪怕 0.1% 的丟包也能讓 TCP 吞吐驟降**)。

RTT預設視窗 64 KB視窗 256 KB視窗 1 MB需要視窗(跑滿 1 Gbps)
1 ms(同機房)512 Mbps2 Gbps8 Gbps125 KB
10 ms(同城)52 Mbps210 Mbps838 Mbps1.25 MB
50 ms(跨省)10.5 Mbps42 Mbps168 Mbps6.25 MB
200 ms(中美)2.6 Mbps10.5 Mbps42 Mbps25 MB
300 ms(衛星)1.7 Mbps7 Mbps28 Mbps37.5 MB

TCP 視窗大小決定的最大吞吐量(不同 RTT)

常見問題

為什麼 1% 丟包影響這麼大?

吞吐率隨 1/√丟包率 變化,1% 丟包可把容量壓到無丟包時的約 10%。

增大視窗有用嗎?

只到 BDP 為止;無論視窗多大,丟包仍會封頂 Mathis 上限。

如何改善?

降低 RTT 或丟包(更優路徑、FEC、BBR 等 TCP 變體),而非只加頻寬。

為什麼丟包對 TCP 影響這麼大?

因為 TCP 把丟包當作**擁塞訊號**,一旦檢測到就大幅降速(Reno 演算法直接把視窗減半),然後線性增長試探。數學上吞吐量大致與 1/√丟包率 成反比:丟包率 0.01% 時還能跑到接近滿速,0.1% 時只剩約 30%,1% 時只剩約 10%。所以長距離鏈路對丟包極其敏感,這也是為什麼 BBR、QUIC 等新擁塞演算法改用「頻寬時延探測」而非「丟包」來判斷擁塞。

BDP 是什麼?怎麼算?

BDP(Bandwidth-Delay Product,頻寬時延乘積)= 頻寬 × RTT,表示「管道里正在飛行的資料量」。要讓鏈路跑滿,TCP 視窗至少要等於 BDP。例如 1 Gbps、RTT 50 ms:BDP = 10⁹ × 0.05 ÷ 8 = 6.25 MB。如果視窗小於這個值,鏈路就會空閒等待確認,頻寬浪費。這個概念對調優跨國專線、衛星鏈路、廣域網加速非常關鍵。

更多工具