Webサーバーは既存のHTTP/1.0やHTTP/1.1との互換性を確保するため、HTTP/2に対応していないWebブラウザーからのリクエストにも対応できなければいけない。HTTP/2で通信するには、どこかで「ここからはHTTP/2でやり取りしますよ」というスイッチを明示的に入れなければならないのだ。

HTTPから遷移する

 この方法は、通信経路を平文にするか、TLS/SSLで暗号化するかによって違ってくる。

 平文の場合は、HTTP/1.0やHTTP/1.1にあったプロトコルのアップグレード機能を使う。これはリクエストヘッダーの要素として規定されていて、最初のベースとなるHTMLファイルをダウンロードする際にヘッダーに記述する(図9(a))。

 HTTP/1.0と同1.1の場合、基本的なアクセス方法に互換性があるため、両者の間でプロトコルを切り替える必要はなかった。リクエストヘッダーにあるバージョン番号をWebサーバーがチェックすれば十分だった。

 しかしHTTP/2はこれまでのアクセス方法と互換性がないため、このやり方は通用しない。そこでもともとHTTP/1.0で規定されていたUpgrade機能を利用して、HTTP/2での通信を開始する。

 実際、最初はHTTP/1.1で始まっている。クライアントはGETメソッドを発行し、そのリクエストヘッダーにUpgrade項目を入れる。これに対しサーバーがレスポンスとして、「Switching Protocol」を返して、HTTP/2での通信が始まる(同(c))。「h2c」とあるのが、平文によるHTTP/2プロトコルを指している。

 一方TLS/SSLを使う場合は、最初からHTTP/2での通信を始められる。TLS/SSLでは、その上のレイヤーで利用するプロトコルを通知する機能であるALPNを利用できるからだ(同(b))。ALPNは最初のTLS/SSLのネゴシエーション時に、アプリケーション層が利用するプロトコルを定める手順。クライアントがアクセス時に利用したいプロトコルを通知し、サーバーがその中から実際に使うプロトコルを選ぶことでプロトコルを決定する。

 FirefoxがHTTP/2対応サーバーに接続する様子を見ると、プロトコルとして「h2」「SPDY/3」「http/1.1」の三つを挙げているのがわかる(同(d))。この中からサーバーがh2を選択するので、以降のやり取りがHTTP/2に切り替わる。

図9●HTTP/2を指定して接続する二つの方法
図9●HTTP/2を指定して接続する二つの方法
HTTP/1.1のプロトコルアップグレード機能を使う方法(a)と、SSL/TLSのALPNを使う方法がある(b)。前者はアップグレードを指定するヘッダーを送ってHTTP/2に切り替える。SSL/TLSを使わないアクセス方法なので、現実にはあまり見かけない。なお「h2c」「h2」というのが、HTTP/2を表している。実際のやり取りを見ると、h2cやh2といった文字があることがわかる(c、d)。
[画像のクリックで拡大表示]
▼ALPN
Application Layer Protocol Negociationの略。アプリケーション層で利用するプロトコルを、クライアントとサーバーで対話して決める。