Apache-2.2

apache2 keepalive 並打開一個 tcp 連接

  • May 3, 2014

IP 數據包包含有效負載,例如 HTTP 資訊,而 HTTP 資訊又包含 html 資訊。IP 數據包被封裝到 TCP 段中,它可以檢測網路傳輸中的問題,請求重新傳輸失去的數據,重新排列亂序數據,並有助於最大限度地減少網路擁塞。這樣做的方式是 TCP 接收器在接收數據時以 ack 消息進行響應。發送方在發送數據包時維護一個計時器,如果在消息被確認之前計時器到期,則重新發送數據包。

當 TCP 接收方接收到最後一個段並重新排列數據時,TCP 發送方將其初始請求發送到何處的過程,這一切都是在單個 TCP 連接中完成的嗎?還是每次傳輸和確認都需要多個 TCP 連接?

我問的原因是因為 apache2 有一個名為 KeepAlive 的聲明。我不完全明白。如果設置為“On”,KeepAlive 將允許每個連接保持打開狀態以處理來自同一客戶端的多個請求。但是,在 TCP 接收器接收到整個消息(可能是整個 html 文件)之前,每個連接不會一直保持打開狀態嗎?

但是,在 TCP 接收器接收到整個消息(可能是整個 html 文件)之前,每個連接不會一直保持打開狀態嗎?

是的 - 但如果沒有 KeepAlive,它會在文件發送後關閉。使用 KeepAlive,它將允許客戶端發出下一個請求,而無需斷開並建立另一個 TCP 連接。

如果您有一個請求兩個項目的客戶端,那麼在沒有 KeepAlive 的情況下會發生這種情況:

  1. 客戶端請求 TCP 連接
  2. 伺服器接受 TCP 連接
  3. 客戶端請求一個 URI
  4. 伺服器響應 - 希望通過發送 URI 的完整內容
  5. 客戶端斷開連接
  6. 伺服器關閉套接字
  7. 客戶端請求 TCP 連接
  8. 伺服器接受 TCP 連接
  9. 客戶端請求第二個 URI
  10. 伺服器響應 - 希望通過發送 URI 的完整內容
  11. 客戶端斷開連接
  12. 伺服器關閉套接字

這是同樣的事情,但使用 KeepAlive:

  1. 客戶端請求 TCP 連接
  2. 伺服器接受 TCP 連接
  3. 客戶端請求一個 URI
  4. 伺服器響應 - 希望通過發送 URI 的完整內容
  5. 客戶端請求第二個 URI
  6. 伺服器響應 - 希望通過發送 URI 的完整內容
  7. 客戶端斷開連接
  8. 伺服器關閉套接字

如您所見,在第二個範例中,拆除和建立新 TCP 連接的成本消失了。對於負載較重、頁麵包含大量 URI 的伺服器,它可以顯著降低成本。

引用自:https://serverfault.com/questions/592914