QUICご存知ですか?

Tech

連日暑い日々が続いていますが、みなさんいかがお過ごしでしょうか。
WYRDの豊田です。

最近は日傘とハンディ扇風機を常に携帯するようになりました。
マスクをしながら、この酷暑を乗り切るのは今年で最後にしたいところですね。

さて今回のブログでは、HTTP/3を実現する上で合わせて策定され、5月にIETFにより承認された”QUIC”(クイック)というプロトコルについて書いていこうと思います。

HTTPの歴史

QUICを説明するには、まずHTTPの変遷について理解しておく必要があります。

HTTP/1.1

HTTP/1.1は、1997年に最初のRFCが発行されて以来、これまで何度も拡張を繰り返し、現在も利用され続けています。

近年のインターネットの目覚ましい発展により、HTTPには通信データ量の増加、通信速度の高速化が求められるようになりました。

ここでHead of Line Blockingという問題が表面化します。

HTTP/1.1には「リクエストとレスポンスは送受信の順番を一致させる」というルールがあり、処理に時間のかかるリクエストをすると、その処理が終わるまで次のリクエストは処理を待たされます。
これを(HTTPレベルの)Head of Line Blockingと言います。

クライアント                  サーバー
   |                                      |
   |--------- req_1 -------->|----
   |                                      |   ^
   |                                      |   |
   |                                      |  この間req_2を送っても処理されない
   |                                      |   |
   |                                      |   v
   |<-------- res_1 ---------|----
   |                                      |

いくつかの回避策(HTTPパイプラインやコネクション多重化)は考えられましたが、どれも根本的な解決にはなりませんでした。
通信の効率が落ちてしまうこの問題は、発展を続けるインターネットの世界で悩ましい問題だったと言えるでしょう。

HTTP/2

2015年5月、HTTP/1.1の抱える問題の解決を図るため、新たなRFCが採用されます。これがHTTP/2です。

HTTP/2では、ひとつのTCPコネクション内にストリームという通信の単位が与えられ、リクエスト-レスポンスをセットで管理するようになりました。
個々のストリームを独立した通信として管理することで、あるストリームで発生した遅延が他ストリームに影響を及ぼすことはなくなりました。

 

これで(HTTPレベルの)Head of Line Blockingは解決されました。

※HTTP/2ではヘッダの圧縮など、他にもさまざまな点で効率化が図られましたが、今回は割愛しています

HTTP/2にも問題があった

HTTP/2の登場により、全て解決…とはなりませんでした。
次に問題になったのは(TCPレベルの)Head of Line Blockingでした。

TCPとは、HTTPのプロトコルスタックにおいて、下層で利用しているトランスポート層のプロトコルです。

TCPは通信の信頼性(データの欠落や誤りが無い)を保証します。
その性質上、通信(パケット)に問題が発生した場合、その問題が解決されるまでTCPレベルで通信が止まります。

HTTPはTCPの上で動作するプロトコルなので、TCPレベルで通信が止まると、当然HTTPも通信が止まります。これが(TCPレベルの)Head of Line Blockingです。

多くの場合TCPの信用性の担保はOSレベルで行われるため、アプリケーション(HTTP)は問題が解決するまで待つしか無いのです。

QUIC登場

2013年、Googleが独自に開発を進めていた QUICというプロトコルが発表されます。
当時はトランスポート層とアプリケーション層のプロトコルが混在し、プロトコルスタック上では明確に分けられていなかったようです。

TCPレベルのHead of Line Blockingに対する解決が試みられていたこのプロトコルは、2016年にIETFワーキンググループが発足し標準化が進められることになります。

QUICの特徴

QUICはトンランスポート層のプロトコルですが、下位プロトコルに同じトランスポート層のUDPを利用しているという特徴があります。

 

UDPは通信の信頼性を保証しませんが、上位のQUICが通信の信頼性を保証するための拡張を行います。
TCPでは手の届かなかった痒いところをUDPの拡張により解決した感じですね。

2020年時点で、QUICにはGoogle QUICとIETF QUICという“似て非なるプロトコル”が混在している状況ですが、Googleは順次IETF QUICに対応していくことを明言しています。

ChromeではすでにHTTP/3が?

QUICと並行して策定が進められているHTTP/3は、現在草案34版がでていますが、正式なRFCにはなっていません。

ただし、最新のGoogle Chromeを使ってGoogleのトップページへアクセスすると、すでに(部分的に)HTTP/3が利用されていたりします。(Protocolが “h3” となっている)

最後に

QUICはTLS(暗号化)なども一手に引き受けることで、コネクション確立を効率化したり、トランスポート層の通信内容まで暗号化できるなど、他にもさまざまな改善が盛り込まれています。

ただ、世界にはすでにたくさんのTCPで動作する機器が存在していることもあり、すぐにQUICが主流となることはなさそうです。

環境と仕組みが相互に発展を続けていく、というサイクルの象徴的な出来事と言えるかもしれません。

タイトルとURLをコピーしました