這部分可以了解到:http是如何使用tcp連線的,tcp的時延,瓶頸,障礙,http的優化,包括並行連線,keep-alive和管道話連線等。
1.4.1 tcp連線
世界上幾乎所有的http通訊都是由tcp/ip承載的。當瀏覽器收到乙個url時,回經過下圖的步驟:
1.4.1.1 tcp的可靠資料管道
http應用層的協議,依靠它的下一層傳輸層tcp協議進行連線。要想正確快速地傳送資料,就要先了解一點tcp的知識。
tcp為http連線了一條可靠的位元傳輸管道。從tcp連線一段填入的位元組會從另一端以原來的順序正確地傳送出來。
1.4.1.2 tcp流分段的,ip分組傳送
tcp的資料是通過ip資料報的小資料塊傳送的。
通常的層次為:
http--------報文------------------------資料流
tcp----------tcp頭+報文-------------單位是資料報
ip-------------ip頭+tcp頭+報文------單位是分組
tcp為倆臺主機提供高可靠性的資料通訊。它所做的工作包括把應用程式交給它的資料分成合適的小塊交給下面的網路層,確認收到的分組,設定傳送最後確認分組的超時時鐘等。由於運輸層提供了高可靠性的端到端的通訊,因此應用層可以忽略所有這些細節。
1.4.1.3 保持tcp連線的正確執行
傳輸層tcp協議提供端到端的通訊。tcp是通過埠號來保持這些連線正確執行的。ip位址可以將你連線到正確的計算機,而埠號則可以將你連線到正確的應用程式。
tcp連線通過4個值來識別:
《源ip位址、源埠號、目的ip位址、目的埠號》
這四個值唯一的定義了一條連線。
1.4.2 對tcp效能的考慮
理解tcp的某些基本效能特點之後,就能更好地了解http的鏈結優化特性。
1.4.2.1 http事務的延遲
hhtp時延的組成:
解析ip位址和埠號,主機名對應ip 位址的dns解析
客戶端向伺服器傳送一條tcp連線請求,連線的時延(伺服器處理連線的實驗)
連線建立之後的傳送請求的傳輸時延
伺服器對接收到的請求的處理時延
web伺服器回送http響應的傳輸時延
這些tcp網路時延的大小取決於硬體速度,網路和伺服器的負荷,請求和響應報文的尺寸,以及客戶端和伺服器之間的距離。
1.4.2.2 效能聚焦區域
1.4.2.3 http連線握手時延
握手:請求—接受請求----確認資訊,連線成功
小的http事務可能會在tcp建立上花費50%或者更多時間。所以在後面會討論http如何通過重用現存連線。來減小這種tcp建立時延所造成的影響。
1.4.2.4 tcp慢啟動
tcp在連線過程的三次握手完成後,開始傳資料,並不是一開始向網路通道中傳送大量的資料報,這樣很容易導致網路中路由器快取空間耗盡,從而發生擁塞;而是根據初始的cwnd大小逐步增加傳送的資料量,cwnd初始化為1個最大報文段(mss)大小(這個值可配置不一定是1個mss);每當有乙個報文段被確認,cwnd大小指數增長。
開始 —> cwnd = 1
1個rtt後 —> cwnd = 21 = 2
2個rtt後 —> cwnd = 22= 4
3個rtt後 —> cwnd = 4*2 = 8
這種方式被稱作「開啟擁塞視窗」
所以新連線的傳輸速度會比已經交換過一定量資料的連線慢一些。要想傳輸得更快一點,就要考慮利用之前已經用過的連線,這就之後要講的httpkeep-alive持久連線。
1.4.3 http連線的處理
回到http,下面是解釋操作和優化連線的http技術。
1.4.3.1 被誤用的connection首部
connection
頭(header) 決定當前的事務完成後,是否會關閉網路連線。如果該值是「keep-alive
」,網路連線就是持久的,不會關閉,使得對同乙個伺服器的請求可以繼續在該連線上完成。
語法connection: keep-alive
onnection: close
close
:表明客戶端或伺服器想要關閉該網路連線,這是http/1.0請求的預設值
以逗號分隔的http頭 [通常僅有 keep-alive]
表明客戶端想要保持該網路連線開啟,http/1.1的請求預設使用乙個持久連線。這個請求頭列表由頭部名組成,這些頭將被第乙個非透明的**或者**間的快取所移除:這些頭定義了發出者和第乙個實體之間的連線,而不是和目的地節點間的連線。
1.4.3.2 序列事務處理時延
只對連線進行簡單的管理,那tcp的效能時延可能或疊加起來。
比如有乙個html檔案和三個檔案,每乙個檔案都要登上乙個連線處理完之後重新開一條新連線,那連線時延和慢啟動時延就會疊加起來。
載入一張時一張張載入而不是一起載入也會讓人心裡感覺很慢
還有就是有的瀏覽器在物件載入完畢之前無法獲知物件的尺寸,它們可能需要尺寸資訊來決定圖放在哪個地方,所以在載入完所有資源時頁面上並不會顯示,使用者就會對裝載速度一無所知。
所以在後面討論了四種提高http效能的技術:
1.4.4 並行連線
http允許客戶端開啟多條連線,並行執行多個http事務。
但是並行連線不一定更快,因為http事務可能會耗盡可用的頻寬,並且大量連線會消耗很多記憶體資源。
實際上瀏覽器確實使用了並行連線,但它們會將並行連線的總數限制為較小的值(通常是4個)
1.4.5 持久連線
web客戶端經常會開啟到同乙個站點,初始化了對某伺服器http請求的應用程式很可能會在不久的將來對那台伺服器發起更多的請求,在同乙個站點請求多個資源。這種性質被稱為站點本地性
因此,http/1.1允許http裝置在裝置事務處理結束之後將tcp連線保持開啟狀態,以便為未來在不同事務重用
現存的連線.
在事務處理結束之後仍然保持開啟狀態的tcp連線被稱為持久連線
持久連線降低了時延和連線建立的開銷,但是如果管理不當,會積累出大量的空閒連線,消耗本地和伺服器上的資源。
持久連線有兩種型別:
connection: keep-alive
keep-alive: max=5, timeout=120
注意:
keep-alive不是預設的,每條想要持久連線的鏈結都要講首部寫上,沒有寫上那鏈結就關閉
只有在無需檢測連線的關閉就可以確定報文主體的結束的情況下下能將連線保持在開啟狀態。也就是說要有正確的content-length,有多不見**型別,或者用了分塊傳輸編碼,這樣才能檢測出來一條報文的結束和另一條報文的開始。
1.4.6 管道化連線
可以在持久連線上可選地使用管道連線。即:在響應到達之前,可以將多條請求放入佇列。在高時延網路條件下,這樣做可以降低網路的環迴時間,提高效能
使用限制:
必須在持久連線的基礎上才可以使用管道化連線
必須按照與請求相同的順序回送http響應
不應該用管道化的方式傳送會產生***的請求(如post),出錯的時候管道化方式會阻礙客戶端了解伺服器執行的是一系列管道化請求的哪一些。不好查錯
1.4.7 關閉連線的奧秘
冪等
事務:乙個事務,不管是執行一次還是很多次,得到的結果都相同,這個事務就是冪等的
客戶端不應該以管道化方式傳送非冪等請求(post
)
關閉:close():輸入和輸出通道都關閉,「完全關閉」
shutdown():單獨關閉輸入或者輸出通道,「半關閉」
使用半關閉來防止對等實體收到非預期的寫入錯誤。
關閉連線的輸入通道比較危險(關閉輸入了,快取,未讀,都讀不了了)
關閉連線的輸出通道總是很安全
實現正常更多關閉應該先關閉它的輸出通道
,然後等待
連線另外一段的對等實體關閉它的輸出通道。當兩端都告訴對方不會在傳送任何資料之後,連線就會被完全關閉
,而不會有重置的危險
http系列2 連線管理
思維導圖 http是基於tcp進行連線的。tcp時延包括三次握手,慢啟動等 如果只是簡單的序列連線,每個事務都需要建立一條新的連線 tcp的效能時延可能會疊加。http允許客戶端開啟多條連線,並行的執行多個http事務。http1.1 使用的就是並行連線,即同時傳送多條http請求,每次都會同時重新...
boost asio 連線管理11 如何關閉連線
在實際產品執行中,對連線管理有了更新的認識,這裡分享一下。shared ptr的引用計數器決定了連線物件的生命週期。這裡我說的連線物件就是在我的前文 中的client物件 cpp view plain copy print include core connection.h include usin...
HTTP連線管理
http通訊是由tcp ip承載的,tcp ip是全球計算機及網路裝置都在使用的一種常用的分組交換網路分層協議集。http連線實際上就是tcp連線和一些使用連線的規則。tcp的資料是通過名為ip分組 或ip資料報 的小資料塊來傳送的。http要傳送一條報文時,會以流的形式將報文資料的內容通過一條開啟...