web-dev-qa-db-ja.com

ブラウザは、サイトがHTTP / 2をサポートしているかどうかをどのようにして知るのですか?

入力すると https://http2.golang.org/ chromeブラウザは自動的にHTTP/2リクエストを送信します。これはどのように行われますか?

23
fengsp

たとえば、stackoverflowを例にとると、ブラウザがstackoverflow.comにリクエストを送信するとき、次の手順を実行する必要があります。

  1. DNSルックアップ。 stackoverflowのIPアドレスを見つけます。
  2. TCP/IPハンドシェイク
  3. TLSハンドシェイク。
  4. HTTP要求/応答(アプリケーションプロトコル)。
  5. ....

TLSハンドシェイク

Step3 TLSハンドシェイクに関しては、@ Olegによる 良い説明 があります。

TCP/IPパケットの詳細を検査するには、いくつかのツールを使用してパケットをキャプチャする必要がある場合があります。例えば Wireshark

クライアントはClientHelloをサーバーに送信し、サーバーはいくつかのことを実行します

  • サポートされている暗号スイート。どの暗号スイートが好きですか?
  • サポートされているTLSバージョン。
  • 乱数。
  • サポートされているアプリケーションプロトコル。例えばHTTP/2、HTTP 1.1/Spdy /..
  • ...

Client Hello

サーバーはSeverHelloを応答します。

enter image description here

結論

HTTP2要求/応答はステップ4で発生します。その前に、ブラウザはサーバーがTLSハンドシェイクを介してHTTP/2をサポートするかどうかをすでに知っています。

21
Ryan Lv

chromeブラウザは、WebサイトにHTTP/1.1リクエストのみを送信します。WebサイトはHTTP/2対応なので、HTTP/2をサポートしていることを示すメッセージをブラウザに送信します。サーバーブラウザがHTTP/2を認識できる場合、サーバーとサーバーの間の通信プロトコルをHTTP/2にアップグレードします。したがって、通常、要求をHTTP/2接続に変換するのはサーバーです。ブラウザはアップグレードに準拠しています。サーバーのポリシーchromeブラウザは、サーバーが通信プロトコルをアップグレードした後でのみ、サーバーまたはWebサイトとのHTTP/2接続があることを表示します。

4
Dhumil Agarwal

文字列「h2」は、HTTP/2がトランスポート層>セキュリティ(TLS)[TLS12]を使用するプロトコルを識別します。この識別子は、TLSアプリケーション層プロトコルネゴシエーション(ALPN)>拡張子[TLS-ALPN]フィールド、およびHTTP/2 over TLSが識別される場所で使用されます。

サーバーがhttp2.0をサポートしている場合、ブラウザはサーバーがTLSアプリケーション層プロトコルネゴシエーションでhttp2.0をサポートしていることを検出します。 リンクを参照

2
wow qing