QUICプロトコル：IoTとIoV向けの機能、ユースケース、影響

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/df30bd8a-2e23-1471-084c-854b7a56ef7e.png)

## QUICプロトコルとは？

QUIC（Quick UDP Internet Connections）は、Googleがウェブ接続の速度と信頼性を向上させるために開発したプロトコルである。現在のインターネットインフラで使用されているTCP（Transmission Control Protocol）に代わるものとして設計されています。QUICは、UDP（User Datagram Protocol）の上に構築されています。

QUICは、暗号化と多重化の組み合わせにより、セキュリティの向上と高速なデータ転送を実現します。これにより、1つの接続で複数のデータストリームを送信することができ、待ち時間を短縮してスループットを向上させることができます。また、QUICには輻輳制御やフロー制御などの機能があり、ネットワークの混雑を管理し、スムーズなデータ転送を実現します。

インターネット技術タスクフォース（IETF）はQUICの標準化を進めており、主要なウェブブラウザやサーバーが採用しています。QUICは、特にモバイルネットワークのような高遅延でスポッティなネットワークにおいて、TCPと比較してWebページの読み込み時間を改善し、切断の発生を減少させることが示されています。

## QUICプロトコルの基本的な機能とは？

**独立した論理ストリーム**

独立した論理ストリームは、QUICのコア機能の一つです。つまり、1つの接続で複数のデータストリームを送信し、各ストリームを独立して処理することができるのです。これに対し、TCPは1つのデータストリームを使用し、各パケットを順番に受信して確認する必要があります。独立したストリームを使用することで、アプリケーションはデータを送受信し、ネットワーク帯域幅などのリソースをより効率的に管理することができます。

**安定したセキュリティ**

QUICのもう一つの重要な特徴は、エンドツーエンドのセキュリティを提供することです。QUICで送信されるデータはすべてデフォルトで暗号化され、平文で通信するオプションはありません。これは、盗聴やその他の攻撃から保護するのに役立ちます。QUICはTLS（Transport Layer Security）プロトコルを使用して、安全な接続の確立と維持、エンドツーエンドの暗号化を行います。

**低レイテンシー**

このプロトコルは、エンドポイント間でデータを送受信する際のハンドシェイクの待ち時間を短縮するように設計されており、モバイルネットワークなどの高遅延ネットワークでは特に重要です。QUICは、接続を確立するために必要なラウンドトリップの数を最小限に抑え、データをより小さなパケットで送信できるようにすることでこれを実現しています。既存のインターネットプロトコルでは、遅延が問題になることが多く、米国と欧州の往復で300ミリ秒や400ミリ秒になることもある。

**信頼性**

QUICはUDPをベースに信頼性の高い伝送機能を提供し、TCPと同様にコネクションオリエンテッドなトランスポートプロトコルである。QUICプロトコルは、データ伝送時のパケットロス回復と再送信機能を持ち、データの完全性と正確性を確保することができます。また、QUICはデータパケットの到着順序を保証することができ、乱れによるデータエラーを回避することができます。

**HOLブロッキングの回避**

QUICは、複数のデータストリームを可能にすることで、ヘッドオブラインブロッキングの問題に対処しています。これにより、異なるアプリケーションからのメッセージは独立して配信され、ブロックされたアプリケーションの処理を待つメッセージの潜在的な遅延を回避することができます。

## QUICプロトコルの5つの共通ユースケースは？

HTTP/3とQUICの普及が進み、採用が進むにつれて、さまざまなユースケースの出現が予想されます。これらのユースケースには、ライブやビデオストリーミング、ビデオオンデマンド、ダウンロード、ウェブアクセラレーションなどが含まれます。これらの技術の最も有望なアプリケーションシナリオは以下の通りです：

