原文はこちら。
https://blogs.oracle.com/theaquarium/entry/http_2_and_server_push
数週間前に最終化されたHTTP/2は、2個の関連する仕様(RFC 7540とRFC 7541)から構成されています。HTTP/2では、現在のHTTP 1.1と可能な限り互換性を持たせることを目標としているため、既存のHTTP 1.1セマンティクスを完全に失わないようにしています。HTTP/2の主要な目的は、ネットワークリソースをより効率よく利用しつつ、同時に全体のレイテンシを削減する方法を提供することにあります。このHTTP/2とHTTP/1.1の根本の違いはトランスポートレベル、つまりネットワークでどのようにビットを交換するかという部分に存在します。そして、それこそがHTTP/2の新たなバイナリフレームのプロトコルなのです。
HTTP/2は既存のHTTP/1,1セマンティクスに依存しており、同じHTTP動詞(GET、PUT、POSTなど)、同じHTTPステータスコードなどを使います。サーバーサイドJava開発者の立場からすると、実のところ何も変わりません。既存のアプリケーションをHTTP/2スタックを使った実行は透過的ですが、ワイヤレベルでの性能向上を確認することはできるでしょう。つまり、ほとんどのHTTP/2の機能はServlet APIレベルで公開されない(透過的)、ということです。しかし、このルールに対する例外が少々存在します。Server PushはこのHTTP/2の重要な機能の一つですが、この機能は、開発者が利用できることが理想的です。
Server PushはHTTP/2の新機能で、これを使うと通常のクライアントリクエストの応答として、サーバがプロアクティブに複数のリソースを投げつけることができます。そして、サーバーサイドアプリケーションは、特定のページに描画するためにどのリソースを必要としているかはわかっているので、クライアントがそうしたリソースを必要とするだろうと知る前に、プロアクティブにクライアントが要求するリソースをアプリケーションに送信することができます。
Servlet 4.0 Expert Groupでは、このServer Push機能をAPIレベルで公開する方法を検討・決定する必要があります。方策の一つとして、 Jetty 9.3のPushBuilder APIを基にしたGreg Wilkinsの提案からインスパイアされたものがあります。
https://blogs.oracle.com/theaquarium/entry/http_2_and_server_push
数週間前に最終化されたHTTP/2は、2個の関連する仕様(RFC 7540とRFC 7541)から構成されています。HTTP/2では、現在のHTTP 1.1と可能な限り互換性を持たせることを目標としているため、既存のHTTP 1.1セマンティクスを完全に失わないようにしています。HTTP/2の主要な目的は、ネットワークリソースをより効率よく利用しつつ、同時に全体のレイテンシを削減する方法を提供することにあります。このHTTP/2とHTTP/1.1の根本の違いはトランスポートレベル、つまりネットワークでどのようにビットを交換するかという部分に存在します。そして、それこそがHTTP/2の新たなバイナリフレームのプロトコルなのです。
HTTP/2は既存のHTTP/1,1セマンティクスに依存しており、同じHTTP動詞(GET、PUT、POSTなど)、同じHTTPステータスコードなどを使います。サーバーサイドJava開発者の立場からすると、実のところ何も変わりません。既存のアプリケーションをHTTP/2スタックを使った実行は透過的ですが、ワイヤレベルでの性能向上を確認することはできるでしょう。つまり、ほとんどのHTTP/2の機能はServlet APIレベルで公開されない(透過的)、ということです。しかし、このルールに対する例外が少々存在します。Server PushはこのHTTP/2の重要な機能の一つですが、この機能は、開発者が利用できることが理想的です。
Server PushはHTTP/2の新機能で、これを使うと通常のクライアントリクエストの応答として、サーバがプロアクティブに複数のリソースを投げつけることができます。そして、サーバーサイドアプリケーションは、特定のページに描画するためにどのリソースを必要としているかはわかっているので、クライアントがそうしたリソースを必要とするだろうと知る前に、プロアクティブにクライアントが要求するリソースをアプリケーションに送信することができます。
Servlet 4.0 Expert Groupでは、このServer Push機能をAPIレベルで公開する方法を検討・決定する必要があります。方策の一つとして、 Jetty 9.3のPushBuilder APIを基にしたGreg Wilkinsの提案からインスパイアされたものがあります。
Jetty 9.3.0.v20150612Gregは活発に活動しているServlet EGのメンバーであり、Jettyを開発した人でもあります。
https://dev.eclipse.org/mhonarc/lists/jetty-announce/msg00080.html
[servlet-spec users] [jsr369-experts] Re: Feedback on Greg's December 2014 push API Thread
https://java.net/projects/servlet-spec/lists/users/archive/2015-03/message/0
Greg Wilkins彼はJava 0.9を使って20年前にJettyの開発をスタートしました。Jettyも20歳の誕生日なんですね。おめでとうございます!
https://twitter.com/gregwilkins
Useful resources:
- Hypertext Transfer Protocol Version 2 (HTTP/2) : RFC 7540
https://httpwg.github.io/specs/rfc7540.html - HPACK: Header Compression for HTTP/2 : RFC 7541
https://httpwg.github.io/specs/rfc7541.html - HTTP/2: A New Excerpt from High Performance Browser Networking by Ilya Grigorik (free)
http://www.oreilly.com/webops-perf/free/HTTP2-high-perf-browser-networking.csp - Jetty 9.3 PushBuilder Javadoc
http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/server/PushBuilder.html