關於 Http 協議中的 keep-alive 與 Tcp keep-alive

北極冰發表於2018-02-08

最近在做api開發,http無狀態是眾所周知的,但是剛才突然想到了http的keep-alive模式,心裡有些不解,於是找了些資料,挑選了比較容易理解的摘出來,和大家分享一下.
一些詞彙的基礎概念:
Http協議
TCP協議

以下內容並非原創.
首先Http協議是建立在TCP協議的基礎上的,TCP傳輸層的協議,Http應用層協議。Http底層也是通過TCP傳輸的

HTTP keep-alive

Http是一個”請求-響應”協議,它的keep-alive主要是為了讓多個http請求共享一個Tcp連線,以避免每個Http又新建一個TCP連線。每個Http伺服器預設的keep-alive時間可能是不一樣的。

TCP keep-alive

Tcp的keep-alive是Tcp協議的一種保鮮裝置,當Tcp請求響應結束後,經過tcp_keep-alive_time時間後,伺服器會發出監測包去看看改Tcp連線是否還是繼續連線的,是否已經出現了網路問題,是否客戶端崩潰了等等問題。如果發現出現了問題,那麼服務端就會去關閉該TCP連線

關於TCP心跳

在目前這兩年的移動網際網路火熱的環境下,推送應用的非常多。推送實現的就是通過TCP長連線實現的,因為行動網路很多時候都會不穩定,另外NAT過一段時間就會重新整理,所以而要如何保證客戶端和伺服器端連線就成了一個問題。TCP心跳包就是客戶端監測連線的,它先傳送一個心跳包到伺服器,伺服器再Ask,通過這種方式判斷是否目前的長連線是否可用,如果斷了,則通知上層應用,並關閉連線,另外傳送心跳包也是避免一段時間都沒有通訊,NAT超時,NAT表被重新整理,導致連線失效。

HTTP與TCP keep-alive聯絡

直接介紹一個場景就可能更容易明白了。客戶端傳送了一個Http請求,伺服器響應後,判斷這個Http是否是keep-alive模式的,如果不是則關閉連線,如果是keep-alive,則等待keep-alive time後再關閉,如果這期間再收到一個http 請求,則繼續等待最後一個請求的keep-alive time時間,直到keep-alive time時間內沒有收到請求,則關閉

上面是HTTP keep-alive的,而TCP是它下一層的協議,本身TCP是長連線的除非主動關閉。HTTP的keep-alive time一般是15ms, 30ms之類的,如果是超過了HTTP的keep-alive time時間,則HTTP會關閉TCP連線。本身TCP是不會關閉連線的,TCP的keep alive是TCP的保鮮裝置,在keep alive timeout 後服務端傳送一個監測包來判斷連線是否仍保持著,如果還是可連線,則繼續保持,它不會主動關閉連線的。而心跳包是為了防止NAT超時。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章