http 持續連接

以下內容轉載自:http://www.jianshu.com/p/0a47fc776314


http持久連接-keep alive和persistent

字數1230 閱讀471 評論0 

基礎概念

HTTP/1.1(以及HTTP/1.0的各種增強版本)允許HTTP設備在事務處理結束後仍將TCP 連接保持在打開狀態,以便爲未來的HTTP請求重用現存連接在事務處理結束後仍然保持在打開狀態的TCP連接被稱爲持久連接。
非持久連接在每次事務處理結束後就會關閉。
重用TCP連接可以加速數據傳輸,因爲:
1. 避免每次都經歷緩慢的連接建立階段,以及每次都執行關閉操作,節省耗時和帶寬
2. 避免TCP連接慢啓動特性的擁塞適應階段

持久連接有兩種類型:
1. 比較老的HTTP/1.0+ "keep-alive"連接
2. 現代的HTTP/1.1 "persistent"連接

使用場景

一個web頁面中內嵌的圖片通常都來自同一個Web站點,而且相當一部分的超鏈接都指向同一個站點。如果初始化了一個持久連接,我們就可以通過此連接發起更多目標服務器相同的請求。

HTTP/1.0+ keep-alive連接

HTTP/1.0+中支持的是keep-alive連接。

keep-alive握手過程
  1. HTTP/1.0+支持keep-alive連接,但默認並未激活。客戶端通過發送一個包含Connection: Keep-Alive首部的請求來請求服務器激活keep-alive連接,即將這條連接保持在打開狀態。
  2. 如果服務器願意爲下一條請求重用此連接,就會在響應中包含相同的首部。若沒有,服務器就會在發回響應報文後關閉連接。客戶端就是通過檢測響應中是否包含Connection: Keep-Alive響應首部來判斷服務器是否會在發送響應後關閉連接的
  3. 假如服務器同意使用keep-alive連接,那麼接下來客戶端必須在所有希望保持持久連接的請求中包含Connection: Keep-Alive首部。如果沒有發送該首部,服務器會在那條請求後關閉連接。
  4. 那麼何時關閉持久連接呢?注意,Connection: Keep-Alive首部只是請求將連接保持在活躍狀態。即使服務器和客戶端都同意建立持久連接了,它們仍可以在任意時刻關閉空閒的keep-alive連接,且可隨意限制keep-alive連接所處理事務的數量。我們可以通過Keep-Alive選項調節它們的行爲,具體請看下一部分。
Keep-Alive選項

用法:Keep-Alive: name[=value][, name=[value]]...
完全可選,但只有在包含了Connection: Keep-Alive首部的情況下才可使用它。

參數timeout:在Keep-Alive響應首部中發送,告訴客戶端服務器估計會在打開狀態保持到連接空閒多長時間後關閉連接。
參數max:在Keep-Alive響應首部中發送,告訴客戶端服務器還會爲另外幾個http事務將連接保持在打開狀態。
注意,這兩個參數值僅僅是估計,並非承諾。

例如:

Connection: Keep-Alive
Keep-Alive: max=5, timeout=120

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

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首部取了什麼值,客戶端和服務器仍然可以隨時關閉空閒連接。

規則和限制

一個客戶端對任何服務器或代理最多隻能維護兩條持久連接,以防服務器過載。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章