プロトコルやクライアントとサーバの動作を理解するには、実際に動かすことが大事です。そこで本章では、実際にHTTP/3に触ってみます。ブラウザやCurl、Wiresharkなどを使ってHTTP/3通信を確認する方法と、nginxを使ってHTTP/3サーバを構築する方法を紹介します。
なお、本章で紹介する以外にも、さまざまなQUICやHTTP/3の実装が公開されています。「QUIC Implementations」に一覧がまとまっています。
Chromeによる確認
Chrome、Firefox、Safariでは、特別な設定をせずともHTTP/3通信が行われます。本節では、Chromeの最新版(執筆時点では91.0.4472.77)を用いてHTTP/3通信を確認します。
ChromeのデベロッパーツールのNetworkペインでは、そのタブで行われた通信を確認できます。このペインを開いた状態でhttps://www.google.com/にアクセスすると、ブラウザが送信したリクエストの一覧が表示されます(図1)。
Protocolのカラムで、使用したプロトコルを確認できます。図1では、HTTP/3の草案29版の実装を示すh3-29
と表示されています。正式なHTTP/3では、h3
と表示されるでしょう。
Curlによる確認
CLI(Command Line Interface)からHTTP/3通信を行うツールもあります。本節では、HTTP/3に対応しているCurl(執筆時点ではバージョン7.77.0)を試します。
GitHubのCurlのリポジトリのページに、HTTP/3を有効にしたビルド方法についての解説があります。Tatsuhiro Tsujikawaさんが開発しているngtcp2を用いる方法と、Cloudflareが開発しているquicheを用いる方法があります。今回は、手順の短いquiche(執筆時点ではリビジョン56edda7
)を使用した流れを紹介します。暗号ライブラリであるBoringSSL(執筆時点ではリビジョン47cefed
)も利用します。
補足情報:
Curlのビルド手順が更新されています。2022年6月現在の手順は次のとおりになります。
なお、Curlのビルドの最新手順は公式であるHTTP3 (and QUIC)を参照してください。
Wiresharkによる確認
マシンで行われている通信のパケットをキャプチャし、パケットの中身をプロトコルにあわせて人間が読める形で表示してくれるWiresharkというツールがあります。Wiresharkを使うと、QUICやHTTP/3のストリームやフレームの情報も確認できます。
Wiresharkは、公式サイトからダウンロードしてインストールしてください。執筆時点のバージョンは3.4.5です。
復号の準備
HTTP/3が下位層で使用するQUICは通信を暗号化するので、Wiresharkで復号する必要があります。そのためには、通信を行うアプリケーションから復号用の鍵を取り出す必要があります。なお、QUICが用いるTLS 1.3では短期利用の鍵(ephemeral key)を用いるので、いわゆるサーバ証明書と紐付く秘密鍵では復号できません。
ここでは、Chromeから復号用の鍵を取り出します。そのためには、OSの環境変数にSSLKEYLOGFILE
を設定します。変数値はファイルの出力先パスです。Windowsの場合は、「コントロールパネル」➡「システムとセキュリティ」➡「システム」➡「システムの詳細設定」➡「環境変数」と進んで設定します(図2)。macOSの場合は、次のようにターミナルから環境変数を付けてChromeを起動してください。
続けて、Wiresharkの設定です。「編集」➡「設定」と進み、TLSの「(Pre)-Master-Secret log filename」にSSLKEYLOGFILE
で設定したファイルを指定します(図3)。
パケットキャプチャ
ここまで設定できたら、Wiresharkでパケットキャプチャを開始し、Chromeでhttps://www.google.com/にアクセスしてください。図4のように、HTTP/3通信の中身がWiresharkに表示されます。
図4では、QUICパケットが暗号化されていることを示すProteceted Payloadと表示されています。パケット番号(PKN)が5のパケットを例にパケットの中身を説明すると、ストリームIDが3のQUICストリームでQUICのSTREAMフレームが送信されています。そのSTREAMフレームには、HTTP/3のSETTINGSフレームが格納されています。
図4上でパケットを選択することで、パケットの詳細を確認することもできます。
qvisによるQUIC通信の可視化
本節では、qlogをわかりやすく表示するツールであるqvisを紹介します。
qlogは、QUIC用のログ形式です。「Main logging schema for qlog」として、IETFで標準化が検討されています。qlogでは、パケットだけでなく、通信内容やエンドポイントの状況が記録されます。
qlogで記録するには、アプリケーションがqlogに対応している必要があります。先述したCurl、quicheなどが対応しています。今回はCurlを使用します。
Curl通信の可視化
Curlでqlogを出力する場合、環境変数にQLOGDIR
を設定します。
これで、指定したディレクトリに~.qlog
というファイルが出力されます。このファイルをqvisで可視化します。
qvisは作者のWebサイト上でも使用できます。
https://qvis.quictools.infoにアクセスし、qlogファイルをアップロードすると、図5のようにQUIC通信の様子を確認できます。
図5の上2つの矢印を例に見方を説明します。まず、クライアントから、QUICのCRYPTOフレームをパケット番号0のInitialパケットで送信しています。次に、サーバから、QUICのCRYPTOフレームとACKフレームをパケット番号0のInitialパケットで返しています。
表示されている項目をクリックすると、QUICパケットの詳細や、クライアントやサーバで発生したイベントを確認できます。図6は、図5でクライアントが最初に送信しているInitialパケットの詳細を表示したものです。
通信内容をアップロードしたくない場合は、GitHubからqvisをダウンロードしてインストールしてください。
nginxサーバの構築
HTTP/3サーバの実装はいくつかありますが、本節ではnginxでHTTP/3サーバを動かしてみます。
なお、nginxのHTTP/3実装は実験段階であるため、今後変わる可能性があります。ビルドおよび設定の最新情報は、nginxのページを参照してください。
ビルド
nginx(執筆時点ではリビジョンe6c26cb4d38b
)を自前でビルドします。ここでは、Ubuntu 20.04を使用した手順を紹介します。
設定
nginxでHTTP/3を有効にするために、サーバ証明書を作成し、./conf/nginx.conf
に設定を追記します。
なお、ここで準備した証明書は、公的な認証局に署名してもらったものではないため、ブラウザで閲覧すると警告が出ます。実際に使う際は、正規の証明書を使用してください。
動作確認
nginx-quicディレクトリに移動し、nginxを起動します。
HTTP/3に対応したCurlを使うと、ちゃんとアクセスできます。
まとめ
本章では、ブラウザやサーバで実際にHTTP/3通信を確認しました。また、HTTP/3サーバの構築も行いました。