そろそろHTTP/2について正しく理解しようと思い、今回はHTTP/2についてまとめてみました。
きっかけは、先日HTTP/2について質問されたときに、上手く説明できなかったことです。
WEBの世界で仕事をしているのでHTTP/2については大体は分かっていたつもりだったんですが、
それを自分なりに説明しようとすると、思った以上に自分が曖昧にしか理解していなかったことに気づきました。
HTTP/2について説明するには、まずHTTP/1.1についても説明が必要になりますが、
そもそもHTTP/1.1やHTTP/2って何?というお話から。
コンテンツ
HTTP/1.1やHTTP/2って何?
HTTP/1.1やHTTP/2は、つまり、HTTPとは何かというお話です。
HTTPとは通信プロトコルと呼ばれるもので、
インターネット上でクライアント(ブラウザなどの)とWEBサーバがお互いに通信を行うための約束事のようなものです。
※プロトコルとは、日本語だと規約といい、約束事のようなものと考えて下さい。
つまりは、ブラウザ上でホームページを閲覧する際に、ブラウザとWEBサーバの間でHTMLや画像などのやり取りを行うための仕組みとなります。
現在広く普及しているバージョンがHTTP/1.1となりますが、
その前はHTTP/1.0、さらにそれ以前のものはHTTP/0.9とまとめられています。
で、数年前に公開されたのがHTTP/2と呼ばれるバージョンで、HTTP/1.1と比べて通信効率が改善され、
さらに高速に通信できるようになっています。
因みに、このHTTP/1.1が公開されたのは1999年と古く、私がまだ高校生の頃です。
HTTP/2のプロトコルが公開されたのが2015年なので、実に16年ぶりに新しいバージョンが登場したことになります。
HTTP/1.1とHTTP/2の違いは?
これらの違いというか、
HTTP/2での改善点といった方が正しいように思いますが、
・通信効率の改善(WEBサイトの表示速度の改善)
・ヘッダの圧縮機能の追加
です。
通信効率の改善(WEBサイトの表示速度の改善)
すでに説明したように、HTTP/1.1やHTTP/2は、ブラウザとWEBサーバ間でデータをやり取りする際の仕組みになります。
例えば、私がブラウザを使ってどこかのWEBサイトを閲覧しようとした場合、
ブラウザはWEBサーバに対して、そのWEBサイトで使用されているHTMLや画像などを見せて!とリクエストします。
↓
そうすると、WEBサーバはHTMLや画像などをブラウザに返してくれるので、私はそのWEBサイトを閲覧することができます。
この際注意しないといけないのが、1つのサイトで使われている画像は複数あるということです。
この場合、ブラウザはWEBサーバに対して複数の画像を同時に見せて!とリクエストすることになりますが
HTTP/1.1の場合には、複数のリクエストが同時に来ても、1枚ずつしか画像を返すことができません。
リクエストを順番に1つずつしか処理できないという非効率な仕組みになっていたわけです。
これだと、前の処理が何らかの理由で遅れてしまうと、後の処理まで遅れてしまうという大きなデメリットがありました。
その仕組みを改善したのがHTTP/2で、複数のリクエストを並行して同時に処理することができるようになりました。
ブラウザに対して画像などを同時に返せるようになったわけですね。
これにより通信効率が大きく改善されることになったので、結果的にWEBサイトの表示速度も速くなったという訳です。
ヘッダの圧縮機能の追加
HTTP/2からはHTTPボディだけではなくHTTPヘッダも圧縮して送信できるようになりました。
圧縮にはHPACKと呼ばれる方式が採用されていて、
新しく送信が必要なHTTPヘッダ情報のみを差分データとして送信できるようにして、
同じ内容のHTTPヘッダを繰り返し送信しないようにしたようです。
それと、バイナリ形式への圧縮も行われるようになっています。
通常、人間が理解できるテキストデータのままではコンピュータは理解することができません。
そこで、バイナリデータと呼ばれるコンピュータが理解できる形式に変換する必要があるのですが、
予めバイナリデータに変換しておくことで、通信の度に変換する必要がなくなりました。
最近は、HTTP通信を行う際には多くのHTTPヘッダ情報が追加されるようになっているので、
HTTPヘッダの転送量を減少させることで通信速度の高速化を狙ったみたいですね。
WEBサーバの対応状況
HTTP/2について説明してきましたが、当然WEBサーバ自体がHTTP/2をサポートしていないと意味がありません。
その対応状況ですが、少なくとも、主要なWEBサーバの最新バージョンであれば全て対応しています。
ApacheやNGINX(エンジンエックス)、Windowsサーバで利用されるIISは、利用できるようになっています。
その他にも、第4のWEBサーバとして注目されているLiteSpeed(ライトスピード)もHTTP/2をサポートしています。
各ブラウザの対応状況
各ブラウザのサポート状況ですが、こちらもWEBサーバと同様に主要ブラウザの新しいバージョンであれば、HTTP/2をサポートしています。
主要ブラウザといえば、PCであれば、Google ChromeやFirefox、IE11、Edge、Safari、Operaなどですかね。
あとは、スマートフォンで使用されているiOS SafariやChrome for Android辺り。
これらは全て対応しています。
HTTPS通信とHTTP/2の関係
上記でHTTP/2に対応している主要ブラウザについて記載しましたが、
主要ブラウザに関してはもう1点注意する点があります。
主要ブラウザでは、HTTPS通信に対応していないとHTTP/2を利用できません。
HTTP/2側の仕様では、HTTPS通信でもHTTP通信でも問題ないのですが、ブラウザ側が制限しているみたいです。
セキュリティを上げるために暗号化通信を促進するためだと思いますが、常時SSL通信の設定は必須ですね。
つまり、HTTP/2とSSLの導入はセットで考えておかないといけないみたいです。
因みに、HTTP/2に対応させる場合には、OpenSSLのバージョンが1.0.2以上である必要があります。
OpenSSLはHTTPS通信に必須のライブラリなので、もしOpenSSLのバージョンが低いと、HTTPS通信を行っていてもHTTP/2を利用することができません。
最後に
HTTP通信プロトコルは、現在、HTTP/1.1からHTTP/2へ変わりつつあります
既にHTTP/2のシェアは34.7%に達しています(2019年4月現在)。
[ Usage of HTTP/2 for websites ]
通信効率が改善されるのはいいことですし、それによりWEBサイトの読み込み速度も上がるのであれば、
この傾向が続くことは望ましいですね。
因みに、HTTP/2により必ずしもWEBサイトの表示速度が改善されるわけではないようです。
・元々HTTP/1.1の段階で様々な対策を取られていて十分なパフォーマンスが出ていた
・コンテンツ自体の内容が薄いので、WEBサイトで使用されていたテキスト量や画像枚数が少ない
といった場合には、
HTTP/2を導入してもあまり変化が無い場合もあるようです。
この記事へのコメントはありません。