keep-alive
keep-alive
可以叫做持久連線(也有叫長連線的)。其實keep-alive
這個header頭只存在於HTTP/1.0版本中,在HTTP/1.1中是換成了persistent
。
keep-alive的作用及好處
眾所周知,HTTP
是建立在TCP
之上的,TCP
是傳輸層協議,HTTP
是應用層的協議,報文的傳輸是透過客戶端和服務端建立的TCP
連線傳輸的。
正常來說一個 Request-Response 就經歷
TCP
連線- 傳送請求
- 伺服器處理請求併傳送響應
- 斷開
TCP
連線
如果一個客戶端經常訪問伺服器,那麼建立、關閉TCP
連線就耗費了大量的時間和資源,keep-alive就可以解決這樣的一個情況。
使用keep-alive
有什麼好處呢
1.避免了緩慢的TCP
連線過程
2.避免了慢啟動的擁塞適應階段(詳細可以瞭解下TCP
協議)
建立 keep-alive 連線
怎樣才能和伺服器建立一個keep-alive連線呢?
- 客戶端在請求頭需要加入
Connection: keep-alive
- 伺服器接收到客戶端的請求中有
keep-alive
,若伺服器支援keep-alive
,則在響應頭中加入Connection: keep-alive
這樣,當客戶端接收到響應並發現響應中有
keep-alive
則認為和伺服器之間建立了一條keep-alive
連線,也就是不關閉TCP
連線,該連線會在接收到伺服器或客戶端發起的 closed 請求或超時,就會關閉。
一個成功建立keep-alive
連線的例子(某度的):
keep-alive 連線的一些注意點
keep-alive
需要更加小心的維護,因為一不小心,就會有大量空閒的TCP
連線存在。- 實體的主題部分必須有正確的
Content-Length
,不然會不知道哪裡是一條報文的結束、一條報文的開始。 keep-alive
不是預設使用的(ps:在 HTTP/1.1中presistent
是預設使用的)- 響應沒有
keep-alive
,伺服器發出響應後就會關閉連線。
希望我把keep-alive
說清楚了。
本作品採用《CC 協議》,轉載必須註明作者和本文連結