HTTP 協議 connection、keep-alive


Connection 頭(header) 決定當前的事務完成后,是否會關閉網絡連接。如果該值是“keep-alive”,網絡連接就是持久的,不會關閉,使得對同一個服務器的請求可以繼續在該連接上完成。

Connection: keep-alive
Connection: close

Keep-Alive :若開啟后,在一次http請求中,服務器進行響應后,不再直接斷開TCP連接,而是將TCP連接維持一段時間。在這段時間內,如果同一客戶端再次向服務端發起http請求,便可以復用此TCP連接,向服務端發起請求,並重置timeout時間計數器,在接下來一段時間內還可以繼續復用。這樣無疑省略了反復創建和銷毀TCP連接的損耗。

需要將 The Connection 首部的值設置為 "keep-alive" 這個首部才有意義:

Keep-Alive: parameters

下述標識符是可用的:

  • timeout:指定了一個空閑連接需要保持打開狀態的最小時長(以秒為單位)。需要注意的是,如果沒有在傳輸層設置 keep-alive TCP message 的話,大於 TCP 層面的超時設置會被忽略。
  • max:在連接關閉之前,在此連接可以發送的請求的最大值。在非管道連接中,除了 0 以外,這個值是被忽略的,因為需要在緊跟着的響應中發送新一次的請求。HTTP 管道連接則可以用它來限制管道的使用。
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Thu, 11 Aug 2016 15:23:13 GMT
Keep-Alive: timeout=5, max=1000
Last-Modified: Mon, 25 Jul 2016 04:32:39 GMT
Server: Apache

注意:

connection:keep-alive,keep-alive:timeout=300 並不完全決定復用tcp連接,還有兩個參數有關:content-length、Transfer-Encoding

與 TCP-KEEPALIVE區別:

nginx的keepalive_timeout值設置高於tcp_keepalive_time,並且距此tcp連接傳輸的最后一個http響應,經過了tcp_keepalive_time時間之后,操作系統才會發送偵測包來決定是否要丟棄這個TCP連接。一般不會出現這種情況,除非你需要這樣做。

通過java httpurlconnection 建立的連接是認 keep-alive :timeout=60 這種形式的,到時間就會自動斷開。

http的keepalive 時間要小於tcp的keepalive時間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM