HTTP協議:pipeline、持久連線、非持久連線
一、HTTP持久連線、非持久連線
1.1 定義
1. 非持久連線:每個連線處理一個請求-響應事務。
2. 持久連線:每個連線可以處理多個請求-響應事務。
持久連線情況下,伺服器發出響應後讓TCP連線繼續開啟著。同一對客戶/伺服器之間的後續請求和響應可以通過這個連線傳送。
3. HTTP/1.0 使用非持久連線。 HTTP/1.1 預設使用持久連線。
1.2 非持久連線示例
非持久連線下,客戶端請求一個頁面。假設該頁面包含1個HTML檔案和10個JPEG影象,所有這些物件在同一臺伺服器主機中。再假設該節本HTML檔案的URL為:www.yesky.com/sompath/index.html。
1. HTTP客戶端與伺服器主機www.yesky.com中的HTTP伺服器建立一個TCP連線。
2. HTTP客戶端傳送HTTP請求訊息。 包含/sompath/index.html。
3. HTTP伺服器接收請求訊息,從伺服器主機記憶體或硬碟拿去除物件/sompath/index.html,發出該物件的響應訊息。
4. HTTP伺服器告知TCP關閉這個TCP連線(TCP要等客戶收到這個響應訊息後,才會真正終止這個連線)。
5. HTTP客戶接收響應訊息。TCP連線終止。 該訊息標明所拆裝的物件是一個HTML檔案。客戶取出檔案,分析後發現10個JPEG物件的引用。
6. 給每一個引用到的JPEG物件重複步驟1~4。
二、非持久連線、序列TCP連線、並行TCP連線、響應時間
2.1 序列TCP連線、並行TCP連線
10個JPEG物件,可以通過10個序列的TCP連線先後取到,也可以通過並行的TCP連線同時取到其中的某些物件。
使用並行TCP連線,可以縮短響應時間。
2.2 響應時間
客戶端請求1個基本HTML檔案,要耗時2個RTT(round trip time)。
1. “三次握手”時,客戶向伺服器傳送連線請求,伺服器傳送確認。
2. “三次握手”時,客戶向伺服器傳送確認,並攜帶請求訊息,伺服器傳送響應訊息。
2.3 非持久連線的缺點
1. 每個連線,TCP得在客戶端和服務端分配TCP緩衝區,並維持TCP變數。 對於同時為來自數百個不同客戶的請求提供服務的web伺服器來說,這會嚴重增加其負擔。
2. 每個物件都有2個RTT的延遲。
3. 每個物件都遭受TCP緩啟動,因為每個TCP連線都起始於緩啟動階段。
三、持久連線、不帶流水線(without pipelining)、帶流水線(with pipelining)
3.1 不帶流水線(without pipelining)、帶流水線(with pipelining)
1. 不帶流水線(with pipelining):客戶只在收到前一個請求的響應後,才發出新的請求。
與非持久連線2個RTT的延遲相比,不帶流水線的持久連線已有所改善。
2. 帶流水線(with pipelining):HTTP客戶沒碰到一個引用就立即傳送一個請求,即HTTP客戶可以一個接一個挨著傳送各個引用物件的請求。伺服器收到這些請求後,也可以一個接一個的傳送各個物件的響應。
帶流水線,所有引用到的物件一共只經歷1個RTT的延時,而不帶流水線,每個引用到的物件各有1個RTT的延遲。
帶流水線的持久連線中伺服器空等請求的時間較少。
參考資料: