HTTPのバージョンが、16年ぶりにバージョンアップされました。
わかりやすいところでは、長らくHTTP/1.1 というなじみがあるヘッダのパケットが、HTTP/2.0になります。
これにともない、各ブラウザが対応し、さらにWireSharkも対応したということで、試してみました。
Webサーバは、Apacheの対応がまだのようなので、nghttp2というライブラリを使ったGo言語の実装を使いました。
参考:nghttp2 を使った Go HTTP/2 server
http://qiita.com/tatsuhiro-t/items/d73376b3eea1d7f4b6a3
https://github.com/tatsuhiro-t/go-nghttp2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
package main import ( "./go-nghttp2" "io" "log" "net/http" ) func main() { var srv http.Server srv.Addr = "192.168.11.11:8080" http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "hello!") }) http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html") io.WriteString(w,` <script> function hello(i){ var xhr = new XMLHttpRequest(); xhr.open('GET', '/', true); xhr.onload = function(e){ if(this.status == 200){ var p = document.createElement("p"); var t = document.createTextNode(this.response + ":" + i); p.appendChild(t); document.getElementById("test").appendChild(p); } }; xhr.send(); } function init(){ hello(1); hello(2); hello(3); } </script> <body onload='init()'><h3>TEST Page</h3><div id='test'></body> `) }) log.Printf("Listening on " + srv.Addr) nghttp2.ConfigureServer(&srv, &nghttp2.Server{}) log.Fatal(srv.ListenAndServeTLS("/etc/ssl/certs/ssl-cert-snakeoil.pem", "/etc/ssl/private/ssl-cert-snakeoil.key")) } |
htmlページを取得した後、JavaScriptで非同期に3回リクエストをしています。
このような構成にしたのは、通信の効率化に何か差異は見られるかどうかをテストしたかったからです。(SPDYによってソケット数が減るとか・・)
ブラウザはFireFoxを使ってSSLでアクセスしてみました。
about:configのhttp2の設定をtrue/falseと変更してHTTP/1.1, 2.0を切り替えます。(falseにすると、サーバがHTTP/1.1のレスポンスを返すことは確認済です。)
下は、2.0と1.0のときのパケットの差異です。
ClientHelloのパケットのALPNに違いがあることがわかります。2.0(↑)の方が項目が多いです。Follow TCP Streamでみると、2.0が3524bytes、1.1が4667bytesと、通信量が少なくなっていました。(フレーム数はあまり変化なし)
ブラウザが2.0に対応しているかどうかは、SSLレベルでサーバに通知しており、HTTPレベル(ヘッダとか)には何も変化はないようです。
一般的な通信で、何か違いを見てみたいという気持ちでテストを始めましたが、期待していたおもしろそうな差異はありませんでした。やはり新たに実装された機能に狙いをつけてテストした方がよさそうです。