#このページで確認できること

公開範囲: このページのcurl例は公開URLで実行できます。HTTPSのパケットキャプチャからHTTPメッセージを読むには、ブラウザのキーログなど復号に必要な情報を別途用意します。

#特徴

#通信シーケンス

HTTP/1.1 over TLS — 基本シーケンス
participants: Client, Server
Client -> Server: TCP SYN
Server --> Client: SYN/ACK
Client -> Server: ACK
note: TCP 3-way handshake 完了
Client <-> Server: TLS handshake (ClientHello / ServerHello ...)
Client -> Server: GET /index.html HTTP/1.1
Server --> Client: HTTP/1.1 200 OK + headers
Server --> Client: Response body
note: Keep-Alive により同一コネクションで次のリクエストを送れる
Client -> Server: GET /style.css HTTP/1.1
パイプライン時の Head-of-line blocking — 応答順序は入れ替えられない
participants: Client, Server
Client -> Server: GET /slow (処理に時間がかかる)
Client -> Server: GET /fast (応答を待たずに送信)
note: /fast の処理が先に終わっても、応答はリクエスト順に返す
Server --> Client: 200 OK (/slow, ようやく完了)
Server --> Client: 200 OK (/fast)

#検証コマンド

curl — HTTP/1.1 を明示して観測
$ curl -v --http1.1 https://web-protocol-lab.com/status/200
# -v で「> GET /status/200 HTTP/1.1」「< HTTP/1.1 200 OK」を確認

$ curl -v --http1.1 -H 'Connection: close' https://web-protocol-lab.com/status/200
# レスポンス後にコネクションが閉じられることを確認
openssl — TLS接続へHTTP/1.1を手動送信
$ printf 'GET /status/200 HTTP/1.1\r\nHost: web-protocol-lab.com\r\nConnection: close\r\n\r\n' \
    | openssl s_client -quiet -connect web-protocol-lab.com:443 \
        -servername web-protocol-lab.com -alpn http/1.1
# TLSの内側へ、開始行とヘッダーフィールドをテキストで送る
応答例 (主要ヘッダーの抜粋)
HTTP/1.1 200 OK Server: nginx Content-Type: text/plain Connection: close X-Demo: status-200 200 OK

#観測ポイント

curl-v でリクエスト/レスポンスの生テキスト。--http1.1 で強制。2回連続リクエストで * Re-using existing connection が出れば Keep-Alive が効いている。
DevToolsNetwork → 対象リクエスト → Headers で Protocol 列 (http/1.1)。Timing タブで Stalled(コネクション待ち)を観測。
ProxyHTTP/1.1を終端するプロキシは、メッセージを解析して転送する。Via: 1.1 proxy-name の付与、Hop-by-hop ヘッダー(Connection, Keep-Alive)が次のホップへそのまま転送されないことを確認。
tcpdump / Wireshark公開URLはHTTPSです。通常のキャプチャではTCPとTLSの流れを確認でき、HTTPメッセージを読むには復号設定が必要です。
TLS inspection装置がTLSを終端し、クライアント側でHTTP/1.1を選択した場合は、復号後のメッセージを解析します。ヘッダーの追加や正規化を直接接続と比較します。
tcpdump
$ sudo tcpdump -i <interface> -w http11.pcap 'tcp port 443'
# 公開URLとのTLS通信を保存し、必要に応じてWiresharkで復号する

#HTTP/2 へ続く課題

HTTP/1.1 の限界がそのまま HTTP/2 の設計動機になっています。

続き: HTTP/2 →