博客 / 詳情

返回

HTTP2.0 從原理到實踐,保證把你治得服服帖帖!

HTTP 是 Web 傳輸的基礎協議,隨着互聯網的發展,它不斷演進,從最初的 HTTP/1.0 到 HTTP/1.1,再到如今的 HTTP/2,每個版本都帶來了顯著的改進。

本篇文章將深入淺出地講解 HTTP/2,包括它的優點、使用方法以及如何實際操作它。


1. HTTP 是什麼?

HTTP(HyperText Transfer Protocol,超文本傳輸協議) 是一種用於 Web 通信的協議,負責客户端(瀏覽器等)與服務器之間的請求和響應。它的主要特點是無狀態基於文本,常用於:

  • 瀏覽網頁
  • 移動 App 請求數據
  • API 接口調用(如 REST API)
  • 物聯網設備的數據通信

HTTP 目前經歷了多個版本升級,每次升級都旨在提高性能和安全性。


2. HTTP/1.1 vs HTTP/2

HTTP/2 相比 HTTP/1.1 主要帶來了性能優化,以下是兩者的核心區別:

特性 HTTP/1.1 HTTP/2
多路複用 ❌ 不支持,同一時間只能處理一個請求 ✅ 單個 TCP 連接多路複用
頭部壓縮 ❌ 頭部信息以明文傳輸,體積較大 ✅ 使用 HPACK 算法(減少 50%+ 頭部大小)
請求優先級 ❌ 無優先級 ✅ 具備流優先級
服務器推送 ❌ 不支持,只能響應客户端請求 ✅ 支持(提前推送資源,減少等待)
傳輸方式 ❌ 文本格式(明文傳輸,冗餘大) ✅ 二進制分幀(更緊湊、解析快)
性能優化 性能相對較低,容易出現隊頭阻塞等問題 性能大幅提升,減少延遲,提高傳輸效率

3. HTTP/2 解決了什麼問題?

HTTP/2 主要解決了 HTTP/1.1 的幾個性能瓶頸:

  1. 減少 TCP 連接開銷
    HTTP/1.1 需要多個 TCP 連接來並行請求,而 HTTP/2 通過多路複用,讓多個請求在同一條 TCP 連接上進行,提高了資源利用率。
  2. 減少冗餘的 HTTP 頭
    HTTP/1.1 的頭部信息通常包含大量的重複字段,比如 Cookie、User-Agent 等,每次請求都要重複發送這些信息,增加了數據傳輸量。HTTP/2 引入了 HPACK 壓縮算法,可以對頭部信息進行高效壓縮,減少傳輸的數據量,提高傳輸效率。
  3. 避免隊頭阻塞(Head-of-Line Blocking)

在 HTTP/1.1 中,由於不支持多路複用,當一個請求被阻塞時,後續的請求只能排隊等待,導致整體加載速度變慢。而 HTTP/2 的多路複用技術可以有效解決這個問題,允許多個請求同時並行發送,避免了因單個請求阻塞而影響整個通信過程。

  1. 服務器推送(Server Push)
    HTTP/2 允許服務器在客户端請求前,主動推送一些資源,減少請求延遲,例如,在請求 HTML 頁面時,服務器可以提前推送 CSS 和 JS,避免額外的請求延遲。

4. 如何使用 HTTP/2?

要使用 HTTP/2,通常需要在服務器端和客户端都進行相應的配置。

服務器端配置

不同的服務器軟件有不同的配置方式,以下是常見的幾種服務器開啓 HTTP/2 的方法:

  • Nginx :確保 Nginx 版本支持 HTTP/2,在配置文件中添加 listen 443 ssl http2; ,並配置好 SSL 證書等相關信息,然後重新加載 Nginx 配置即可。
  • Apache :需要啓用 mod_http2 模塊,在配置文件中添加 Protocols h2 http/1.1 ,同時配置 SSL 證書等,最後重啓 Apache 服務。
  • IIS :在 Windows Server 2016 及以上版本的 IIS 中,默認支持 HTTP/2,只需確保服務器配置正確,並啓用 HTTPS 協議即可。

