「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>ネットワーク]]
-[[戻る>HTTP]]
--HTTP/2について調べてみた。
--[[HTTP/3について調べてみた。]]

* 目次 [#p81134bf]
#contents

*概要 [#y00c5f0c]
gRPCを調べようと思っていたら、HTTP/2なるキーワードが。~
[[gRPC]]を調べようと思っていたら、HTTP/2なるキーワードが。~
「そういや話題になっていたなぁ。」などと思い少々調査してみました。

**HTTP/2とは [#ea97bc41]
-2015年2月17日に正式な仕様として承認
-2015年5月に RFC 7540 として文書化
-HTTP/1.1が1999年6月に RFC 2616 として~
規定されて以来16年ぶりのバージョンアップ。

***経緯 [#t791f29c]
-米GoogleによるWeb高速化の「SPDY」プロトコルが生み出された。
-有名サイトも次々と「SPDY」を取り入れるようになった。
-標準化団体IETFによって標準化が進められ、RFC(RFC7540, HTTP/2)化した。

***目的 [#oc425ef6]
[[HTTPの高速化>#of2d9169]]

***方法 [#q4c4e73a]
[[ストリーム>#oa0a4305]]という仕組みを使用する。

***プロトコル [#de48165e]
-既存のHTTPと互換性を保ちながらセッション層を効率化する。
-そのため、HTTPの表面上の機能はそのままに、内部動作だけを置き換える。

***今後 [#hf63d668]
-まだ、十分な実績がないので、検証中のプロトコル。
--HTTP/1.1に置き換わるのか?
--一部の仕様だけが生き残るのか?

-HTTP/2はTCP/IP上で動作するため、品質の低い回線上で実行した場合、~
パケット遅延、パケットロスなどで全体遅延になる問題がある。
--このため、米Googleは「QUIC」というUDP上でHTTPを処理する新しいプロトコルを開発中である。
--「QUIC」も「SPDY」と同様に、IETFを通じた標準化を目指している。

**HTTPの高速化 [#of2d9169]
***通信・接続の多重化 [#q611c4c3]
-HTTPでは、1つのリクエストが完了するまで、次のリクエストを送ることができない。
-現在、多くのブラウザは1ドメインへの接続を同時に複数行い、通信を多重化している。
-ただし、HTTP/1.1の仕様としては2つまでとされている。

***HTTPパイプラインとHoL(Head of Line)ブロッキング [#ob3d3214]
-HTTPパイプライン
--HTTP/1.1から、前回リクエストの完了を待たずに次のリクエストを送信可能
--しかし、実装の困難さから、HTTPパイプラインを正しく実装したサーバが少ない
--故に、現在ほとんどのブラウザはHTTPパイプライン機能を全く実装していないか、デフォルトでオフ。

-HoL(Head of Line)ブロッキング
--HTTPパイプラインには、「サーバはリクエストの順番通りにレスポンスを返さなければならない」という制限がある。
--これは、「先頭のリクエストの処理に時間がかかる場合、後続のレスポンスは全てブロックされる」という問題を起こす。

***リソース読み込みを速くする様々な工夫 [#ia4d1120]
-リソースの結合
--CSSやJSファイルを1つに結合するテクニック
--ASP.NETでは[[Bundle機能>https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20%E3%81%AE%20BundleConfig]]が提供されている。

-画像のインライン埋め込み~
HTML内にbase64でエンコードした画像を直接埋め込む方法
 img src="data:image/gif;base64,(・・・base64文字列・・・)">

-ドメインシャーディング
--多重化には、[[前述の制限>#q611c4c3]]がある。
--この制限を搔い潜るためリソースファイルの取得先ドメインを分割する。
--ベターユース的には、
---著名なライブラリの取得はCDNを使用すると良い。
---なお、CDNダウン時の対応として、[[CDNフォールバック>ASP.NET の BundleConfig#jfd7be89]]というテクニックがある。
---著名なライブラリの取得は[[CDN>CDN(Content Delivery Network)]]を使用すると良い。
---なお、[[CDN>CDN(Content Delivery Network)]]ダウン時の対応として、[[CDNフォールバック>ASP.NET の BundleConfig#jfd7be89]]というテクニックがある。

**HTTP/2のストリーム [#oa0a4305]
-1つのTCP/IPコネクション上でリクエスト・レスポンスを並列化する。
-ストリームの多重化によりHoLブロッキングの問題は解決する。

***フレーム [#u2b4733e]
-並列化のためフレーム
--各ストリームにおけるメッセージのやり取りはフレームという単位で行う。
--フレームはバイナリで定義され、各フレームは9オクテットのヘッダと、可変長のペイロードで構成される。

-PRIORITYフレーム
--クライアントがPRIORITYフレームを用いてストリーム間に優先順位を付ける
--優先順位付けの方法には、「重み付け」と「依存関係」の2つがある。

***ストリームのID [#j6787cc6]
-ストリームはクライアント、サーバのどちらからでも開始できる。

-競合回避のため、
--クライアント側から開始したストリームには奇数のIDを割り当てる。
--サーバ側から開始したストリームには偶数のIDを割り当てる。

***ウインドウ制御 [#q5824ff4]
-TCP/IPでも実装されているようなウインドウ制御を実装している。
-HTTP/2で実装する理由は、
--TCP/IPコネクションを並列化しているため。
--並列化した中の個別のストリームの制御を行う。
--例:動画のストリーミング中に、そのストリームのみ停止する。

***ヘッダ圧縮 [#u3341193]
従来、HTTPのコンテンツボディのみをgzip圧縮していたが、HTTP/2では、

-ストリーム内のHTTPヘッダも圧縮する。
-圧縮には、gzipではなく、HPACKを使用する。~
CRIMEというgzip圧縮の特性に着目して、~
SSL暗号を無効化する攻撃手法を回避するため。

***サーバプッシュ [#j55026d6]
サーバ側からクライアントにデータをプッシュできる。
-具体的に言えば、リクエストされたページに必要なリソースを予めクライアントに送信しておくための仕様と言える。
-使用例としては、HTMLに関連付けられているCSSや画像などのリソースを、クライアントのリクエストを待たずにサーバーからプッシュ送信できる。

*使い方 [#ie10393f]
-内部動作だけを置き換えるので、コンテンツ側は何もしなくてイイ。
-[[サーバープッシュ>#ve84f1e0]]だけは、コンテンツ側に実装の変更が必要になる。

**コンテンツ側 [#c78c9044]
内部動作だけを置き換えるので、コンテンツ側は何もしなくてイイ。

**サーバープッシュ [#ve84f1e0]
-前述の[[サーバプッシュ>#j55026d6]]を使用する場合、コンテンツ側に実装の変更が必要になる。
[[サーバプッシュ>#j55026d6]]を使用する場合だけ、コンテンツ側に実装の変更が必要になる。

***[[ASP.NET]] [#afaaf6f3]
-[[ASP.NET Web Forms]]でサーバープッシュを使用する場合、~
サーバー側で以下のメソッドを実行して予めコンテンツをプッシュしておく。
  Response.PushPromise("~/・・・コンテンツの仮想パス")

-[[ASP.NET MVC]]でサーバープッシュを使用する場合、~
[[以下に>#i2f0846e]]、URLヘルパに拡張メソッドとして実装した例がある。~
(故にUrl.PushContentとか、UrlHelper.PushContentで検索しても出てこない)。

***参考 [#i2f0846e]
-IIS 10.0 と ASP.NET 4.6 で HTTP/2 のサーバープッシュが使えるようになっていたので試した - しばやん雑記~
http://blog.shibayan.jp/entry/20150506/1430846908

*サポート状況 [#bf97dc22]
**[[IIS]] [#gfbab78b]
[[IIS]]というか、http.sys(HTTP カーネル モード ドライバ)で、サポートされている模様。

***参考 [#r5eceb7e]
-「HTTP/2」がついに登場! 開発者が知っておきたい通信の仕組み・新機能・導入方法 (1/3):CodeZine(コードジン)~
https://codezine.jp/article/detail/8663

-IISのhttp2サポートについてちょっとだけ - Qiita~
http://qiita.com/matarillo/items/ebf667994bcdf7feee33
--Windows Server Technical Preview の IIS というか http.sys が HTTP/2 に対応していたらしい - しばやん雑記~
http://blog.shibayan.jp/entry/20141006/1412601973
--Windows Server Technical Preview の IIS というか http.sys の HTTP/2 有効 / 無効を切り替える方法 - しばやん雑記~
http://blog.shibayan.jp/entry/20141007/1412662459
--Windows Server Technical Preview 2 と ARR 3.0 を組み合わせて HTTP/2 対応のリバースプロキシにしてみた - しばやん雑記~
http://blog.shibayan.jp/entry/20150701/1435717724

**.NET [#jf7774aa]
-.NET 2015(.NET Framework 4.6および.NET Core)から、サポートされている模様。
-従って、当該バージョン以降の[[ASP.NET]] & [[HTTPClient>HttpClientの類の使い方]]で使用可能。

***参考 [#xa75a0d4]
-c# - How to make the .net HttpClient use http 2.0? - Stack Overflow~
http://stackoverflow.com/questions/32685151/how-to-make-the-net-httpclient-use-http-2-0
-What's New in the .NET Framework~
https://msdn.microsoft.com/en-us/library/ms171868.aspx

**その他 [#hc74c9dd]
***サーバー [#hf60b91e]
[[IIS]], Apache, nginx等の主要なサーバーで、サポートされている模様。

***クライアント [#y23f835a]
-主要なブラウザで、HTTP/2 over TLSでサポートされている模様。
-IE11を含むが、Win10上のIE11に限定される模様。

***参考 [#z4e9b171]
-HTTP/2 - Wikipedia~
https://ja.wikipedia.org/wiki/HTTP/2

-Implementations · http2/http2-spec Wiki~
https://github.com/http2/http2-spec/wiki/Implementations

*参考 [#l425f0f4]
-HTTP/2 - Wikipedia~
https://ja.wikipedia.org/wiki/HTTP/2

-「HTTP/2」がついに登場! 開発者が知っておきたい~
通信の仕組み・新機能・導入方法 (1/3):CodeZine(コードジン)~
https://codezine.jp/article/detail/8663

**ITpro [#t8968dd3]
-検証!HTTP/2~
http://itpro.nikkeibp.co.jp/atcl/column/17/041200137/
--企業Webサイトに導入必須なHTTP/2の正体~
http://itpro.nikkeibp.co.jp/atcl/column/17/041200137/041200001/
--Webの高速アクセスを1本のコネクションで実現~
http://itpro.nikkeibp.co.jp/atcl/column/17/041200137/041200002/
--HTTP/2はどうしてコネクション一つで通信できるのか~
http://itpro.nikkeibp.co.jp/atcl/column/17/041200137/041200003/
--高速HTTP/2通信の利用には“スイッチ”が必要~
http://itpro.nikkeibp.co.jp/atcl/column/17/041200137/041200004/

**Publickey [#r3b6e332]
-Developers Summit 2016~奥一穂氏による「HTTPとサーバ技術の最新動向」

--(前編)レイテンシに負けないプロトコルとして登場したHTTP/2~
https://www.publickey1.jp/blog/16/http2httpdevelopers_summit_2016.html

--(中編)リクエストを待たずに送信を開始する「サーバプッシュ」~
https://www.publickey1.jp/blog/16/httpdevelopers_summit_2016.html

--(後編)HTTPS化もHTTP/2にすれば負荷を下げられる~
https://www.publickey1.jp/blog/16/httpshttp2httpdevelopers_summit_2016.html

----
Tags: [[:通信技術]], [[:Windows]], [[:IIS]]
Tags: [[:IT国際標準]], [[:通信技術]], [[:IIS]], [[:.NET開発]], [[:.NET Core]],  [[:ASP.NET]], [[:ASP.NET MVC]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS