blog

program

駆け出したプログラマからの調査報告 #1~HTTP/2に関して~

新卒としてディレクターになる予定で入社してから1年と少し経ち、ひょんなことから今はプログラマをしている林田です。
Web業界の情報収集や勉強もかねて、社内の新人プログラマ2人で「業界のトレンドについて調べて、書いてみる」という企画の連載をはじめることになりまして、今回はその第一弾です。月2回くらいの頻度で更新していく予定ですので、今後にご期待ください。
初回は「HTTP/2」について、です。

Webの主要な通信プロトコルであるHTTPの新しいバージョンである「HTTP/2」が、2015年2月17日にIETF(The Internet Engineering Task Force)によってRFC7540として正式に策定されました。主要なブラウザやHTTPサーバーでサポートが進み、その導入が現実味を帯びてきた今、「HTTP/2」の現状について書かせていただこうと思います。

「HTTP/2」の生い立ち

HTTP/2は昨年、標準化団体であるIETFによって策定されたのですが、実は、その起源はGoogleが独自に開発していた「SPDY(スピーディー)」という通信プロトコルにあります。
1999年に策定されてからずっと使われ続けていたHTTP/1.1が、最新のリッチなWebに対応しきれていないことに不満を抱いたGoogleが、より”SPDY”なWebを実現するために、HTTP/1.1にオーバーラップする形で開発をはじめたプロトコルがHTTP/2の原型になっているのです。
SPDY/3をHTTP/2(first draft)としてそのままコピーして、IETFが引き継ぐ形で開発が進められたため、HTTP/2もSPDYと同様にHTTP/1.1の足りないところを「補う」ことを目的としたプロトコルであるといえます。

したがって、HTTP/2ができたからといってHTTP/1.1が廃止されるわけではなく、今後も存続します。ブラウザやサーバーの環境がかなり整ってきたとはいえ、まだまだ導入コストは高いのが現状ですから、少なくともしばらくの間はHTTP/2への移行はあまり進まず、一部の大規模サイトを除いては従来通りHTTP/1.1による通信が続けられるものと思われます。
とはいうものの、HTTP/2はまったく使われていないわけではなく、一部のサービスではすでに利用が開始されています。

「HTTP/2」はもうはじまっています

SPDYの開発をはじめたGoogleはもちろん、twitterやfacebookでもSPDYの時代から試験導入が実施されていて、現在はもうすでにHTTP/2によって通信が行われています。
Google Chromeには、開いているWebページがHTTP/2に対応しているかどうかチェックできるアドオンがあり、それを使うことで対応状況を簡単に調べることができます。

右端の青色のカミナリはHTTP/2に対応していることを表しています。

カミナリが赤色になるとそれはHTTP/2に加え、QUIC(Quick UDP Internet Connections)にも対応していることを示します。

「HTTP/2」の特徴

次に、なぜHTTPの新しいバージョンが開発されたのか、1.1と2では何が違うのかを知るために、HTTP/2の主な特徴を見ていきましょう。

並列リクエスト

GoogleがSPDYの開発をはじめた理由は、その名前に端的に表れているように”速さ”が欲しかったからです。
ステートレスなプロトコルであるHTTP/1.1は状態を持たないため、ブラウザからサーバーへ送られるリクエストは一度に一つが基本です。つまり、複数のリクエストを送信したい場合、前に送ったリクエストに対するレスポンスを待ってからしか次のリクエストを送ることができなかったのです。このような仕様のもとで多くの情報をやり取りしようとすると、レスポンスの待ち時間のためにリクエストが滞り、ページの読み込みなどに多くの時間がかかってしまいます。
その問題を解決するために、TCPの同時接続数を4~6つまで増やせるようにしたり、ajaxを用いて非同期でリクエストを送信したりといった対策がさまざまに取られてきましたが、それらはいずれもGoogleが求める速さを満たすものではありませんでした。そうして開発されたのがSPDYでありHTTP/2なので、「並列リクエスト」はHTTP/2の主要な特徴の一つとなっています。

HTTP/2では大量のリクエストを並列して投げることができるため、レスポンス待ちでリクエストが詰まることがありません。そのため読み込みが速くなるといわれるのです。その一方で、TCP接続は1回線に制限するので、帯域の使用もHTTP/1.1よりも効率的になります。

実際の読み込みの様子を見てみましょう。

HTTP/1.1です。TCPの6つの帯域を使用していますが、Head of Line Blockingが発生して読み込みに遅延が生じています。

一方HTTP/2ではたくさんのファイルが同時に読み込まれるため、TCPの帯域は1つだけであるにもかかわらず遅延は見られません。速いです。

ただし、この例のように効果が顕著に表れるのは、多くのリクエストを要する大規模サイトの場合だけであることには注意が必要です。つまり、6つのリクエストを同時に使い切ることがなく、Head of Line Blockingが発生しないような小規模なサイトについては、読み込み時間の短縮効果は小さいでしょう。そのようなサイトについては、少なくとも速さという点でHTTP/2を導入するメリットはほとんどないということです。

ヘッダの圧縮+バイナリ

インターネット上でやり取りされるデータのほとんどは、パケットと呼ばれる小さな単位に分割されます。そしてそのそれぞれに目的地などの情報が書かれたヘッダが付けられています。大きなデータをやり取りする際には、当然このパケットの数も多くなります。
HTTP/1.1ではすべてのパケットのヘッダが非圧縮のテキストデータで記述されていましたが、HTTP/2では圧縮されたバイナリデータの状態でやり取りされるので、通信データのサイズを小さくすることができます。

この点についても通信するデータが多ければ多いほど効果が顕著になるので、やはり小規模サイトでは期待するほどの効果は得られないでしょう。

読み込みの優先順位

HTTP/1.1ではHTMLデータ内の記述を上から順番に読み込んでいくことしかできなかったので、とにかくページを早く表示させるためにJavascriptを読み込む位置をfooterにするなど、様々な工夫がなされてきました。
対するHTTP/2では多くのデータが並列で読み込まれることになるのですが、ただ同時に読み込むだけではなく、それぞれのデータに優先順位を任意に指定できるようになりました。
これにより、大量のデータを同時に、しかも優先度に従って効率的に、ブラウザに読み込ませることができるようになるのです。

このように、HTTP/1.1から改良・変更された点がたくさんあるHTTP/2ですが、ブラウザやHTTPサーバーのHTTP/2への実際の対応状況は、どのようになっているのでしょうか。

対応状況(2016年5月17日現在)

ブラウザの対応状況

  • Google Chrome→40~(SPDYは廃止、30系は要設定)
  • FireFox→34~
  • Safari→9~
  • Internet Explorer→Win10上の11
  • Microsoft Edge→○

IE以外の主要なブラウザはすでに対応済みなので、最新版を使っていれば知らず知らずのうちに、HTTP/2を体験していることになります。ただ、IEの対応状況はあまり芳しくないので、そういう点からも今すぐHTTP/2へ移行することのコストは大きいのかもしれません。

HTTPサーバーの対応状況

  • Apache→2.4~
  • Nginx→1.9.5~
  • H2O→○

3つ目のH2OというHTTPサーバーは、「HTTP/2や常時TLSを前提としたWeb」に最適化することを目標に開発が進められているオープンソースのサーバーです。対応している環境ではHTTP/2を、未対応ならHTTP/1.1を、自動で切り替えて使用するように設定できるなど、HTTP/2対応のために必要な機能が充実しており、今後の発展が期待されます。

まとめ

ここまで見てきたように、HTTP/2は従来よりも高速な通信を実現してくれるプロトコルです。

しかし、ブラウザやサーバーの対応が徐々に進んできてはいるものの、現状ではHTTP/2の導入には下記のようなコストや手間がかかります。

  • サーバーをHTTP/2に対応させる必要がある
  • 古いIEなどHTTP/2非対応のブラウザにも対処しなければならない
  • HTTPS必須のためSSL証明書の発行・維持費用が発生する

その上、HTTP/2の並列リクエストやヘッダの圧縮による高速化は、多くの通信を要する大規模なサイトやサービスでない限りそれほど大きな効果を発揮するものではありません。したがって、小規模なサイトに今すぐ導入することにメリットは少ないでしょう。

ただ、HTTP/1.1を前提に構築されている現在のサイトでそれほどの効果が得られないとしても、HTTP/2がもたらす高速通信によって開ける可能性を考慮すると、導入してみる価値も十分にあるといえるようにも思います。

HTTP/2に対応したサーバーを簡単に実装できるサービスやSSL証明書を無料で発行できるサービスなども次々に出てきているので、誰もが手軽に安全で高速な通信を利用できる、HTTP/2や常時TLSを前提としたWebの実現も、そう遠くない未来に実現されるのかもしれません。

感想

今回この記事を書くためにいろいろと調べたのですが、HTTP/2に関しては本当に様々なことがいわれていて、実際のところどうなのかはとにかく使ってみないとわからないなーという印象でした。 とりあえず今作っている社内アプリか何かで実際に試してみようと思います。