HTTP/2

HTTP/2 (Web)

[8] HTTP/2 は、旧来の HTTP にかわるものとして新たに開発された転送プロトコルです。 Google によって開発された SPDY が元となっています。

仕様書

プロトコル

[26] HTTP の通信は、 HTTPサーバーHTTPクライアントとの間に HTTP接続を確立し、その上でメッセージをやり取りすることで行われます。

[27] HTTP接続内には複数のストリームを開くことができます。 ストリーム上をサーバーからクライアントに、あるいはクライアントからサーバーにとフレームを送信することで、 両者間で制御情報やデータのやり取りを行います。

[38] HTTP/2 では、複数の TCP接続を開かず、同じ TCP接続内でストリームによって多重化を実現しています。

[28] フレームの列により、要求応答メッセージが表されています。 上位のアプリケーションの処理は、要求応答によって行われます。 フレームにはメッセージを表すものの他、制御情報を表すものもあります。

[29] メッセージの意味 >>25 や個々の構成要素の構文は、 HTTP/1.1 が参照されています。

[31] その詳細は HTTP/1.1 などの項を参照。この意味で HTTP/2HTTP/1.1 の完全の代替ではなく、新たなプロトコル階層を挿入するものです。 従って HTTP/1.1廃止されていません。

[30] ストリームフレームの概念や、メッセージフレームの列で表現する方法は、 HTTP/2 で新たに規定されました。

[50] HTTP/1 との切り替えについては、 HTTP接続を参照。

HTTP/1.1 との違い

[33] HTTP/1.1 はテキストベース、 HTTP/2 はバイナリーベースで、 プロトコルとしての構造はまったく違っています。 そうした表現上の違いや制御情報のやり取りに関する異なりを除くと、 次のような差があります。

[32] HTTP/2 では、 HTTP/1.1 の次の機能は使えません。

[36] HTTP/2 では、 Cookie: ヘッダーを複数指定できます。

[40] HTTP/2 では、ほとんどの場合 :scheme 疑似ヘッダーが必須です。

[37] HTTP/2 では、原則として Host: ヘッダーのかわりに :authority 疑似ヘッダーを使います。

[39] HTTP/2 では、クライアント要求を送信しサーバー応答を送信する従来の形のやり取りに加えて、 サーバー要求応答クライアントに送信するサーバープッシュが導入されています。

[49] Upgrade: が使えないため、 WebSocket も使えません。

識別子

[19] ALPN の識別子 h2 (0x68, 0x32) は、 HTTP/2 over TLS を表します >>17, >>34

[21] HTTP/2Internet Draft は、 h2-11 のような値を使っていました。

[52] 代替サービスでも利用できます。


[20] Upgrade: ヘッダーの値 h2c は、HTTP/2 over TCP を表します >>17, >>34, >>35ALPNプロトコル名 h2c は予約されており、使いません >>17

[22] 指定と処理の方法は、 Upgrade: h2c を参照。
[48] HTTP/2RFC 7540 出版時点で ALPNプロトコル名の用途は TLS だけで、 RFC には h2c がまったく使ってはいけないように書かれていますが、 これがその後拡大された ALPNプロトコル名の用法 (ALPN:Alt-Svc:) にも適用されるのかどうかは不明です。 ALPN: では、 (理論上は) 使っても良さそうです。 Alt-Svc: でも、 (理論上は) 使うことができそうですし、 RFC 7838 にも使った場合についての言及があります。 (実際には平文HTTP/2 など使うこともないでしょうから、問題にはならなそうです。)

[18] HTTP/1.1 以下とは違って、要求行状態行プロトコルの版に相当するものはありません。

[23] ただしクライアント接続序文は、 HTTP/1.1メッセージとして解釈すると、 プロトコルの版 HTTP/2.0 を指定したことになります。

[53] メタ変数 SERVER_PROTOCOL でも HTTP/2.0 という値が使われることがあります (HTTP/2 を使う実装もあります)。

[54] curl--dump-header オプションで応答ヘッダーを出力すると、 プロトコルの版HTTP/2 となります。

URL

[16] HTTP/2 では、 http:/https: URL scheme を使います >>17URL だけから HTTP/2HTTP/1.1 以下を区別することはできません。

歴史

[57] HTTP/0.9HTTP と呼ばれていた頃、 HTTP/1.0 に結実する新仕様案が HTTP2 と呼ばれていました。 HTTP2 後の HTTP/2 とは異なります。


[9] これまで HTTP/1.1 に大きな変更を加える提案としては、 HTTP/1.2PEPRFC 2774 といった機能拡張のための機能を追加するもの、 WAP のようにバイナリー化するもの、 GridHTTPReverse HTTP のように特定の用法のために拡張するものなど色々ありましたが、 いずれも主流となることはできず、やがて消えてゆきました。

[10] HTTP には大きな変更が加えられることなく10年が過ぎようとしており、 RFC の改訂 (RFC 723x) はともかく、プロトコルへの変更は最早不可能との観測もありました。

[11] しかし GoogleWeb の高速化施策の1つとして SPDY を提案し Google Chrome や各 Google サービスのサーバーに実装したことで、 この流れは大きく変わります。

[12] SPDY の歴史は、 SPDY の項を参照。

[1] Rechartering HTTPbis (Mark Nottingham 著, 版) http://lists.w3.org/Archives/Public/ietf-http-wg/2012JanMar/0098.html

[2]

$ telnet mail.kamu.ct.tr 80
Trying 212.175.153.6...
Connected to mail.kamu.ct.tr.
Escape character is '^]'.
GET / HTTP/1.0

HTTP/2.0 302 Found
Server: SmarterTools/2.0.2692.18364
Date: Wed, 05 Mar 2014 09:02:07 GMT
X-AspNet-Version: 2.0.50727
Location: /Login.aspx
Set-Cookie: ASP.NET_SessionId=1dmqmiv3plhasn45ayqi2155; path=/; HttpOnly
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 130
Connection: Close

<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="%2fLogin.aspx">here</a>.</h2>
</body></html>

[3] draft-montenegro-httpbis-http2-negotiation-01 - HTTP 2.0 Negotiation ( ( 版)) http://tools.ietf.org/html/draft-montenegro-httpbis-http2-negotiation-01

[4] IRC logs: freenode / #whatwg / 20141210 ( ( 版)) http://krijnhoetmer.nl/irc-logs/whatwg/20141210#l-637

[5] HTTP/2 – Closing on the Final Design | MS OpenTech ( ( 版)) http://msopentech.com/blog/2014/01/31/http2-moving-quickly-endgame/

[6] HTTP/2 – “Nearing Completion” | MS Open Tech ( ( 版)) http://msopentech.com/blog/2014/03/19/http2-nearing-completion/

[7] Chromium Blog: Hello HTTP/2, Goodbye SPDY ( ( 版)) http://blog.chromium.org/2015/02/hello-http2-goodbye-spdy-http-is_9.html

[13] HTTP2 時代のサーバサイドアーキテクチャ考察 - Block Rockin’ Codes ( 版) http://jxck.hatenablog.com/entry/http2-server-side-architecture

[24] RFC 7540 は、2015年出版と新しい仕様書で、過去の HTTP 仕様に比べればかなり明確に細かな挙動が規定されています。エラー処理もほとんどの場合が明文化されています。 その一方で、要件の一部しか RFC 2119 助動詞で記述されておらず、 要件らしきものが事実の文でしかなかったり、助動詞によって記述された要件で内容が同じとみられるものが仕様書の複数の箇所に重出したりと、 前近代的な部分もなお残っています。近年の Web 関連仕様のようなアルゴリズムによる規定の記述を行っていないので、 正常処理やエラー処理の規定の適用順序が明確になっていないことも多いようです。

[41] 1047594 – Enable http/2 (and alpn) by default ( 版) https://bugzilla.mozilla.org/show_bug.cgi?id=1047594

[42] Bits Up!: HTTP/2 is Live in Firefox ( 版) http://bitsup.blogspot.jp/2015/02/http2-is-live-in-firefox.html

[43] Issue 408944 - chromium - Chromium h2-14 and twitter.com interop PROTOCOL_ERROR - An open-source project to help move the web forward. - Google Project Hosting ( 版) https://code.google.com/p/chromium/issues/detail?id=408944

[44] Issue 345769 - chromium - Full HTTP/2 support - An open-source project to help move the web forward. - Google Project Hosting ( 版) https://code.google.com/p/chromium/issues/detail?id=345769

実装

[45] サーバーソフトウェアの実装:

[47] サーバーサービス:

[46] クライアントの実装:

[51] mod_http2 - Apache HTTP Server Version 2.4 ( ()) https://httpd.apache.org/docs/2.4/mod/mod_http2.html

[55] HTTP/2 with curl, , https://curl.haxx.se/docs/http2.html

[56] HTTP/2 Fully Supported in NGINX Plus | NGINX () https://www.nginx.com/blog/http2-r7/