1. **リアルタイムのWebアプリケーションやモバイルアプリケーション**：音声や映像の通信を行うWebアプリケーションやモバイルアプリケーションなど、これらのアプリケーションでは、低遅延で信頼性の高いデータ通信が求められます。QUICは独立したストリームを使用し、輻輳制御機構を備えているため、データの送受信を迅速かつ効率的に行うことができ、これらのアプリケーションに適しています。QUICプロトコルのマルチストリームモードでは、同一コネクション内の異なるストリーム間のデータ伝送に影響を与えません。
2. **IoTデバイスとの通信**：IoT機器との通信には、TCPやMQTTなどのプロトコルを使用することが多い。しかし、これらのプロトコルは、特に制約のある環境では、高遅延やパケットロスといった問題が発生しやすい。QUICは、高遅延でロスの多いネットワークでうまく機能するように設計されているため、より信頼性が高く効率的な代替手段を提供することができます。ラウンドトリップタイム（RTT）がほぼゼロであることは、ネットワークのパフォーマンスを向上させ、良好なユーザー体験を確保するために重要です。
3. **次世代自動車とコネクテッドカー**: QUICは次世代自動車(IoV)エコシステムに大きな利益をもたらす可能性があります。これらのシステムは、交通管理、車両追跡、安全機能などのサービスを提供するためにリアルタイムのデータ交換に依存します。QUICの低レイテンシー、多重化機能、パケットロスやパケットの順番の入れ替えに強い耐性は、車両とインフラストラクチャ要素の間の信頼性の高い効率的な通信を確保できます。さらに、QUICが使用するTLS暗号化により、機密性の高い車両データのセキュリティが向上します。
4. **クラウドコンピューティング**：インターネット上でコンピューティングリソースを提供することです。QUICを使用することで、クラウドアプリケーションは低遅延とエンドツーエンドの暗号化の恩恵を受けることができ、ユーザー体験とセキュリティを向上させることができます。
5. **ペイメントやeコマースアプリケーション**：これらのアプリケーションは、安全で信頼性の高いデータ伝送を必要とします。QUICはTLS（Transport Layer Security）暗号化と信頼性の高いHTTP3ストリームを使用しているため、データを傍受されることなく安全に伝送することができ、これらのアプリケーションに適しています。また、エンドユーザーの視点に立つと、QUICプロトコルは、より高速でシームレスなトランザクションを実現し、ユーザーエクスペリエンスを向上させることができます。

## MQTTの定義、そしてQUICで運用するメリットは何か？

MQTTは、低帯域幅、高遅延、または信頼性の低いネットワークが一般的な状況向けに特別に設計された軽量メッセージングプロトコルです。アプリケーション層で動作し、主にマシンツーマシン（M2M）通信やモノのインターネット（IoT）シナリオに使用されています。MQTTはパブリッシュ・サブスクライブモデルを採用しており、デバイスが中央のブローカーにメッセージを送信（パブリッシュ）し、他のデバイスが指定されたトピックに基づいてそれらのメッセージを受信（サブスクライブ）することができる。

QUICがWebベースのアプリケーションのパフォーマンスとセキュリティの向上に重点を置いているのに対し、MQTTはリソースに制約のある環境に軽量で効率的なメッセージング・ソリューションを提供することに重点を置いて作られています。QUIC上でMQTTを実行することで、パフォーマンスの大幅な向上とレイテンシーの短縮が期待でき、トランスポート・レイヤー・セキュリティ（TLS）の追加オーバーヘッドを必要とせずにパフォーマンスの向上を実現することができます。QUICスタックの実装はほとんどがユーザー空間で行われるため、QUICのデータ転送は、アプリケーション層の特定の要件に基づいて、さまざまなネットワーク環境に適応するようにカスタマイズすることができます。

## MQTT Over QUICとMQTT Over TCP/TLSの比較

MQTT over TCP/TLSとは、トランスポート層としてTransmission Control Protocol（TCP）上でMQTTプロトコルを使用することを指します。TCPは、デバイス間のデータパケットの適切な配信を保証する、信頼性の高い接続指向のプロトコルである。TLS（Transport Layer Security）は、2つのエンドポイント間で送信されるデータを暗号化することにより、ネットワーク上での安全な通信を提供する暗号化プロトコルである。TLSは通常、TCPの上位レイヤーとして実装されます。つまり、TCPを使用して2つのエンドポイント間の接続を確立および維持してから、その接続を介して送信されるデータを暗号化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/11bb6a59-8e84-8d4d-d58b-38bc63f518e5.png)

MQTT over QUICは、MQTT over TCP/TLSと比較して大きな利点があります：

**接続が確立される：**

