1. 背景
前回の記事では、gRPC が優れている理由の 1 つである ProtoBuf シリアル化プロトコルを紹介しました。2 つ目の理由は、HTTP2 の採用です。HTTP2 は SPDY から開発されました。過去には、タオバオ MTOP プラットフォームにはパフォーマンスの最適化のために SPDY プロトコルが埋め込まれていました。このようにして、タオバオ クライアントはバックエンド インターフェイスを XX 倍速く調整できるようになりました。今すぐ HTTP2.0 に置き換えるべきです。何年も経ち、MTOP が何なのかほとんど忘れてしまったので、メモを書いて整理する必要があります頻繁に。
2. HTTP1 の HTTP2 最適化
1. 多重化
- HTTP2 は単一の TCP 接続で並列リクエストを実装します。1 つの接続で任意の数の双方向データ ストリームを伝送できます。ストリームは接続内の仮想チャネルであり、ストリーム内のメッセージはバイナリ フレームで送信されます。
- HTTP1.X では複数の同時リクエストが必要で、複数の TCP 接続を使用する必要があり、単一のドメイン名に対するリクエストの数には制限があります。
2. データのエンコード
- HTTP2 はリクエストとレスポンスを小さなフレームに分割し、バイナリ エンコードを使用します。
- HTTP1.X の要求および応答メッセージは、開始行、ヘッダー、本文で構成され、各部分は改行文字で区切られます。
3. HTTP2 は、ヘッダー圧縮とサーバー プッシュ機能もサポートします。
3. 実験的テスト
この実験の目的は、HTTP2 の多重化特性をテストすることです。
1.環境の構築
Nginx 設定 Http2 必要条件
Nginx バージョンは 1.9.5 以降、私のバージョンは 1.20.1
OpenSSL バージョンは 1.0.2e 以降、私のバージョンは OpenSSL 1.0.2k
Nginx に 2 つのモジュールがインストールされているかどうかを確認します --with-http_v2_module, - -opensslあり
nginx.confの設定
注: HTTP2 の構成には、HTTPS の構成と同じ証明書が必要です。これをサポートするには、HTTPS 構成に [http2] を追加します。HTTPS を削除するには、[https] を削除するだけです。
2. ネットワークリクエストメッセージの比較
まず、20 枚の画像を埋め込んだ Index.html を作成しました。
<img src="a.jpg"/>
<img src="b.jpg"/>
......
<img src="t.jpg"/>
HTTP2 として構成された、ブラウザーのネットワーク要求のスクリーンショット
HTTP2 として構成された TCPDUMP はサーバー上のデータをキャプチャします。接続が 1 つだけ (SYN パケットの数) であることがわかります。
tcpdump -ieth0 tcp port 443 and host 115.195.149.98 -w http2.pcap
HTTPS ブラウザとして構成されたネットワーク リクエストのスクリーンショット
TCPDUMP はサーバー側でパケット データをキャプチャします。21 件の接続、1 件のindex.html、および 20 件の画像リクエストが作成されたことがわかります。
結論: パケット キャプチャ データの分析から、HTTP2 は 1 つの TCP 接続のみを使用していることがわかります。理論的には、それほど多くの TCP スリーウェイ ハンドシェイクを行わなくても高速になります。実際のテスト結果も高速ですが、サンプルの数がこの 1 つのテストでは数が少なすぎて評価基準として使用できません。原理だけを理解してください。HTTPS プロトコルについては、パケット キャプチャ ツールを使用して HTTPS メッセージを解析することがわかります。
記事を書き終えてから、HTTP3 が昨年登場したことを知りましたが、HTTP2 についてはまだあまり調べていませんでした。