客户端支持

大多數現代瀏覽器都支持 HTTP/2,如 Chrome、Firefox、Safari 等。通常情況下,只要服務器正確配置了 HTTP/2,瀏覽器會自動使用 HTTP/2 進行通信,無需額外設置。

另外,雖然 HTTP/2 協議本身不要求 HTTPS,但主流瀏覽器只在 HTTPS 下啓用 HTTP/2,因此建議使用 TLS 證書。

Nginx 開啓 HTTP/2(示例)

在 Nginx 配置文件(nginx.conf)中,添加 http2 關鍵字:

server {
    listen 443 ssl http2; # 關鍵!啓用 HTTP/2
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;

    location / {
        root /var/www/html;
        index index.html;
    }
}

重啓 Nginx:

sudo systemctl restart nginx

5. 實戰:使用 curl 發送 HTTP/2 請求

準備工作

確保你的 curl 工具支持 HTTP/2,並且已經安裝了必要的證書。可以通過以下命令檢查 curl 是否支持 HTTP/2:

curl -V | grep 'http2'
# 輸出應包含 "http2"

如果有相應的輸出,那麼則説明支持。

發送 HTTP/2 請求:

我們以 https://httpbin.org/get 作為示例 API 進行測試。

#  `--http2` 參數,強制使用 HTTP/2 協議
# `-I` 參數,顯示響應頭
curl -I --http2 https://httpbin.org/get

分別發送 http2 和 http1.1 進行對比

結果示例:

HTTP/2 200
date: Fri, 14 Mar 2025 15:18:51 GMT
content-type: application/json
content-length: 254
server: gunicorn/19.9.0

如何驗證 HTTP/2 是否生效?

  • 關鍵在於 HTTP/2 200 這一行,表明服務器返回了 HTTP/2 響應。
  • 如果返回的是 HTTP/1.1 200,説明服務器不支持 HTTP/2 或者未正確配置

使用 curl 發送 HTTP/2 詳細請求:

可以在 curl 命令中添加 -v 參數,查看詳細的請求和響應信息,其中會包含協議版本等細節:

curl -v --http2 https://httpbin.org/get

參數説明:

  • -v:顯示詳細調試信息
  • --http2:強制使用 HTTP/2

詳細請求結果


6. 使用 HTTP/2 時,需要注意

  1. HTTP/2 不是默認啓用的
    服務器和客户端必須都支持 HTTP/2,否則仍然會回退到 HTTP/1.1。
  2. 開啓 HTTP/2 不等於網站更快
    HTTP/2 主要優化的是併發傳輸效率,但並不意味着所有場景都會有明顯的速度提升,比如:

    • 如果網站本身請求很少,HTTP/2 提升不明顯。
    • 網絡條件差,可能仍然會有較大的延遲。
  3. HTTP/2 不能直接替代 WebSocket

    • HTTP/2 適合短連接和 Web 資源加載。
    • WebSocket 適合長連接(如實時聊天應用)。
  4. 使用 HTTPS
    雖然 HTTP/2 並非強制要求 HTTPS,但在實際應用中,大多數支持 HTTP/2 的服務器都要求使用 HTTPS,因此在發送請求時通常需要使用 https:// 開頭的 URL。
  5. 檢查 curl 版本
    舊版本的 curl 可能不支持 HTTP/2,如果遇到問題,先檢查並升級 curl 到最新版本。

7. 總結

HTTP/2 作為 HTTP/1.1 的優化版本,主要提升了性能和併發能力,特別是:

  • 多路複用:減少連接數,提升效率
  • 頭部壓縮:減少重複數據
  • 服務器推送:減少請求延遲
  • 二進制格式:更高效的數據傳輸

如果你想使用 HTTP/2:

  • 確保服務器支持 HTTP/2,並且客户端請求時,需要指定使用 HTTP/2
  • 儘量使用 HTTPS
  • 可以用 curl 進行測試

希望這篇文章能幫你更好地理解 HTTP/2,歡迎留言交流你的問題或經驗!🚀

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.