* MQTT over TCP/TLS: MQTT over TCP/TLSはTLS1.2仕様を採用しており、TCPレイヤーとTLSレイヤーの2つのハンドシェイクが必要です。つまり、アプリケーション層がデータ交換を開始するまでに、2～3回のラウンドトリップが必要です。
* MQTT over QUIC: MQTT over QUICはTLS1.3仕様を適用し、ゼロまたは1ラウンドトリップタイム（0-RTTまたは1-RTT）のハンドシェイクを使用して高速な接続確立を可能にし、接続設定時の待ち時間を短縮する。  
**レイテンシーとパフォーマンス：**
* MQTT over TCP/TLS: 信頼性の高いデータ転送を提供しますが、TCPのヘッドオブラインブロッキングと輻輳制御メカニズムにより、特に信頼性の低いネットワーク上では遅延の増大とパフォーマンスの低下を招くことがあります。
* MQTT over QUIC：TCPの信頼性とUDPの低遅延特性を組み合わせたものです。QUICのストリーム多重化機能により、ヘッドオブラインブロッキングの問題を最小化し、ロッシーネットワークや高遅延ネットワークでのパフォーマンス向上につながります。  
**セキュリティ：**
* MQTT over TCP/TLS: MQTT通信を安全にするために、暗号化と認証を追加するTLSと組み合わせることがよくあります。しかし、この場合、接続設定とデータ送信の際に追加のオーバーヘッドが必要になります。
* MQTT over QUICです：QUICはTLS1.3による暗号化を内蔵しており、追加の設定手順やオーバーヘッドを必要としない安全な通信を提供します。

**移動中のクライアントに対応する接続移行機能：**

