關於 HTTP 協議中的 keep-alive

LiuKaHo發表於2018-07-20

keep-alive

keep-alive 可以叫做持久連線(也有叫長連線的)。其實keep-alive這個header頭只存在於HTTP/1.0版本中,在HTTP/1.1中是換成了persistent

keep-alive的作用及好處

眾所周知,HTTP是建立在TCP之上的,TCP是傳輸層協議,HTTP是應用層的協議,報文的傳輸是透過客戶端和服務端建立的TCP連線傳輸的。

正常來說一個 Request-Response 就經歷

  1. TCP 連線
  2. 傳送請求
  3. 伺服器處理請求併傳送響應
  4. 斷開TCP連線

如果一個客戶端經常訪問伺服器,那麼建立、關閉TCP連線就耗費了大量的時間和資源,keep-alive就可以解決這樣的一個情況。

使用keep-alive有什麼好處呢

1.避免了緩慢的TCP連線過程
2.避免了慢啟動的擁塞適應階段(詳細可以瞭解下TCP協議)

建立 keep-alive 連線

怎樣才能和伺服器建立一個keep-alive連線呢?

  1. 客戶端在請求頭需要加入
    Connection: keep-alive
  2. 伺服器接收到客戶端的請求中有keep-alive,若伺服器支援keep-alive,則在響應頭中加入
    Connection: keep-alive

    這樣,當客戶端接收到響應並發現響應中有keep-alive則認為和伺服器之間建立了一條keep-alive連線,也就是不關閉TCP連線,該連線會在接收到伺服器或客戶端發起的 closed 請求或超時,就會關閉。

一個成功建立keep-alive連線的例子(某度的):
file

keep-alive 連線的一些注意點

  • keep-alive需要更加小心的維護,因為一不小心,就會有大量空閒的TCP連線存在。
  • 實體的主題部分必須有正確的Content-Length,不然會不知道哪裡是一條報文的結束、一條報文的開始。
  • keep-alive不是預設使用的(ps:在 HTTP/1.1中 presistent是預設使用的)
  • 響應沒有 keep-alive,伺服器發出響應後就會關閉連線。

希望我把keep-alive說清楚了。

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

相關文章