- http短連接,一般是服務器端主動關閉連接(歷史原因 https://www.zhihu.com/question/24338653)
- http 請求header頭中通過Connection: 頭字段來指定是否需要keep-alive。 其中http1.0和http1.1關於Connection頭又有不同點
- http1.0不支持keepalive,所以發送頭為Connection默認為closed(Connection: close)。 即告訴服務器發送完請求后服務器就主動斷開連接(所以服務器會出現timewait)。 需要在http頭加入"Connection: Keep-Alive",才能啟用Keep-Alive
- http1.1 默認的Connection頭就是keep-alive(即Connection: keep-alive),除非顯式指定Connection: close。但具體是否建立長連接還要看服務器那邊是否支持keep-alive,如果nginx(或apache)將keepalive關閉,則建立的還是短連接,服務器發送完請求后就關閉連接了。如果建立了長連接了,則具體應該有哪方主動關閉連接需要看情況(見4)
- Connection頭具體值
- 請求:
- close(告訴WEB服務器或者代理服務器,在完成本次請求的響應后,斷開連接,不要等待本次連接的后續請求了)。
- keepalive(告訴WEB服務器或者代理服務器,在完成本次請求的響應后,保持連接,等待本次連接的后續請求)。
- 響應:
- close(連接已經關閉)。
- keep-alive(連接保持着,在等待本次連接的后續請求)。
- Keep-Alive: timeout。這個值能夠讓一些瀏覽器主動關閉連接,這樣服務器就不必要去關閉連接了。(見4)
- 請求:
- http 響應response頭中的Connection字段的keepalive屬性
響應頭Keep-Alive: timeout。這個值能夠讓一些瀏覽器主動關閉連接,這樣服務器就不必要去關閉連接了。 - 注意不同瀏覽器怎么處理“keep-alive”頭
- MSIE和Opera忽略掉"Keep-Alive: timeout=<N>" header.
- MSIE保持連接大約60-65秒,然后發送TCP RST
- Opera永久保持長連接
- Mozilla keeps the connection alive for N plus about 1-10 seconds.
- Konqueror保持長連接N秒
- Http keepalive 和tcp keepalive的區別
http keep-alive與tcp keep-alive,不是同一回事,意圖不一樣。http keep-alive是為了讓tcp活得更久一點,以便在同一個連接上傳送多個http,提高socket的效率。而tcp keep-alive是TCP的一種檢測TCP連接狀況的保鮮機制。tcp keep-alive保鮮定時器,支持三個系統內核配置參數:/proc/sys/net/ipv4/tcp_keepalive_time/proc/sys/net/ipv4/tcp_keepalive_intvl/proc/sys/net/ipv4/tcp_keepalive_probes
keepalive是TCP保鮮定時器,當網絡兩端建立了TCP連接之后,閑置idle(雙方沒有任何數據流發送往來)了tcp_keepalive_time后,服務器內核就會嘗試向客戶端發送偵測包,來判斷TCP連接狀況(有可能客戶端崩潰、強制關閉了應用、主機不可達等等)。如果沒有收到對方的回答(ack包),則會在 tcp_keepalive_intvl后再次嘗試發送偵測包,直到收到對對方的ack,如果一直沒有收到對方的ack,一共會嘗試 tcp_keepalive_probes次,每次的間隔時間在這里分別是15s, 30s, 45s, 60s, 75s。如果嘗試tcp_keepalive_probes,依然沒有收到對方的ack包,則會丟棄該TCP連接。TCP連接默認閑置時間是2小時,一般設置為30分鍾足夠了。
也就是說,僅當nginx的keepalive_timeout值設置高於tcp_keepalive_time,並且距此tcp連接傳輸的最后一個http響應,經過了tcp_keepalive_time時間之后,操作系統才會發送偵測包來決定是否要丟棄這個TCP連接。一般不會出現這種情況,除非你需要這樣做。