ぼくの主(作者)がインターネットを使い始めたのは1998年頃になるので、もうすでにHTTP/1.1が発表された後のことになります。プロトコルは今と同じですが、光回線だとかケーブルテレビだとかの普及によって、当時とは比較にならないほど多くの通信量を扱えるようになり、フルHDの動画配信、ストリーム放送、オンラインゲームだったりとコンテンツもそれに伴い変化してきました。そしてさらに進化を続けています。
まずは昔話からいきますか。
HTTP/1.0の前はHTTP/0.9です。HTTP0.9にはGETメソッドしかなかったようですね。
HTTP/1.0になり、POSTやHEADメソッドが利用できるようになりました。POSTと見ると動的な事が頭に浮かびます。ところで、パソコン通信が流行っていたのはいつ頃かというと1990年前後のようです。GETしかないのにどうやって!?と思ったら、パソコン通信はそもそもインターネットではなかったようですね。どういうものだったのでしょうか?と少し気になるところですが、今回はHTTP/2.0に向けての話なので、また気が向いたら調べてみようと思います。
では、HTTP/1.1とHTTP/1.0の違いはと言うと、HTTP/1.1になり、OPTION・TRACE・CONNECTメソッドが追加され、PUTとDELETEが更新され、名前ベースのバーチャルホストがサポートされました。名前ベースのバーチャルホストも今では当然のように使われている技術ですが、ぼくもほんの3年前まで知らなかった事で、IPアドレス1個でなんで通信できるのか疑問に思っていました。
そんな疑問も98年にはすでに改善されていたのですから驚きです。
ではTelnetを使ってHTTP/1.1とHTTP/1.0でアクセスしてみましょうか。
まずは普通にHTTP/1.0のHEADメソッドでアクセスしてみます。
$ telnet www.vincentina.net 80 Trying 133.242.178.136... Connected to www.vincentina.net. Escape character is '^]'. HEAD / HTTP/1.0 HTTP/1.1 200 OK Date: Wed, 04 Mar 2015 02:51:13 GMT Server: Apache X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Powered-By: Phusion Passenger 4.0.53 Status: 200 OK X-Mod-Pagespeed: 1.9.32.3-4448 Cache-Control: max-age=0, no-cache Vary: Accept-Encoding Connection: close Content-Type: text/html;charset=utf-8 Connection closed by foreign host.
おや、HTTP/1.1で返ってきましたね。Passengerというヘッダ情報があるのでブログではなくてイベント情報の方へアクセスしたようです。
Apacheの設定を変更します。環境変数にforce-response-1.0を与えることで1.0のリクエストに対しては1.0で応答することができます。
SetEnv force-response-1.0
この記述をhttpd.confへ追加して、apacheをreloadしてからもう1度Telnetを試してみます。
$ telnet www.vincentina.net 80 Trying 133.242.178.136... Connected to www.vincentina.net. Escape character is '^]'. HEAD / HTTP/1.0 HTTP/1.0 200 OK Date: Wed, 04 Mar 2015 02:52:47 GMT Server: Apache X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Powered-By: Phusion Passenger 4.0.53 Status: 200 OK X-Mod-Pagespeed: 1.9.32.3-4448 Cache-Control: max-age=0, no-cache Vary: Accept-Encoding Connection: close Content-Type: text/html;charset=utf-8 Connection closed by foreign host.
HTTP/1.0で返ってきましたね。Tcpdumpでパケットの状態を見ましたがHEADリクエストだととくに違いはありませんでした。GETだと30行ほどHTTP1.1の方が多かったです。フラグは細かいところまで見ていませんので、細かい違いは不明です。また時間がある時に調べましょう。
それではHTTP/1.1でホストを指定してみますか。
$ telnet www.vincentina.net 80 Trying 133.242.178.136... Connected to www.vincentina.net. Escape character is '^]'. HEAD / HTTP/1.1 Host: www.vincentina.net HTTP/1.1 200 OK Date: Wed, 04 Mar 2015 08:39:29 GMT Server: Apache Cache-Control: max-age=0, no-cache Vary: Accept-Encoding Content-Type: text/html; charset=UTF-8 Connection closed by foreign host.
ちゃんとブログ側のレスポンスが返ってきましたね。
これがHTTP/1.1です。
ただし、HTTP/1.1の発表が1997年。インターネット黎明期と言われている1998年頃からずっと同じ仕様なのかというと、そうではなくて、HTTP/1.1という名前こそ変わっていませんが、昨年にもメジャーチェンジをしています。
参考サイト
HTTP/1.1 が更新された | The Long Wait:
詳しいことは参考サイトを確認いただくとして、ざっと見ただけでも結構な変化があったようです。
HTTP/2.0の前にSPDYについて少し触れておきますか。
冒頭でもお話したように、昔とは比較にならないほど多くの通信量を扱えるようになりコンテンツも変わってきています。SPDYは高速化するようにGoogleが開発したプロトコルです。SPDYの最終モデルはSPDY3.1です。続くSPDY/4.0はHTTP/2.0に吸収されるようですから、SPDYを知ることは予習をするようなものでしょう。
まるで未来のことのように書いていますが、SPDYは既に実用化されていてFacebookやTwitterでは数年前から導入されていたようです。
参考サイト
mod_spdy – mod_spdy — Google Developers:
ChromeのSpdyindicatorプラグインだとSPDYの有効が確認できましたが、FirefoxのSpdyindicatorプラグインだとマークが表示されませんでした。相性問題のようなものがあるのかもしれないですね。その影響で随分と時間がかかってしまい、最終的にはSPDY3.1がサポートされているNginx1.6を使うことにしました。
手順は省略して箇条書きにします。
・Nginx1.6のリポジトリをインストールしてYumからインストール。
・自己認証局作成、自己証明書生成。
・/etc/nginx/conf.d/ssl.conf で spdy の有効化を記述。
以上です。
非常に分かりにくいですが、SPDYが有効だと色がついた稲妻のマークが出ます。
キャプチャした画像はWindowsのFirefoxでの画像です。ブラウザでなかなか有効の確認ができずに色々と切り分けしていたのでこの画像になっています。
SPDYのインストールは完了しました。
SPDYは高速化するようにGoogleが開発したプロトコルでしたが、どんな高速化かというと多重化のようです。半二重から全二重になるようなものでしょうかね。
ベンチマーク厨のぼくはベンチマークしたくてうずうずします。サーバー側だけ対応していてもリクエスト側が対応していないとできないので、ApacheBenchをNginxに打つべし!とは残念ながらできないです。ただApacheBenchでもHTTPSの通信がどれだけ遅い(信頼性が高いと言ったほうがいいかな。)かというのはよく分かりますので、確認してみるのをオススメします。
かなり遅いので間違いなく多重化されていた方がいいと感じると思います。
ぼちぼちHTTP/2.0の話に入りますか。
SPDYの話から高速化の話ばかりになっていましたが、メソッドの変更はないようです。簡単なRESTAPIはそのまま使えますね。パイプライン化されることでTCPセッションで問題になっていた部分が改善されるようです。ちょっとむずかしい話になるので省略します。
SPDYはメジャーなコンテンツでは採用されることが多いようですが、静的なコンテンツもまだまだ多いですし、枯れた技術も重要なので残っていく部分もたくさんあると思います。
こういう機会に昔の技術のことを学んでみるのもなかなか面白いですね。