JPNICJavaScriptが無効になっています。JavaScriptを有効にしてご利用いただくことで、より快適にご利用いただけます。長きにわたって使われ続けているプロトコルです。HTTP/2が普及しつつあります。本稿ではHTTP/2で使われている技術を中心に、高速化の手法などを解説します。2(HTTP/2)」として標準化されています。実際に広く使われる技術となっています。1ページあたりのリソース数も各リソースのサイズも大きくなってきていました。それに伴い、Webのパフォーマンスについて重要度が増している時期でした。Webの技術はより複雑になってきていました。プロトコルレイヤでの改善の効果を確かめていました。WGではHTTP/2の標準化を開始します。HTTP/2ではパフォーマンスを改善するための多くの機能が盛り込まれています。標準化の開始点となるような仕様の提案がいくつか提出されました。実績がある点などの理由からHTTP/2の開始点として選ばれました。Protocolとなっていることからも、SPDYを受け継いでいることがわかります。HTTP/2はSPDYの特徴を残しつつ、多くの改善が行われています。Google社側でもSPDYの開発は続けられていきました。Google社のプロダクト群もHTTP/2を使うようになりました(図1)。多くの機能を持っています。HTTP/1.1ではHTTPリクエスト・HTTPレスポンスをするたびにTCPコネクションを切断していました。HTTPSを使っていればそこにTLSハンドシェイクのオーバーヘッドも加わります。一度にHTTPリクエストを送る時は六つ(実装依存)のTCPコネクションを利用していました。スロースタートであるTCPとの相性が悪く帯域を効率よく使えません。複数のHTTPメッセージを上限なく並列的にやりとりすることができます。ストリームごとにフレームというメッセージをやりとりします。サーバプッシュと行った機能を持っています。ここでは、そういった以下の機能を紹介していきます。複数のHTTPリクエストとHTTPレスポンスをやりとりします。それらのやりとりを管理するための概念がストリームです。一対のHTTPリクエストとHTTPレスポンスが一つのストリームに所属します(図2)。HTTPレスポンスが返ってくるとストリームは使われなくなります。ストリームには一意のIDがあり、ストリームIDと呼ばれます。後述するサーバプッシュによってサーバから開始されるストリームは偶数のストリームIDを使用します。これによって、ストリームIDは常にユニークです。HTTPメッセージのやりとりには使用されません。このストリーム単位で制御されます。そのため、このストリームというのはHTTP/2の大事な概念の一つです。次にフレームの説明をします。HTTP/2ではフレームというバイナリ形式のメッセージをやりとりします。フレームは使用用途ごとに10種類のフレームタイプが定義されています(表1)。伝達するデータの種類ごとに使用するフレームが異なります。HEADERSフレームとDATAフレームを組み合わせて表現されます。HTTPボディを転送するのに使用される。HTTPレスポンスヘッダといったヘッダを送信するのに使用される。ストリームの優先度を変更するのに使用される。エラーでストリームを終了するのに使用される。コネクションに関するパラメータをやりとりするのに使用される。サーバプッシュに用いるストリームを予約するのに使用される。コネクションが維持できることを確認するために使用される。コネクションを切断するのに使用される。フロー制御で使用される。続けてHTTPヘッダデータを送信するのに使用される。その他にもHTTP/2では通信の制御や優先度処理・サーバプッシュのためにさまざまなフレームを使用します。すべてのフレームは、どのストリームのデータなのかを示すストリームIDを持っています。EADERSフレームやDATAフレームは所属しているストリームIDを含みます。実際に一度に並べて送信することはできません。各HTTPメッセージはフレームとして直列化した上で送信します(図3)。どのストリームに関するやりとりなのかわかる仕組みになっています。HTTP/1.1と互換性はありません。HTTP/2に対応していないサーバにHTTP/2のメッセージを送信しても正しく解釈できないでしょう。HTTP/2でもHTTP/1.1と同様に80番ポートと443番ポートを使用します。そのためHTTP/2通信を開始するためには相手とHTTP/2の使用を合意する必要があります。仕様ではいくつかの通信開始方法が定義されています。Extensionで定義されているTLS拡張です。ここではHTTP/2を使用するかどうかのネゴシエーションを行います。TLSの通信が前提ですので、httpsの場合に使用できます。そのコネクションをHTTP/2の通信にアップグレードする手順です。httpsの場合はALPNを使用するので、アップグレードはhttpの場合のみ使用できます。サーバがHTTP/2に対応していることがわかっている場合のみHTTP/2で通信を開始できます。具体的には定義されていませんが、一度接続したことがある等のケースがあります。これらの方法でHTTP/2利用のネゴシエーションを行います。既存のTCPコネクションを使い回してHTTPリクエストを送信します。httpの場合と、httpsの場合でその条件が分かれています。ドメイン名のIPアドレスが同じであればTCPコネクションを再利用できます。両者との接続はコネクションを再利用できます。証明書が有効なことが条件になります。両者との接続はコネクションを再利用できます。HTTPレスポンスはHTTPレスポンスヘッダを持ちます。User-AgentヘッダやAccept-Encodingといったクライアント側の情報などが格納されています。以下はHTTP/1.1でのサンプルです。HTTP/1.1ではリクエストの都度すべてのHTTPリクエストヘッダを送信していました。これは冗長なため、ヘッダを圧縮することが考えられていました。実際にはヘッダ圧縮機能は無効化されていました。HTTP/2ではHPACKを使用しています。HPACKはHTTP/2とは別にRFC7541で標準化されています。HPACKでは主に二つの仕組みを併用してヘッダを圧縮します。ハフマン符号を使用するインデックステーブルを使用する一つめはハフマン符号を用いる方法です。HTTPヘッダで使用される文字の出現頻度には偏りがあることがわかっています。等)は長いbit数で表現することで文字列トータルのデータ量を削減しています。エンコードとデコードはその対応表を使います。二つめはインデックステーブルを使用する方法です。インデックス番号を指定するだけでそのヘッダを表現できるようになります。インデックス16番と指し示すだけでこのヘッダを送ったことと同じことになります。送信したヘッダを動的に追加していく動的テーブルが存在します。テーブルに無いヘッダは、ハフマン符号などを使用して表現し送信します。次から同じヘッダを送信する際はインデックス番号を指定するだけでそのヘッダを表現できるようになります。ハフマン符号すら使わずにヘッダを送信することも可能です。相手に送信されることになります。優先度Webページを表示するのに優先度の高いリソースとそうでもないリソースがあります。画像などはレンダリング開始時点ではそれほど優先度は高くありません。クライアントはHTTPリクエストに優先度を指定できます。あとからPRIORITYフレームで優先度を変更できます。優先度はストリームごとに指定できます。指定する際はDependencyとWeightというパラメータを用いて優先度を伝えます。Dependencyは処理する順番を指定できます。画像のリクエストを処理するようにサーバに指示できます。Weightは優先度の比を指定できます。CSSファイルAとCSSファイルBを1:2の割合で処理するようにサーバに指示できます。ブラウザは自身の処理して欲しい順番をサーバに伝えることができます。HTTPリクエストが受信されてからHTTPレスポンスが送信されます。HTTPリクエストがなくてもHTTPレスポンスを送信することができます。サーバ側は後々クライアントが必要になるであろうコンテンツを先んじて送信できるようになります。これによってクライアントは待ち時間が少なくなります。サーバがHTTPリクエストを受け取ってHTTPレスポンスを返す間にPUSH_PROMISEフレームを送信することで開始できます。プッシュするHTTPレスポンスがそもそもどういうHTTPリクエストを想定してのHTTPレスポンスなのかが記述されています。どのURLへのHTTPリクエストに対するHTTPレスポンスなのかというのが重要な情報です。その後、予約したストリームでHTTPレスポンスを送信します。HTTPリクエストを送信する際に確認します。キャッシュに必要なデータがあれば、そこから使用するような動作をします。セキュリティの向上HTTP/2ではセキュリティの向上も一つの目的になっていました。TLSの利用についてHTTP/2の仕様として制限をかけています。既知のセキュリティ上の問題を回避するためです。HTTP/2においてTLSを使用する場合は以下を守る必要があります。HTTP/2レイヤでコネクションエラーとして接続は切断されます。フレームやSETTINGSフレームでやり取りするパラメータなどを追加できるようになっています。ここでは議論中のものも含め、いくつかの拡張仕様について紹介します。ORIGINフレームという新しいフレームを定義しています。オリジン(スキーム・ドメイン名・ポート番号の組)が異なっていても既存のコネクションを使います。そのコネクションがつながっているサーバではそのHTTPリクエストを処理できない可能性があります。クライアントに通知できるようにします。CERTIFICATE_NEEDEDフレーム、USE_CERTIFICATEフレームなどの拡張フレームが定義されています。通信の途中で追加のクライアント証明書を要求することはできません。そこで、これらの拡張フレームを用いて通信の途中でも証明書を要求・提供できるようにします。この仕様では、サーバもしくはクライアントのどちらからでも証明書を追加要求できます。HTTP、HTTP/2に関連する仕様の議論も続いています。興味があれば、作業中のドキュメントがGitHub(https://github.com/httpwg/http-extensions)でも公開されているので見てみると面白いと思います。これからもパフォーマンスとセキュリティの観点での改善は進められていくでしょう。トピックスとお知らせ一覧2020年2019年2018年2017年2016年2015年2014年2013年2012年2011年2010年2009年2008年2007年2006年2005年2004年2003年2002年2001年2000年1999年1998年1997年Web更新履歴一覧2020年の更新履歴2019年の更新履歴2018年の更新履歴2017年の更新履歴2016年の更新履歴2015年の更新履歴2014年の更新履歴2013年の更新履歴2012年の更新履歴2011年の更新履歴2010年の更新履歴2009年の更新履歴2008年の更新履歴2007年の更新履歴2006年の更新履歴2005年の更新履歴2004年の更新履歴2003年の更新履歴2002年の更新履歴Q&AIPアドレスWHOIS/DBJPNIC認証局ドメイン名ニュースレター/メールマガジン会員JPNICについて統計よくある質問イベントカレンダー2020年2019年2018年2017年2016年2015年2014年2013年2012年2011年2010年2009年2008年2007年2006年2005年2004年2003年2002年2001年2000年1999年1998年1997年1996年1995年1994年1993年WHOISGateway表示例このページを評価してくださいこのWebページは役に立ちましたか?役に立った役に立たなかったどちらとも言えないページの改良点等がございましたら自由にご記入ください。回答を差し上げられません。回答が必要な場合は、お問い合わせ先をご利用ください。Views)登録パスワードが記載された確認メールが発送されます。再度ご登録手続きを行ってください。Views)登録パスワードが記載された確認メールが発送されます。再度ご登録手続きを行ってください。