* MQTT over TCP/TLS：[**MQTTクライアント**](https://www.emqx.com/ja/blog/mqtt-client-tools)やサーバーがIPアドレスやネットワークを変更した場合、既存のTCP接続を切断して再確立する必要があり、通信が途絶える原因になります。
* MQTT over QUIC：コネクションマイグレーションに対応し、クライアントやサーバーがIPアドレスやネットワークを変更しても、継続的な通信を中断させることはありません。  
**応用とサポート：**
* MQTT over TCP/TLS：さまざまなプラットフォームやプログラミング言語において、さまざまな[**MQTTブローカー**](https://www.emqx.com/en/blog/the-ultimate-guide-to-mqtt-broker-comparison)、クライアント、ライブラリによって広く採用・サポートされています。
* MQTT over QUIC：QUICはまだ新しいプロトコルであるため、現時点ではMQTT over QUICのサポートや採用はそれほど多くありません。

## IoV における MQTT Over QUIC の使用例

MQTT over QUICは、低遅延で信頼性が高く、安全な通信が様々なアプリケーションに不可欠なInternet of Vehicles（IoV）のユースケースにおいて有益です。QUICは、TCPとUDPの優れた機能を組み合わせると同時に、暗号化を内蔵しているため、MQTTベースのIoVアプリケーションのパフォーマンスとセキュリティを向上させることができます。

MQTT over QUICのInternet of Vehiclesにおける使用例として、以下のようなものがあります：

* 車両とインフラ（V2I）間の通信：QUICの低遅延で信頼性の高いデータ伝送により、車両と交通信号、料金システム、スマートパーキングシステムなどのインフラストラクチャ・コンポーネント間の通信効率を向上させることができます。
* 車車間（V2V）通信：衝突回避、協調型アダプティブ・クルーズ・コントロール、プラトゥーンなどのアプリケーションでは、高速で安全なデータ交換が重要です。MQTT over QUICは、これらのアプリケーションに必要な速度とセキュリティを提供することができます。
* ビークル・トゥ・エヴリシング（V2X）通信：車両、インフラ、他の道路利用者を組み合わせたV2X通信は、交通安全と交通効率の向上を目指しています。MQTT over QUICは、遅延の少ない信頼性の高い通信を提供し、重要な情報のタイムリーな交換を保証します。
* 車載インフォテインメントとテレマティクス：MQTT over QUICは、インフォテインメントシステムのパフォーマンスを向上させ、安全な通信を確保しながら、メディアストリーミング、ナビゲーション更新、リアルタイムの交通情報などをより速く提供することができます。
* フリートマネジメントとトラッキング：車両のリアルタイム追跡と管理には、車両と管理システム間の効率的な通信が必要です。MQTT over QUICは、信頼性の高いセキュアな通信を提供し、車両の位置、診断、ドライバーの行動に関するリアルタイムの更新を可能にします。
* OTA（Over-the-Air）アップデート：車両のファームウェアやソフトウェアの更新には、安全で信頼性の高いOTAアップデートが不可欠です。MQTT over QUICは、車両の運用を妨げることなく、これらのアップデートを配信するために必要なセキュリティと信頼性を提供することができます。
* 緊急時の対応緊急事態では、信頼性の高い高速通信が重要です。MQTT over QUICは、緊急車両、対応チーム、コントロールセンター間のタイムリーで安全な情報交換を可能にします。

## EMQX: MQTTブローカーとして初めてMQTT Over QUICを実装し、技術を革新します

[**EMQX**](https://www.emqx.io/)は、高性能なリアルタイムメッセージ処理エンジンを搭載した、先進な[**オープンソースのMQTTブローカー**](https://www.emqx.com/en/blog/a-comprehensive-comparison-of-open-source-mqtt-brokers-in-2023)で、大規模なIoTデバイス向けのイベントストリーミングを強力にサポートします。バージョン5.0以降、EMQXはMQTTブローカーとして初めてMQTT over QUICをサポートし、現代の複雑なネットワーク上でMQTTメッセージをより効率的かつ安全に伝送する方法を提供し、特定のシナリオでMQTTのパフォーマンスを向上させました。

現在のEMQXサポートの実装では、トランスポート層をQUICストリームに置き換え、クライアントが接続を開始し双方向のストリームを作成します。EMQXは2つの動作モードをサポートしています：

* **シングルストリームモード**は、MQTTパケットを単一の双方向QUICストリームにカプセル化する基本モードです。高速ハンドシェイク、秩序あるデータ配信、接続再開と0-RTT、クライアントアドレス移行、強化された損失検出と回復を提供します。このモードでは、クライアントとブローカー間の通信をより高速かつ効率的に行いながら、秩序を保ち、接続を迅速に再開し、クライアントが大きな障害なしにローカルアドレスを移行することができます。
* **マルチストリームモード**は、QUICのストリーム多重化機能を活用し、MQTTパケットを複数のストリームで伝送することを可能にします。これにより、1つの[**MQTT接続**](https://www.emqx.com/en/blog/how-to-set-parameters-when-establishing-an-mqtt-connection)で複数のトピックデータを伝送できるようになり、接続制御とMQTTデータ交換の分離、回線先頭のブロッキングの回避、アップリンクとダウンリンクのデータの分割、異なるデータの優先順位付け、並列性の向上、堅牢性の向上、フロー制御データストリーム、加入遅延の短縮など、いくつかの改善がもたらされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/94b91cfa-6851-0573-7208-1ab7179836e6.png)

**NanoSDK クライアントを使用して MQTT over QUICで接続**

[**NanoSDK**](https://github.com/nanomq/NanoSDK/)は、C言語ベースのMQTT over QUICのための最初のSDKで、EMQX 5.0と完全な互換性を持っています。NanoSDKの主な特徴は、非同期I/O、MQTT接続のQUICストリームへのマッピング、低レイテンシーの0-RTTハンドシェイク、複数コアの並列処理などです。

📷

また、EMQXは、複数のプログラミング言語でMQTT over QUICをサポートするクライアントSDKを提供しています：

* [**NanoSDK-Python**](https://github.com/wanghaEMQ/pynng-mqtt)です：NanoSDKのPythonバインディングです。
* [**NanoSDK-Java**](https://github.com/nanomq/nanosdk-java)です：NanoSDKのJava JNAバインディングです。
* [**emqtt**](https://github.com/emqx/emqtt) \- Erlang MQTT クライアント：Erlangで開発された、QUICをサポートするMQTTクライアントライブラリです。  
**次のステップ：**
* EMQX solution for MQTT over QUICの[**詳細はこちら**](https://docs.emqx.com/en/enterprise/v5.0/mqtt-over-quic/introduction.html#mqtt-over-quic)。
* MQTT over QUICを使い始めるための詳細なブログポストを[**お読みください**](https://www.emqx.com/en/blog/getting-started-with-mqtt-over-quic-from-scratch)。


元々は [www.emqx.com](https://www.emqx.com/ja/blog/quic-protocol-the-features-use-cases-and-impact-for-iot-iov) で公開されました