Building Blocks of TCP -- 題目怎麼翻譯呢? TCP構建塊? 深入淺出TCP?認識TCP?TCP的構建?
---------------------------------------------------------------------------------------
第二章 Building Blocks of TCP
- RFC 791 -- Internet Protocol
- RFC 793 -- Transmission Control Protocol
三次握手
TCP快速打開TCP握手階段已經被確認爲總網頁瀏覽時延的一個重要來源,很多程度上是由於,對於很多網頁,它的幾十到上百個子資源分佈在不同的主機上,需要大量很短的TCP流來獲取這些資源。TCP Fast Open是一個旨在減少新的TCP連接強加的延遲懲罰的機制。基於Google所做的流量分析和網絡模擬,研究人員已經證明,TFO,它允許SYN報文攜帶數據,能夠HTTP事務網絡延遲降低15%,整個網頁平均加載時間減少10%,在某些高延遲的場景甚至達到40%。在linux 3.7+ 內核中,客戶端和服務器都可以獲得TFO支持。花雖如此,TFO並不能解決所有問題。它可以幫助消除三次握手的往返懲罰,但它只能用於特定場景:SYN報文能夠攜帶的數據有效載荷大小是有限制的,只能發送特定類型的HTTP請求,因爲它需要一個加密的cookie,所以只能用於重複的連接。
擁塞避免和控制
擁塞控制是複雜網絡中一個公認的問題。我們發現,當這兩個協議,國防部的Internet Protocol(IP),一個純粹的數據包協議,和傳輸控制協議(TCP),一個傳輸層協議,一起使用時,由於傳輸層和數據報層的交互,會引起不尋常的擁塞問題。尤其是,IP網關很容易發生“擁塞奔潰”現象,特別是在它連接到一個帶寬差別很大的網絡時。一旦往返時間超過了主機的最大傳輸間隔,主機就會開始發送越來越多的相同數據包的副本到網絡中。現在網絡就麻煩了。最終交換節點的可用緩衝將被填滿,後面的包只能丟掉。被髮送的數據包的往返時間現在達到了最大值。主機不斷的重發數據包,最終,每一個包都有多個副本到達目標主機。這就是擁塞奔潰。這種情況是穩定的。一旦達到飽和點,如果挑選丟棄包的算法是公平的,網絡將繼續在退化狀態下運行。-- John Nagle RFC896
ARPANET是現代互聯網的先驅,是世界上第一個包交換網絡。該項目正式啓動於1969年,1983年,TCP/IP取代了早期的NCP,成爲主要的通信協議。後來的事,便是總所周知的歷史了。
流控制
$> sysctl net.ipv4.tcp_window_scaling
$> sysctl -w net.ipv4.tcp_window_scaling=1
慢啓動
- 客戶端和服務端接收窗口大小65,535字節(64KB)
- 初始擁塞窗口大小:4報文段 (RFC 2581)
- RTT: 56ms (倫敦到紐約)
慢啓動重啓
$> sysctl net.ipv4.tcp_slow_start_after_idle
$> sysctl -w net.ipv4.tcp_slow_start_after_idle=0
- RTT:56ms
- 帶寬:5 Mbps
- 接收窗口大小: 65,535字節
- 初始擁塞窗口:4 segments(4x1460字節 = 5.7KB)
- 服務器處理時間:40ms
- 沒有包丟失,一包一確認,GET請求位於單個報文段中
作爲一個練習,把cwnd值設爲10個報文段替換原來的4,然後在跑一遍 圖 2-5。你應該會看大一個完整的RTT延遲消失了 -- 性能提升了22%!
擁塞避免
帶寬延遲乘積(Bandwith-Delay Product)
隊頭阻塞 (Head-of-line blocking)
TCP的優化
- TCP三次握手引入一個完整的RTT延遲
- 每一個新的TCP連接都要經歷慢啓動
- 所有的TCP連接通過TCP流控制和擁塞控制來調節吞吐量
- TCP吞吐量由當前擁塞窗口大小決定
調整服務器配置
升級你的服務器版本,表面上,這看起來像個微不足道的建議。然而,實際中,這可能阻力重重:很多現行的服務器都針對特定內核版本做了優化,而且系統管理員也懶得去升級。公平而言,每一次升級都有風險,但爲了獲得最好的性能,這可能也是你能做的最好的投資。
調整應用程序行爲
- 不發送數據纔是最快的;儘量少發數據
- 我們不能使數據傳輸的更快,但我們可以使數據更近
- TCP連接重用是提升性能的關鍵
性能清單(checklist)
- 升級服務器內核到最新的版本
- 保證cwnd被設置爲10
- 關閉空閒後慢啓動
- 保證窗口伸縮選項是打開的
- 消除冗餘數據傳輸
- 對傳輸數據進行壓縮
- 把服務器部署在離用戶近的地方以減少往返時間
- 儘可能重用TCP連接