http keep-alive與tcp keep-alive

weixin_34320159發表於2016-12-26

tcp keep-alive

tcp keep-alive提供的是一種鏈路有效檢測機制,當鏈路建立之後,可能經過很長時間應用程式一直沒傳送資料,這時有可能鏈路因為某種原因已經失效了,如果對這種情況不做處理那肯定有問題,tcp對於這種情況提供了keep-alive機制,該機制在作業系統核心有3個配置引數:

  • /proc/sys/net/ipv4/tcp_keepalive_time
  • /proc/sys/net/ipv4/tcp_keepalive_intvl3
  • /proc/sys/net/ipv4/tcp_keepalive_probes

當tcp鏈路空閒超過tcp_keepalive_time時間後,伺服器核心會向客戶端傳送探測報文,來檢測tcp連線是否正常,如果收到客戶端的ack,那麼在下次空閒時間再一次超過tcp_keepalive_time後再進行檢測;如果沒有收到客戶端的ack,那麼隔tcp_keepalive_intvl3時間後再發一次檢測鏈路的空報文,如果重試tcp_keepalive_probes次後依然沒有收到客戶端的ack,則判定連線已失效,關閉連線。

雖然tcp的keep-alive機制能夠定時清理失效的連線,但這個tcp_keepalive_time時間一般比較長,tcp預設是2小時,在關閉失效連線前如果客戶端發起通訊則會失敗,所以不能完全通過該機制解決鏈路有效性問題。

tcp的keep-alive機制傳送的探測報文是將之前TCP報文的序列號減1,並設定1個位元組,內容為“00”的應用層資料,這樣對端能識別這個報文是tcp keep-alive探測報文並進行ack。

http keep-alive

http keep-alive是應用層的機制,是http server端的一種長連線機制。該機制彌補了http請求每次請求都要建立連線的缺陷,只要客戶端在keep-alive時間內發起下一次請求,就能複用之前的連線。
在HTTP/1.0協議中,客戶端通過在http請求頭中新增一個欄位 Connection: Keep-Alive,當伺服器收到附帶有Connection: Keep-Alive的請求時,它也會在響應頭中新增一個同樣的欄位來使用Keep-Alive。這樣客戶端不會主動斷開該連線,在下次http請求直接用該連線,除非兩次請求的間隔超過了keep-alive的時間。當http server端檢測到該連線超過了keep-alive時間還沒有收到請求,就會斷開該連線。

在HTTP/1.1協議中,keep-alive預設實現,不需要客戶端在http請求頭中新增Connection: Keep-Alive。

相關文章