TCP

端陽月七發表於2020-10-09

前言

因特網有兩個核心協議包括ip和tcp,ip負責主機之間的路由選擇和定址,而tcp負責傳輸。

三次握手

正常開始通訊之前都要經過三次通訊確定,第一次傳送給伺服器端,第二次服務返回,第三次傳送應用資料。就三次通訊的模型來講,通訊建立連線是昂貴的。圖解下就非常清楚了:

image.png

擁塞預防以及控制

常見的是ip閘道器在連線不同頻寬時經常因為差別性,導致擁塞崩潰,為此tcp引進了很多機制來解決這個問題。

流量控制

流量控制就是根據場景去限定伺服器或者使用者的視窗大小,比如一般情況下是從伺服器下載內容到客戶端,此時的瓶頸是客戶端;而如果是上傳資料,此時的瓶頸是伺服器端。如果發生了擁塞的情況,那麼就會返回一個較小的視窗,如果視窗為0,那麼就會清空快取,然後接收剩餘的資料。

慢啟動

慢啟動存在的原因是雖然有了流量控制,但是在連線初期,我們不清楚雙方的視窗大小,所以需要從初始欄位指數級增長直到達到或者超過其峰值。也就是說,我們不可能開始就直接使用寬頻的最大值。

擁塞預防

擁塞預防,指的是通過慢啟動達到或者超過寬頻最大值之後,直接減倍,然後變成小數量的線性增長,直到達到其闕值。這個過程需要多次往返。(其中一次往返的時間我們稱為RTT)。
其中還有一個比較重要的概念是:慢啟動重啟機制,指的是一定時間後重置連線的擁塞視窗,原因是一段時間後網路情況可能發生了變化,因此將視窗重置為安全的預設值。

image.png

頻寬延遲積

概念解釋:資料鏈路的容量與其端到端的延遲的乘積。這個結果就是任意時刻處於在途未確認狀態的最大資料量。
換句話就是說無論實際頻寬和速度是多少,其實際能使用到的最大頻寬時被貸款延遲積限制的。假設我們傳送端以及接收端的視窗大小都為16kb,往返時間為100ms,最終計算得到的可用的最大速率是1.31m/s.

隊首阻塞

要理解這個阻塞產生的原因,必須要了解tcp傳輸的機制是什麼,它會每個分組都攜帶唯一的序列號觸發,而卻所有的分組必須按照順序到達接收端,如果不是按順序的,或者丟失資料,也就是我們說的丟包,那麼後續收到的必須等待丟失的部分全部到達才能訪問資料。這種效應就是隊首阻塞。

image.png

針對tcp的優化建議

總結下tcp的基本特點:

  • 三次握手增加了整整一次的往返時間
  • 慢啟動將整個應用到每個新連線
  • tcp的流量以及擁塞控制將影響所有連線的吞吐量
  • tcp的吞吐量由擁塞視窗的大小控制

分析結果:

  • 高速網路中的tcp的傳輸速度受到往返時間的控制
  • 寬度不斷增長,但還是低於光速,短期內無法突破
  • 大多數情況下,tcp的瓶頸還是因為延遲而不是頻寬

伺服器配置調優

首先建議你將主機的作業系統升級到最新的版本,因為tcp的最佳實踐以及影響效能的底層演算法一直在於是俱進,大多數的變化只有在最新的核心中才有實現。

有了最新的核心,那麼你可以遵循下面的最佳實踐配置伺服器:

  • 增大tcp的初始擁塞視窗。可以讓其在第一次就傳輸比較多的資料,減少慢啟動中的往返次數。
  • 慢啟動重啟,在連線空閒時禁止慢啟動可以改善瞬時傳送資料的長tcp連線的效能
  • 視窗縮放,啟用視窗縮放可以增大最大接受視窗的大小,可以讓高延遲的連線達到更好的吞吐
  • tcp快速開啟,需要客戶端和伺服器共同支援,是一種優化選項

應用程式行為調優

  • 減少傳送
  • 減短髮送的距離
  • 重用tcp連線

優化清單

  • 伺服器核心升級
  • 確保cwnd大小為10或其他
  • 禁用空閒後的慢啟動
  • 確保啟動視窗縮放
  • 減少傳輸冗餘的資料
  • 壓縮傳輸的資料
  • 把伺服器部署到和使用者近的位置,減少往返時間
  • 儘可能重用已經建立的tcp連線

更多

語雀原文連結:TCP常識

更多《web效能權威指南》的讀書筆記請關注語雀專輯《前端小冊》之效能篇,一起學習探討前端那些除了三大件應該知道的技術常識。