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時間。