So-net無料ブログ作成

HTTP/1.1からのHTTP/2.0 [プログラミング]

なんとか「からの」という言い方があったが最近ないな。結局無茶ぶりなので嫌がられていた気がするな。自分では対応できない芸人ほど言っていた気がする。

何となくHTTP/2.0サーバを作りたくなったので、調べる。最終的にはRFCにたどり着く体で。

http://internet.watch.impress.co.jp/docs/news/20150707_710417.html

目標は「1つのTCPコネクションで」やりとりすること。そのための技術要素として、「フレームからHTTPセマンティクスを分離」「ヘッダーの圧縮」「サーバープッシュ」


まず知ってたのはヘッダの圧縮ぐらいしかないな。HTTP/1.1だとヘッダがテキストべた書きだったんだけど、2.0だとバイナリである程度圧縮できているのを見た。とりあえず、他のところが分からないので、それだけでも通るようにヘッダをファイルの前に付けられるようにしたい。う~ん、どこか日本語で楽に読めるところあればいいんだけどな。

 
http://www.publickey1.jp/blog/15/http2ietfrfc16http.html

非同期という事は、node.jsとかnginxとかを参考にすればよい? nginxは違うかもだけど、一本のスレッドを回すというやり方は変わらないのかな。基本スレッド一本で回して、サーバ側の非同期を実現するのだろうか。いまいちノンブロッキングのやり方というものが分かってないところが癌かもしれない。

FirefoxにHTTP/2.0か判別がつくかどうかのアドオンを入れておく。

 https://addons.mozilla.org/ja/firefox/addon/spdy-indicator/

とりあえずGoogleを見てみたら、もうHTTP/2.0になっていた。もはやSPDYじゃないのね。
要求のヘッダは

Host: www.google.co.jp
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: https://www.google.co.jp
Cookie: 
Connection: keep-alive

クッキーは怪しいので割愛。本当は半分以上cookieです。

Alternate-Protocol: 443:quic,p=1
Cache-Control: private, max-age=0
Content-Encoding: gzip
Content-Type: text/html; charset=UTF-8
Date: Thu, 06 Aug 2015 05:50:54 GMT
Expires: -1
Link: </?hl=ja>;rel="canonical"
Server: gws
X-Firefox-Spdy: h2
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block


こんな感じで帰ってくる。GETとかPOSTとかのところは省略されちゃってるんだけど、GET / HTTP/2.0とかやってるんだろうとは思う。

バイナリヘッダーになっているのだろうけど、そこいらは各ビットに意味を持たせてフラグっぽく扱っているのかもしれない。ん~HTTP/1.1から一応見直してみて差分を理解しておくのは大事だろうな。

とりあえずRFCを見てみてヘッダがどんなものだか事前に見ておく。

http://http2.info/

を!日本語のサイトあった。結局RFCの翻訳という事なのだろうけれど、日本語のサイトにしては日本語感ゼロだな。

http://www.slideshare.net/shigeki_ohtsu/html5-conf2013-http2iijohtsu


PRI * HTTP/2.0 \r\n
\r\n
SM\r\n
\r\n

っていうのは変わっていないのかな。
505249202a20485454502f322e300d0a0d0a534d0d0a0d0a
ってのを送るらしいのだが、x86はリトルエンディアンだけど、そこらへんはソケットがやってくれるんだったっけ。なんかネットワークプログラミングを全然やってないから忘れた。とにかくビッグエンディアンだとそのまま反対にしないでネットワークに流せたような気がしたけど、ARMとかでネットワークやったことないし。

上の数字の羅列だけれども、20はASCII文字でスペースだから、空白文字が入っている部分はあっているのかな。charがエンディアンで逆転するのなら気にしないといけないのかもしれない。なんか懐かしい気もする。もういろいろラッパーでエンディアンを気にしたコーディングなんて何年間もしてないからこういう時は困るな。ともあれ、乗り越える一つの試練としてはわかっている前提なのでそれほどでもない。

お!これか
 http://summerwind.jp/docs/rfc7540/#section3-5


ん~TLSが必須だから、それを実装しないといけないみたいだな。面倒くさい。Golangの標準パッケージにないかな。crypto/tlsってのがあった。自分で書かなくてもよさそうだね。

クライアントはあるんだけど、サーバの方のTLSのサンプルないかな。
 http://qiita.com/r_rudi/items/994adea7c1551b9d3748
HTTPSの証明書とか必要になってきそうだし、いまいちその所が分からない。OpenSSLとかも使ったことあるんだけど、それかてクライアント側だしね。HTTPSサーバって作ったことないから本当によくわからない。

 https://github.com/nareix/tls-example/blob/master/server.go

これあたり使えへんかな。そんなに長くないし、手続き的にはそれほど長くないのかも。




もう実装されているみたいだけど、お勉強として自分でスクラッチしてみたい。

 https://github.com/http2/http2-spec/wiki/Implementations

プロトコルの実装なんて3GPP以来だな。3Gとだけ言うとわけわからなそうだからそう書いたけど、要するにケータイの3Gです。懐かしいな。実装したと言っても一部分だけどね。みんなが相手に擦り付けあっていて最悪な現場でしたw。みんなうんこレベルだった。英語できねーしな。辞書使って読んでるようじゃ駄目ですわ。


次はサンプルコードを見つつ普通にGETできるくらいにまでできれば。ポート443はroot権限が必要だから、適当なポートでやりますかね。それとタダの証明書を発行してくれるところからもらってこないと進めないな。色々とやることは多い。

全体の流れはRFCとここで考える
 http://www.slideshare.net/shigeki_ohtsu/html5-conf2013-http2iijohtsu
スライドの方は古いかもしれないので、鵜呑みにしちゃあかんかもしれないが、理解のしやすさは高い。

タグ:Golang
コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0