"HTTP"って何?
HTTPはプロトコルの一つです。プロトコルとは、通信ルールのことです。ブラウザやWebサーバはHTTPという通信ルールにのっとりやりとりを行います。通信ルールにより、開発者が異なる多くのソフトウェアどうしがきちんと通信できます。
HTTPとは、インターネットにおける通信ルールのことです!
具体的には、通信するデータに含まれる
* h2h3 [:method: GET]
* h2h3 [:path: /]
* h2h3 [:scheme: https]
* h2h3 [:authority: example.com]
* h2h3 [user-agent: curl/7.87.0]
こういうメッセージの意味だったり、そもそもどういった形でデータを扱うのか、ということが定義されています!
データの形については、HTTP/1.1ではテキスト形式ですが、HTTP/2とHTTP/3ではバイナリ形式(0と1の組み合わせ)だそうです。
HTTPの歴史
2022年6月からは、HTTP/3がインターネットの標準仕様となっています!
例えば、chrome検証ツールのネットワークタブを開いてみると、
Protcolのカラムにh3
と表示されます。これは、HTTP/3の通信ルールを使っているということです!
HTTP/1.1の課題
2010年ごろより、Webがより発達し、各ページの見た目や振る舞いがよりリッチになっていきました。それに伴いWebページの表示に必要なファイル数は多くなり、ブラウザとサーバでやりとりされる通信の数も増えました。そういった中で、HTTP/1.1が抱える問題に直面します。
HTTP/1.1では連続して1,2,3,4とリクエストを送った際、レスポンスも1,2,3,4と順番に返す必要がありました。そのため、あるレスポンスの生成に時間がかかると、後続のレスポンスの待ち状態が発生してしまうという問題がありました。これを、Head-of-Line-Blocking問題といいます!
HTTP/2
HTTP/2では、リクエストとレスポンスの一対のペアを、他のペアに依存しないように並列的にやり取りすることができます!
実際にはリクエスト(レスポンス)を並列に送ることはできないのですが、各リクエスト(レスポンス)を細切れにし、フレームという単位で識別することによって、あたかも並列的に通信しているかのようになります。これで、リクエストの順番通りにレスポンスを返さなくてもよくなりました!
ここで、図に出てくるTCPコネクションとは、HTTPよりも下位(より物理に近い?)プロトコル(=通信ルール)です。HTTPはアプリケーション層と呼ばれるソフトウェアに関するプロトコルですが、TCP(Transmission Control Protocol)はトランスポート層と呼ばれる、データの転送制御に関するプロトコルです!
HTTP/2の課題
HTTP/2は、下位のプロトコルであるTCPに課題がありました!
TCPでは、送信者がパケットを送信した順番どおりに、受信者はパケットを処理する必要があります。そのため、パケットロスが発生した場合は、送りなおしてもらう必要があります。パケットの順番の入れ替わりが発生した場合は、もとの順番に戻す必要があります。パケットロスやパケットの順番の入れ替わりが解消されるまでは、処理は待ちとなります。
パケットとは、通信しやすくするためにデータを細切れにしたものです。(細切れが多くてややこしいですね、、)
すなわち、データが正しく順番通りに送られてこなければ、結局後続のレスポンスが待ち状態に入ってしまう、Head-of-Line-Blocking問題がありました。
ちなみに、パケットロスってどのくらい起こるのか調べてみたところ、、
通信事業者のIP通信サービスが満たすべき国際標準規格 (Y.1541) では,上限が 0.1% と規定されている
結構日常的に起こっていそうですね!
HTTP/3
さて、TCPのHead-of-Line-Blocking問題を解決するために、HTTP/3ではトランスポート層に新しく開発されたQUICというプロトコルを使います!
QUICは、パケットロスやパケットの順番の入れ替わりが起きても、受信者が受け取った順番にデータを処理できます。これにより、リクエストとレスポンスのペアは、他の通信が上手くいかなくても待ち状態になることなく、Webページを早く表示することができます!
あくまで、QUICはトランスポート層の新たなプロトコルです。HTTP/3はQUICを活かすように設計されたアプリケーション層のプロトコルで、他のレスポンスに依存しない処理優先度のルールなど、届いたパケットから処理できるような工夫がされています!
まとめ
HTTP/2ではHTTPメッセージを並列的にやりとりできるようになり、HTTP/3ではQUICという新たなプロトコルを活かすように届いたパケットからリクエストを処理できるようになりました。2022年6月からはHTTP/3が標準化され、従来よりも高速な通信が可能になりました!
参考文献
https://gihyo.jp/admin/serial/01/http3/0001
画像もこちらから引用させていただきました。