5 HTTP建立持久連線的意義

2021-10-25 10:00:44 字數 2634 閱讀 9907

1、什麼是keep-alive模式?

我們知道http協議採用「請求-應答」模式,當使用普通模式,即非keepalive模式時,每個請求/應答客戶和伺服器都要新建乙個連線,完成 之後立即斷開連線(http協議為無連線的協議);當使用keep-alive模式(又稱持久連線、連線重用)時,keep-alive功能使客戶端到服 務器端的連線持續有效,當出現對伺服器的後繼請求時,keep-alive功能避免了建立或者重新建立連線。

http 1.0中預設是關閉的,需要在http頭加入"connection: keep-alive",才能啟用keep-alive;http 1.1中預設啟用keep-alive,如果加入"connection: close ",才關閉。目前大部分瀏覽器都是用http1.1協議,也就是說預設都會發起keep-alive的連線請求了,所以是否能完成乙個完整的keep- alive連線就看伺服器設定情況。

2、啟用keep-alive的優點

啟用keep-alive模式肯定更高效,效能更高。因為避免了建立/釋放連線的開銷。

重用tcp連線可以加速資料傳輸,因為:

避免每次都經歷緩慢的連線建立階段,以及每次都執行關閉操作,節省耗時和頻寬。

避免tcp連線慢啟動特性的擁塞適應階段。

3、http 1.0和1.1的實現

主要說來

持久連線有兩種型別:

1 比較老的http/1.0+ "keep-alive"連線

客戶端通過傳送乙個包含connection: keep-alive首部的請求來請求伺服器啟用keep-alive連線,即將這條連線保持在開啟狀態。假如伺服器同意使用keep-alive連線,那麼接下來客戶端必須在所有希望保持持久連線的請求中包含connection: keep-alive首部。如果沒有傳送該首部,伺服器會在那條請求後關閉連線。注意,connection: keep-alive首部只是請求將連線保持在活躍狀態。即使伺服器和客戶端都同意建立持久連線了,它們仍可以在任意時刻關閉空閒的keep-alive連線,且可隨意限制keep-alive連線所處理事務的數量。我們可以通過keep-alive選項調節它們的行為:

引數timeout:在keep-alive響應首部中傳送,告訴客戶端伺服器估計會在開啟狀態保持到連線空閒多長時間後關閉連線。

引數max:在keep-alive響應首部中傳送,告訴客戶端伺服器還會為另外幾個http事務將連線保持在開啟狀態。

注意,這兩個引數值僅僅是估計,並非承諾。

connection: keep-alive

keep-alive: max=

5, timeout=

120

說明伺服器最多還會為另外5個事務保持連線在開啟狀態,或者將開啟狀態保持到連線空閒了2兩分鐘後關閉。

2現代的http/1.1 "persistent"連線

http/1.1逐漸停止了對keep-alive連線的支援,用persistent連線替代了它。

與keep-alive連線不同,http/1.1中persistent連線預設就是啟用的,除非特別指明,否則http/1.1認為所有連線都是持久的。

http/1.1的客戶端假定在收到的響應後,除非報文包含了connection: close首部,否則客戶端就認為連線仍為維持在開啟狀態。

如果客戶端要建立乙個非持久連線,則需要在請求中包含connection: close首部;伺服器在處理完該事務後,就會在響應中包含connection: close首部以告知客戶端連線已關閉。如果客戶端不想在一條persistent連線上傳送更多請求了,就應該在最後一條請求中包含connection: close首部。

只要伺服器決定在事務處理結束後關閉連線,就必須在響應中包含connection: close首部。但不傳送connection: close首部也並不意味著伺服器承諾永遠將連線保持在開啟狀態。

同樣地,不管連線是否維持在開啟狀態,或connection首部取了什麼值,客戶端和伺服器仍然可以隨時關閉空閒連線。

乙個客戶端對任何伺服器或**最多只能維護兩條持久連線,以防伺服器過載。

3、長連線的過期時間

上圖中的keep-alive: timeout=20,表示這個tcp通道可以保持20秒。另外還可能有max=***,表示這個長連線最多接收***次請求就斷開。對於客戶端來說,如果伺服器沒有告訴客戶端超時時間也沒關係,服務端可能主動發起四次握手斷開tcp連線,客戶端能夠知道該tcp連線已經無效;另外tcp還有心跳包來檢測當前連線是否還活著,方法很多,避免浪費資源。

4、長連線的資料傳送完成識別

使用長連線之後,客戶端、服務端怎麼知道本次傳輸結束呢?兩部分:1是判斷傳輸資料是否達到了content-length指示的大小;2動態生成的檔案沒有content-length,它是分塊傳輸(chunked),這時候就要根據chunked編碼來判斷,chunked編碼的資料在最後有乙個空chunked塊,表明本次傳輸資料結束。

HTTP之持久連線

http 1.1 允許 http 裝置在事務處理結束之後將 tcp 連線保持在開啟狀態,以便為未來的 http 請求重用現存的連線。在事務處理結束後仍然保持在開啟狀態的 tcp 連線被稱為持久連線。非持久連線會在每個事務結束之後關閉。持久連線會在不同事務之間保持開啟狀態,直到客戶端或伺服器決定將其關...

HTTP從入門到入土 5 HTTP報文格式

http報文分為請求報文和響應報文,只有傳送了請求報文,才會有響應報文。常見的報文格式如下所示 乙個請求報文由四部分組成,分別是 請求行請求行由三部分組成,分別是 請求方法,url以及協議版本。get test hi there.txt http 1.0如上所示 該請求行的請求表示了本次請求的請求方...

HTTP協議詳解 持久連線與非持久連線

最近寫作完http協議一節,略做總結 非持久連線是在http 1.0中定義,而對於http 1.1中預設的是持久連線 帶流水線 以下是詳細描述 非持久連線 的概念 某網頁由最基本的 html 和10個jpeg 影象構成,10個jpeg 影象檔案存放在同一臺伺服器中。設這個網頁的url為www.ser...