[Network] HTTP/2 簡介與CURL測試方法

Client | Browser | Web Server | nginx | 原理

Intro

相較於 HTTP 1.1,主要解決 HOL (head-of-line) blocking 應用層問題,Frame 編碼改用 Huffman Coding,Header 另外採用 HPACK 壓縮


Client 測試方法

CURL

首先可以檢查CURL是否支援HTTP2:

$ curl --version
...
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz HTTP2 UnixSockets HTTPS-proxy

CURL --http2

HTTP/2 with curl

利用CURL的--http2參數指定開啟HTTP/2並用的-I參數回傳Header確認Protocol:

$ curl --http2 -I https://www.google.com
HTTP/2 200 
content-type: text/html; charset=ISO-8859-1

Browser Developer Tool

  • Firefox: 預設 Network 的 Header 就會顯示如 Version HTTP/2

  • Chrome: Network 的 Header 中 HTTP 2 反而不會顯示,可以在列表中右鍵點 column 新增 protocol 來辨別如 h2


WebServer HTTP/2

Nginx

確認 Nginx 版本為 1.9.5 以上,直接對 Server listen ssl 設定列多加http2 即可:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    ssl_certificate     server.crt;
    ssl_certificate_key server.key;
    ...
}

修改完成後 nginx -t 確認無誤即可 reload 生效


抓包實測原理

基於 TCP connection 的唯一值是 IP + Port,HTTP 2.0 以前 Browser 遇到同一個 host 多個請求的狀況,通常會同時並行請求達到 multi-threads 效果。HTTP 1.1 Keep-alive 可以再繼續復用這些 connections。

HTTP 2.0 後對同一個 host 只需要一個 TCP connection,在其下雙方可以並行發送與接收 Application Data。


References

Leave a Reply

Your email address will not be published. Required fields are marked *