HTTP/2実装
このブログを少しでも高速にすべく施策を先ほどリリースしました。それは、掲題にも書いている通りHTTP/2による通信を実施しました。iPhone7でみる限り、HTTP/2通信でアクセスされていることを確認しています。
HTTP/2って速いの?
高速化する仕組みは、下記の図の通りです。
ストリームはクライアント−サーバー間を結ぶ仮想的なコネクションのようなもので、1つのHTTP/2コネクション内で同時に複数のストリームを確立できる。HTTP/2ではこのストリーム内でリクエストやレスポンスをやり取りする仕組みになっている。
ストリームはそれぞれ独立しており、あるストリームでやり取りされている内容がほかのストリームに影響を及ぼすことはない。そのため複数のリクエスト/レスポンスを同時並行的に処理でき、レスポンスを返すための処理に時間がかかるようなケースでも、その間に別のリクエスト/レスポンスを処理することが可能となった。たとえば上記図の例では3つのストリームが確立されており、それぞれのストリーム内でのリクエストやレスポンスはほかのストリームの状態によらず送受信が可能になっている。
ストリームごとに「優先度」を設定することも可能で、たとえばコンテンツの表示に必須のデータを優先して送信する、といった処理も可能だ。また、ストリーム毎にフロー制御を行う機能も用意されている。
そのほか、従来のHTTPはクライアント/サーバー間はテキストベースで行われていたが、HTTP/2ではクライアント/サーバー間の通信がバイナリベースで行われるようになった。さらにクライアント/サーバー独自に機能を拡張するための仕様も策定されている。
このように、HTTP/2ではクライアント/サーバー間でやり取りを行う方式が大きく変わっているが、送受信されるデータについては従来のHTTPからは変わっていない。リクエストやレスポンスに「キー:値」形式のHTTPヘッダが付与される点も同じだ。そのため、たとえばCookieやHTTPヘッダを使った認証などはまったく同じように動作する。さらにHTTPヘッダの送受信時には圧縮/展開が行われるようになり、効率的なやり取りが可能となった。
また、HTTP/2のもう1つの大きな新機能として、リクエストされていないコンテンツをサーバーがクライアントに送信する「サーバープッシュ」機能がある。たとえばクライアントがHTMLファイルをリクエストした場合、それに続いてそのHTMLファイル内で指定されているCSSファイルやスクリプトファイルなどがリクエストされる可能性が高い。サーバープッシュ機能を利用することでそういった関連ファイルを自動的にサーバーからクライアントに送信することが可能になり、クライアントがリクエストを行うオーバーヘッドを削減できる。