高效能Linux:TCP/IP核心引數調優之TCP視窗擴大因子(TCP Window Scaling)選項(理論篇)

劉近光發表於2019-03-04

TCP報文視窗欄位介紹

在TCP報文頭部,有一個16位元的視窗欄位,用來表示接受方的緩衝區大小,傳送方可以根據這個值的大小來調節傳送的資料量,從而起到流控的目的。
在這裡插入圖片描述
TCP的流量控制由連線的每一端通過宣告的視窗大小來提供 。視窗大小為位元組數 ,起始於確認序號欄位指明的值,這個值是接收端期望接收的位元組。視窗大小是一個16 bit欄位,因而視窗大小最大為65535位元組。

視窗大小對效能的影響

TCP基於通告視窗大小的機制,執行傳送方在停止並等待確認前可以連續傳送多個分組。由於傳送方不必每發一個分組就停下來等待確認,因此該協議可以加速資料的傳輸。TCP傳輸速率和視窗大小成正相關,在某些情況下,提高視窗大小能夠提高傳輸速率。但TCP視窗大小隻有16bit,最大表示65535位元組,對當前千兆介面已經是標配,在資料中心對伺服器上開始部署10G介面的現實情況下,65535位元組的視窗顯然是不夠的。

視窗擴大因子

TCP頭部的最後一個選項欄位(options)是可變長的可選資訊。這部分最多包含40位元組。RFC 7323 TCP Extension for High Performance中對相關選項進行了詳細介紹,更詳細資訊可參考這個文件。
在這裡插入圖片描述
常見對TCP選項有7種,其中kind=3是視窗擴大因子選項。TCP連線初始化時,通訊雙方使用該選項來協商接收通過的視窗擴大因子。假設TCP頭部中的通告視窗大小為N,視窗擴大因子(位移數)是M,那麼TCP報文段的實際接收通告視窗大小為:N * (2 ** M)。M的取值範圍為0 ~ 14。這樣的話,通告視窗最大約為1GB,能夠滿足大部分應用的需求。

Linux下如何使能視窗擴大因子

從Linux核心2.6.8以後,TCP視窗擴大因子功能預設是使能的。可以通過下面的命令來檢視和設定:

cat /proc/sys/net/ipv4/tcp_window_scaling
echo "1" > /proc/sys/net/ipv4/tcp_window_scaling

參考資料

  1. TCP/IP詳解,卷一,第1版
  2. RFC 7323 TCP Extension for High Performance

歡迎關注個人公眾號

在這裡插入圖片描述

相關文章