一、簡介
HTTP協議早期版本,比如1.0,默認是不使用持久連接的,也就是每個請求/響應之后都會關閉TCP連接。這樣的話,每次請求都需要重新建立連接,增加了延遲和資源消耗。Keep-Alive的作用是保持連接,讓多個請求可以復用同一個TCP連接,減少建立和關閉連接的開銷,在HTTP1.1中是默認支持 Keep-Alive的。
二、原理介紹
HTTP 中的 ?Keep-Alive?(也稱為持久連接或連接復用)的主要作用是允許在同一個 TCP 連接上發送和接收多個 HTTP 請求/響應,從而減少重復建立和關閉連接的開銷。以下是它的核心作用和優勢:
1、核心作用:
- ?連接復用?
默認情況下(如 HTTP/1.0),每個 HTTP 請求都會新建一個 TCP 連接,完成后立即關閉。Keep-Alive 會保持 TCP 連接打開一段時間,供后續請求復用。
例如:瀏覽器加載一個網頁時,可以復用同一個連接下載 HTML、CSS、圖片等資源,無需反復握手。
?減少延遲? - 避免重復的 TCP 三次握手(建立連接)和四次揮手(關閉連接),降低網絡延遲。
尤其對包含大量小文件(如網頁資源)的場景優化明顯。 - 節省資源?
減少服務器和客戶端的 CPU、內存消耗(避免頻繁創建和銷毀連接)。
緩解端口資源占用問題。
二、技術細節:
HTTP/1.1 默認支持 Keep-Alive(無需顯式設置 Connection: keep-alive),而 HTTP/1.0 需要手動啟用。
1、HTTP Keep-Alive 請求頭字段 (客戶端 → 服務器)
- Connection: keep-alive?
客戶端明確告知服務器希望保持連接(HTTP/1.1 默認啟用,但 HTTP/1.0 需顯式聲明)。 - ?Keep-Alive: timeout=5, max=1000?(可選)
客戶端建議參數:
timeout: 空閑超時時間(秒)
max: 此連接允許的最大請求數
2、HTTP Keep-Alive 響應頭字段? (服務器 → 客戶端)
- ?Connection: keep-alive?
服務器同意保持連接(HTTP/1.1 默認啟用,HTTP/1.0 需顯式返回)。 - ?Keep-Alive: timeout=5, max=1000?(可選)
服務器實際使用的參數(可能覆蓋客戶端建議值)。
3、HTTP/1.1 與 HTTP/1.0 的區別
版本 | 默認行為 | 需要顯式設置頭? |
---|---|---|
?HTTP/1.1? | 默認啟用持久連接 | 關閉時需發送 Connection: close |
?HTTP/1.0 | ? 默認關閉持久連接 | 啟用需發送 Connection: keep-alive |
三、請求頭與響應頭示例
1、HTTP/1.1版本
- HTTP/1.1 請求(默認啟用 Keep-Alive)
GET /api/data HTTP/1.1
Host: example.com
User-Agent: MyClient
Connection: keep-alive # 可選(HTTP/1.1 默認行為)
- HTTP/1.1 響應(服務器同意保持連接)
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 1024
Connection: keep-alive # 可選(HTTP/1.1 默認行為)
Keep-Alive: timeout=5, max=1000
2、HTTP/1.0版本
- HTTP/1.0 請求(需顯式啟用)
GET /old-api HTTP/1.0
Host: example.com
Connection: keep-alive # 必須顯式聲明
- HTTP/1.0 響應(服務器同意保持連接)
HTTP/1.0 200 OK
Content-Type: text/html
Content-Length: 2048
Connection: keep-alive # 必須顯式返回
Keep-Alive: timeout=5
3、關閉連接
- 客戶端關閉連接,發送 Connection: close 請求頭
Host: example.com
Connection: close
- ?服務器強制關閉連接,返回 Connection: close 響應頭
HTTP/1.1 200 OK
Connection: close
- 超時或達到最大請求數
當 超時或達到最大請求數,連接會被服務器或客戶端主動關閉。
四、其他
1、HTTP的Keep-Alive和TCP的Keep-Alive機制對比
- HTTP Keep-Alive 是應用層機制,用于復用連接。
- TCP Keep-Alive 是傳輸層機制,通過發送心跳包檢測連接是否存活,防止“半開連接”