SummerWind

Web, Photography, Space Development

HTTP/2 を追いかけて

これは HTTP2 Advent Calendar の7日目の穴埋めのために書かれたポエムです。

2014年は継続して HTTP/2 の動向を追いかけ続けた1年になりました。今まで1つの技術を追いつつ深堀りする、ということはあまりやってこなかったのですが、今改めて振り返ってみると継続して追うことによるたくさんの「いいこと」があったので、今回はそれについて書いてみようと思います。

きっかけ

HTTP/2 の動向を追うきっかけになったことの1つに SPDY の存在があります。2年前の2012年12月、仕事でとあるメッセンジャーアプリの独自プロトコルについて詳しく知る機会がありました。その当時はプロトコルに関する知識などはほとんど無く、単純に技術的な好奇心から、そのプロトコルで使われるバイナリー構造やメッセージの多重化についてを学んでいました。ある程度そのプロトコルの機能が理解できるようになると、どうもこれは当時少しづつ話題になっていた SPDY の機能に似ているようだ、ということに気が付きました。

その後、通信プロトコルの仕様を理解するのはなかなか面白かったので、せっかくなので SPDY の仕様もきちんと理解してみようと思いました。しかし、SPDY の仕様は英語で書かれていて、すぐに飽きて読まなくなってしまうだろうと感じたため、最初から日本語に翻訳しながら読んで理解することにしました。SPDY Protocol Draft 3 日本語訳を公開したのは、その成果だったりします。

SPDY に興味を持ち始めた頃、INTERNET Watch でHTTP/2.0の最新動向という連載記事を見つけました。読み進めてみると、どうも SPDY は HTTP/2.0 という次世代 HTTP の標準仕様のベースになるらしい、ということが分かり、ここからようやく HTTP/2 につながったという感じです。

ドラフトの日本語訳

SPDY の仕様書を日本語に翻訳した経験から、翻訳しながら読むことで、仕様について深く理解できること、苦手な英語の勉強にもなることが分かっていたので、これについては HTTP/2 のドラフトでも続けようと考えました。数回やったところで飽きるのがいつもの自分のパターンでしたが、数ヶ月おきに定期的に更新されること、更新されたドラフトには新しい技術的要素が含まれており、それを理解する楽しみがあることから、Draft 04 から Draft 16 までなんとか続けてこれました。

日本語への翻訳を続けることでよかったことは、英語の文章への抵抗が薄れたことです。簡単な RFC や Internet Draft (I-D) を通勤時間にざっと読んだりすることがぐっと増えました。HTTP/2 関連だと HTTP Alternative ServicesWeb Push、その他の RFC だと STUN あたりは読みましたね。

勉強会への参加

HTTP/2 の動向を追うにあたって大きかったのは HTTP/2 勉強会の存在でした。特に主催の Jxck さんのコミュニティ運営スキルはすごく、IETF の会合直後は毎回勉強会が開催されて、最新の動向を知ることができる、という流れが出来ていたのは本当にありがたかったです。

日本語訳を公開していたことで、勉強会に参加している色んな方々に知り合えたことも、とてもよかったと思えることの1つです。リファレンス実装である nghttp2 を開発している tatsuhiro_t さんや、様々な技術に深く精通している kazu さん、HTTP/2 だけでなく TLS や Node.js にも非常に詳しい大津さんなど、多くの方に様々な事を教えていただき、HTTP/2 に関する事だけでなく、1人のエンジニアとしての学びも多くありました。

こういったコミュニティ活動については、Jxck さん自ら書かれているように、本当に凄い場所だなと感じています。11月の HTTP/2 カンファレンスに来てくれた Ilya もそのように書いてくれていたので、きっと世界的に見てもかなり濃い場所なのではないかと思っています。

仕様を実装する

HTTP/2 については、ドラフトの日本語訳だけでなく、自分で サーバーを実装してみたりもしました。実装をはじめたきっかけは「HPACK の実装が難しすぎること」だったと記憶しています。勉強会に行くと多くの人が「HPACK の実装は難しい」と言っていて、それならば自分も試してみよう、と思って実装を始めたのでした。実際に実装を始めてみると、多くの人が言われていた通りの難しさで苦戦したのが、今ではいい思い出です。当時の HPACK の仕様は実装が本当に難しかったんですよ。。。

HPACK の実装は難しかったのですが、HTTP/2 の実装に取り組むことで得られた技術はたくさんありました。例えばバイナリフレームや HPACK の実装では、ビット演算への理解が必要になりますし、フロー制御やストリームを実装しようとすると、通信の制御や多重化に関する理解が必要になります。HPACK の圧縮効率を上げようとすると、ハフマンコーディングなどアルゴリズムに対する理解が必要になったり、HTTPS 対応をしようとすると、TLS に関する知識も多く必要になります。HTTP/2 はエンジニアが情報技術の基本を改めて学ぶ教材として、本当に素晴らしいものです。

IETF での標準化

HTTP/2 の動向を追うことで、プロトコルが標準化されていく過程をこの目で見れたのもよかった点の1つです。W3C での標準化の流れについては、以前におおよそ理解できていたのですが、IETF での標準化の流れは W3C とはまた異なるので、そういった雰囲気がつかめたのはよかったです。ただ、英語力不足があり、議論にはほとんど参加できなかったのがずっと心残りなので、英語力を磨いていつかは標準化の議論にも参加できるようになりたいと思っています。

なお、2015年は、11月に日本で IETF 会合が開催される予定です。日本で参加できる機会はなかなかないと思うので、自分もなんとか潜り込んで会場の空気を感じたいなと考えています。

2015年

長くなってきたので、そろそろこのへんで終わらせようと思います。HTTP/2 は順調にいけば2015年には RFC になりそうです。もちろんちゃぶ台返しが起きる可能性はあると思いますが、そういう部分も含めて RFC になることを楽しみにしたいと思います。

また、HTTP/2 の実装についてもだいぶ出揃ってきましたので、来年は仕事でも積極的に HTTP/2 を活用したいと考えています。きちんと活用するにあたっては、HTTPS 化やコネクションの集約、ドメインシャーディングの削減など、やるべきことが多いのですが、年が明けたら早速そのあたりの下準備を粛々と進めていこうと思います。

Moto Ishizawa

Moto Ishizawa
ソフトウェアエンジニア。ロケットの打上げを見学するために、たびたびフロリダや種子島にでかけるなど、宇宙開発分野のファンでもある。