原文:tcp 負責在不可靠的傳輸通道之上提供可靠的抽象層,向應用層隱藏了大多數網路通訊的複雜性能,比如丟包重發、按需傳送、擁塞控制及避免、資料完整,等等。採用 tcp 資料流可以確保傳送的所有位元組能夠完整地被接收到,而且客戶端的順序也一樣。
但是 tcp 設計並未過多顧及時間,由此給瀏覽器 web 效能帶來了挑戰。
所有 tcp 連線一開始都必須經過三次握手。客戶端與伺服器在交換應用資料之前,必須就起始分組序列號,以及其他一些連線相關的細節達成一致。處於安全考慮,序列號由兩端隨機生成。
客戶端可以在傳送 ack 分組之後立即傳送資料,而伺服器必須等接收到 ack 分組之後傳送資料。
每個 tcp 連線都要經過三次握手,倘若客戶端與伺服器距離過長,會造成非常大的效能影響。因而,提公升 tcp 效能關鍵在於想辦法重用連線。
為解決這個問題,人們在積極尋找各種方案,其中長鏈結(keep-alive)、負載均衡、tfo(tcp fast open)便是其中的一些解決辦法。
keep-alive,http 1.1 之後預設開啟,指在乙個 tcp 連線中可以持續傳送多份資料而不會斷開連線。
基本原理:客戶端(如:clienta)與負載均衡裝置之間進行三次握手並傳送 http 請求。負載均衡裝置收到請求後,會檢測伺服器是否存在空閒的長鏈結,如果不存在,伺服器將建立乙個新連線。當 http 請求響應完成後,客戶端與負載均衡裝置協商關閉連線,而負載均衡則保持與伺服器之間的這個連線。當有其他客戶端(如:clientb)需要傳送 http 請求時,負載均衡裝置會直接向伺服器之間保持的這個空閒連線傳送 http 請求,避免來由於新建 tcp 連線造成的延時和伺服器資源耗費。
儘管開啟了長鏈結,可是依然有35%的請求是重新發起一條連線,而握手會造成一定的延遲,tfo 的目標就是為了去除這個延遲,在三次握手期間也能交換資料。
基本原理:
擁塞:即對供不應求,對資源的需求超過了可用的資源,網路效能下降,整個網路的吞吐量隨之負荷的增大而減小,甚至會發生擁塞崩潰的現象。
為了減緩網路擁塞現象,tcp 加入許多機制用來控制雙向傳送資料的速度。如流量監控、擁塞控制、擁塞預防機制等。
流量控制是一種預防傳送端過多向接收端傳送資料的機制。
滑動視窗是實現流量控制的一種方法,乙個簡單例子:
設 a 向 b 傳送資料。在建立連線時,b 告訴了 a:「我的接收視窗值 rwnd = 400「 (rwnd: receiver window),因此,傳送方的傳送視窗不能超過接收方給出的接收視窗的數值。tcp 視窗的單位時位元組,並不是報文段。設每個報文段的位元組長 100,而資料報文段序號的初始值為 1,大寫 ack 表示首部中的確認位 ack,小寫 ack 表示確認欄位的值 ack。
從圖中可以看出,b 進行了三次流量控制。第一次把視窗減少到 rwnd = 300,第二次又減少到了 rwnd = 100,最後減到 rwnd = 0,即不允許傳送資料了。
當 rwnd = 0 時,則意味著必須由應用層先清空快取區,才能接收剩餘資料。這個過程貫穿於每個 tcp 連線的整個生命週期:每個 ack 分組都會攜帶相應的最新的 rwnd 值,以便兩端動態調整資料流,使之適應傳送端和接收段的容量及處理能力。
儘管流量監控可以防止傳送端向接收端過多傳送資料,但是傳送端和接收端在連線建立之初,並不知道可用頻寬是多少,因此需要乙個估算機制,然後還可以根據網路中不斷變化的條件而動態改變速度。
擁塞控制:防止過多的資料注入到網路中,這樣可以使網路中的路由器或鏈路不致於過載。
慢啟動是實現擁塞控制的一種方法,此外還有擁塞預防、快速重發和快速恢復。
慢啟動,即是在分組被確定以後,增大視窗大小,慢慢啟動。
具體實現如下:
簡單演示三次握手與慢啟動對簡單 http 傳輸的影響。
連線引數:
當再次傳送相同請求時:
慢啟用使用 cwnd 作為起始值傳送資料量,隨後成倍增長。直到超過接收系統配置的擁塞閾值(ssthresh)視窗,或者發生分組丟失現象,此時擁塞預防演算法介入。
由於已經發生擁堵,必須採取刪包措施。需要重新調整 cwnd 大小,此後擁塞預防按照自己的演算法來增大 cwnd 以避免丟包。若再次丟包,則從頭開始。
TCP效能優化
在講這個tcp傳輸資料優化這塊前,希望大家對tcp協議的三次握手要很熟悉哈,如果不熟悉,可以看我之前寫的這篇部落格 如果我們都很清楚三次握手過程,我就可以開始講第乙個優化方案 有一點我們必須清楚,就是在tcp是在三次握手之後才開始真正傳輸資料的 tcp的每次握手都需要耗費1.5個rtt時間,即1.5...
Web效能優化
我們先來看乙個瀑布圖來確定乙個頁面效能問題是由哪些項造成的。chorome 自帶開發人員工具 圖中每一行表示乙個 請求,每乙個請求都有一條時間線,用於標識這個請求所花費的時間。如果將滑鼠放到某一條時間線上,可以看到以下資訊 1 首先看一下哪個請求花費的時間比較長,看看這個請求的時間線資訊,確定是伺服...
web效能優化
可以用gulp的gulp uglify gulp minify css模組完成 還可以用webpack的uglifyjsplugin壓縮外掛程式完成。通過css sprites將多個整合到乙個中,在用css來定位。伺服器在處理大流量的資料是十分困難的,這最終導致頁面載入速度變慢。cdn是位於全球不同...