MQTT

MQTT
MQTTロゴ
状態出版
年が始まった1999
最新バージョン5.0 [ 1 ] 2019年3月7日
組織
委員会OASISメッセージキューイングテレメトリトランスポート技術委員会[ 3 ]
編集者アンドリュー・バンクス(IBM)、エド・ブリッグス(マイクロソフト)、ケン・ボーゲンデール(IBM)、ラフル・グプタ(IBM)[ 1 ]
関連規格MQTT-SN [ 4 ]
Webサイトmqtt.org

MQTT [ a ]は、メッセージキューメッセージキューイングサービスのための軽量なパブリッシュ・サブスクライブ型のマシンツーマシンネットワークプロトコルです。IoT(モノのインターネット)など、リソース制約やネットワーク帯域幅の制限があるデバイスが存在する遠隔地との接続向けに設計されています。MQTTは、順序付けれたロスレスの双方向接続を提供するトランスポートプロトコル(通常はTCP/IP)上で動作する必要があります。 [ 1 ]これはオープンなOASIS標準であり、ISO勧告(ISO/IEC 20922)でもあります。

歴史

アンディ・スタンフォード=クラークIBM )とアーレン・ニッパー(当時はユーロテック社に勤務)は1999年にこのプロトコルの最初のバージョンを作成しました。[ 5 ]このプロトコルは、 SCADA産業用制御システム内で石油パイプラインを監視するために使用されました。[ 6 ]デバイスは当時非常に高価だった衛星リンクを介して接続されていたため、帯域幅効率が高く、軽量で、バッテリー電力をほとんど消費しないプロトコルを実現することが目標でした。[ 7 ]

歴史的に、「MQTT」の「MQ」はIBM MQ(当時は「MQSeries」)製品ラインに由来し、「Message Queue」の略称です。しかし、このプロトコルはパブリッシュ・アンド・サブスクライブ型のメッセージングを提供します(名前にもかかわらず、キューは使用しません)。[ 8 ] IBMが公開した仕様バージョン3.1では、このプロトコルは「MQ Telemetry Transport」と呼ばれていました。[ 9 ] [ 10 ] OASISがリリースした後のバージョンでは、このプロトコルは厳密に「MQTT」と呼ばれていますが、技術委員会自体は「OASIS Message Queuing Telemetry Transport Technical Committee」という名称になっています。[ 3 ] 2013年以降、「MQTT」は何も表していません。[ 11 ] [ 8 ]

2013年、IBMはOASIS仕様策定団体にMQTT v3.1を提出し、仕様への軽微な変更のみが認められることを保証する憲章を付した。[ 3 ] OASISはIBMから標準の保守を引き継いだ後、2014年10月29日にバージョン3.1.1をリリースした。[ 12 ] [ 13 ] MQTTバージョン5へのより大幅なアップグレードでは、いくつかの新機能が追加され、[ 14 ] 2019年3月7日にリリースされた。[ 1 ]

MQTT-SN(MQTT for Sensor Networks)は、 Zigbeeなどの非TCP/IPネットワーク上のバッテリー駆動の組み込みデバイスを対象とした主要プロトコルのバリエーションです。[ 15 ] [ 16 ]

概要

MQTTプロトコルは、メッセージブローカーと複数のクライアントという2種類のネットワークエンティティを定義します。MQTTブローカーは、パブリッシュクライアントからメッセージを受信し、適切な宛先クライアントにメッセージをルーティングするサーバーです。[ 17 ] MQTTクライアントは、MQTTライブラリを実行し、ネットワーク経由でMQTTブローカーに接続する任意のデバイス(マイクロコントローラーから本格的なサーバーまで)です。[ 18 ]

情報はトピックの階層構造で整理されます。パブリッシャーが配信する新しいデータ項目がある場合、接続されたブローカーにデータを含む制御メッセージを送信します。ブローカーは、そのトピックをサブスクライブしているクライアントに情報を配信します。パブリッシャーはサブスクライバーの数や所在地に関するデータを保持する必要はなく、サブスクライバーにもパブリッシャーに関するデータを設定する必要はありません。

ブローカーが、現在サブスクライバーがいないトピックのメッセージを受信した場合、メッセージのパブリッシャーがメッセージを保持メッセージとして指定していない限り、ブローカーはそのメッセージを破棄します。保持メッセージは、保持フラグが true に設定された通常の MQTT メッセージです。ブローカーは、選択されたトピックの最後の保持メッセージとそれに対応するサービス品質(QoS) を保存します。保持メッセージのトピックに一致するトピック パターンをサブスクライブしている各クライアントは、サブスクライブ後すぐに保持メッセージを受信します。ブローカーはトピックごとに 1 つの保持メッセージのみを保存します。[ 19 ]これにより、トピックの新しいサブスクライバーは、パブリッシャーからの次の更新を待つことなく、最新の値を受け取ることができます。

パブリッシュ クライアントが最初にブローカーに接続するときに、パブリッシュ クライアントが予期せずブローカーから切断されたことをブローカーが検出した場合にサブスクライバーに送信する既定のメッセージを設定できます。

クライアントはブローカーとのみ対話しますが、システムには現在のサブスクライバーのトピックに基づいてデータを交換する複数のブローカー サーバーが含まれる場合があります。

MQTT制御メッセージは、最小で2バイトのデータしか持ちません。必要に応じて、制御メッセージは約256MBのデータを持つことができます。クライアントとブローカーの接続と切断、データのパブリッシュ、データ受信の確認、クライアントとサーバー間の接続の監視に使用される14種類のメッセージタイプが定義されています。

MQTTはデータ転送にTCPプロトコルを使用します。その変種であるMQTT-SNは、UDPBluetoothなどの他のトランスポート上で使用されます。

MQTTは接続資格情報をプレーンテキスト形式で送信し、セキュリティや認証のための対策は講じていません。TLSを使用して暗号化することで、転送される情報を傍受、改ざん、偽造から保護することができます

デフォルトの暗号化されていないMQTTポートは1883です。暗号化されたポートは8883です。[ 20 ]

MQTTブローカー

MQTTブローカーは、コンピュータ(オンプレミスまたはクラウド)上で実行されるソフトウェアであり、自社開発することも、サードパーティにホストしてもらうこともできます。オープンソースと独自実装の両方で利用可能です。

ブローカーは郵便局として機能します。MQTTクライアントは、宛先の直接接続アドレスではなく、「トピック」と呼ばれる件名を使用します。サブスクライブした人は誰でも、そのトピックのすべてのメッセージのコピーを受け取ります。複数のクライアントが単一のブローカーからトピックをサブスクライブできます(1対多の機能)。また、単一のクライアントが複数のブローカーにトピックのサブスクリプションを登録できます(多対1の機能)。

各クライアントは、パブリッシュとサブスクライブの両方によってデータの生成と受信を行うことができます。つまり、デバイスはセンサーデータをパブリッシュすると同時に、設定情報や制御コマンドを受信することができます(MQTTは双方向通信プロトコルです)。これは、データの共有、デバイスの管理と制御の両方に役立ちます。クライアントは同じデータを複数のトピックにブロードキャストすることはできず、それぞれ単一のトピックを指定した複数のメッセージをブローカーにパブリッシュする必要があります。

MQTTブローカーアーキテクチャでは、クライアントデバイスとサーバーアプリケーションが分離されます。これにより、クライアントは互いの情報を知る必要がありません。MQTTは、設定次第で、証明書、ユーザー名、パスワードで保護された接続でTLS暗号化を使用できます。オプションで、接続時に証明書が必要となる場合があります。証明書はクライアントが提供する証明書ファイル形式で、サーバー側のコピーと一致している必要があります。

障害発生時には、ブローカーソフトウェアとクライアントは冗長化された自動バックアップブローカーに自動的に切り替えます。バックアップブローカーは、クライアントの負荷を複数のオンサイトサーバー、クラウドサーバー、またはこれらの組み合わせで分散するように設定することもできます。

ブローカーは標準MQTTとSparkplugなどの準拠仕様のMQTTの両方をサポートできます。[ 21 ]これは同じサーバーで、同時に、同じレベルのセキュリティで実行できます。

ブローカーは、「永続セッション」と呼ばれる機能によって、デバイスの電源オン/オフに伴うすべてのセッション情報を追跡します。この状態では、ブローカーは各クライアントの接続情報、各クライアントがサブスクライブしているトピック、そしてQoSが1または2のトピックに関するメッセージを保存します。[ 22 ]

MQTT ブローカーの主な利点は次のとおりです。

  1. 脆弱で安全でないクライアント接続を排除します (適切に構成されている場合)。
  2. 単一のデバイスから数千のデバイスまで簡単に拡張できます。
  3. セキュリティ資格情報と証明書(適切に構成されている場合)を含むクライアント接続状態の管理と追跡。
  4. セキュリティを損なうことなく、携帯電話や衛星ネットワークの負担を軽減します (適切に構成されている場合)。

メッセージの種類

接続する

接続、パブリッシュ/サブスクライブ、切断を伴うMQTT接続(QoS 0)の例。クライアントBからの最初のメッセージは、retainフラグにより​​保存されます。

サーバーとの接続が確立されるのを待機し、ノード間にリンクを作成します。

切断

MQTT クライアントが必要な作業を完了し、TCP/IPセッションが切断されるまで待機します。

公開

リクエストを MQTT クライアントに渡した後、すぐにアプリケーション スレッドに戻ります。

バージョン5.0

2019年、OASISは公式のMQTT 5.0標準をリリースしました。[ 1 ]バージョン5.0には、以下の主要な新機能が含まれています。[ 23 ]

  • 理由コード: 確認応答では、失敗の理由を示す戻りコードがサポートされるようになりました。
  • 共有サブスクリプション: クライアント間で負荷を分散できるため、負荷の問題が発生するリスクが軽減されます。
  • メッセージの有効期限: メッセージには有効期限を含めることができ、この期間内に配信されない場合、メッセージは削除されます。
  • トピックエイリアス: トピックの名前は 1 つの数字に置き換えることができます。

サービスの品質

ブローカーへの各接続はQoSの尺度を指定することができる。[ 24 ]これらはオーバーヘッドの増加する順に分類される。

  • 最大 1 回 – メッセージは 1 回のみ送信され、クライアントとブローカーは配信を確認するための追加の手順を実行しません (ファイア アンド フォーゲット)。
  • 少なくとも 1 回 – 確認応答が受信されるまで、メッセージは送信者によって複数回再試行されます (確認済み配信)。
  • 正確に 1 回 – 送信者と受信者は 2 段階のハンドシェイクを実行し、メッセージのコピーが 1 つだけ受信されることを確認します (確実な配信)。

このフィールドは、基礎となる TCP データ転送の処理には影響しません。MQTT の送信者と受信者の間でのみ使用されます。

安全

MQTTプロトコルのセキュリティは2020年にイタリアの研究者によって侵害され[ 25 ] 、このプロトコルに対して低速DoS攻撃が実行されました。[ 26 ]

クラスタリング

MQTTクラスタリングは、MQTTの導入において高可用性、フォールトトレランス、スケーラビリティを確保するために採用される技術です。[ 27 ]効率的で軽量なメッセージングプロトコルであるMQTTクラスタリングは、相互接続されたブローカーノードの回復力のあるネットワークの作成を可能にし、ハードウェア障害やネットワークの中断が発生した場合でも継続的で信頼性の高いメッセージ配信を保証します。

参照

注記

  1. ^元々はMQ Telemetry Transportの頭字語です。MQはIBM MQ製品名に由来し、「メッセージキュー」の略称です

参考文献

  1. ^ a b c d e「MQTT バージョン 5.0」 . OASIS . 2019年3月7日. 2020年12月15日閲覧
  2. ^ 「ISO/IEC 20922:2016 情報技術 — メッセージキューイングテレメトリトランスポート (MQTT) v3.1.1」 。 2024年10月27日閲覧
  3. ^ a b c「OASIS メッセージキューイングテレメトリトランスポート(MQTT)技術委員会憲章」 OASIS . 2020年12月15日閲覧
  4. ^ 「MQTT SN 小委員会」 . OASIS . 2020年12月15日閲覧
  5. ^ “10th birthday party” . MQTT.org . 2009年7月. 2015年3月15日時点のオリジナルよりアーカイブ。 2015年4月25日閲覧
  6. ^ 「IBMポッドキャストのトランスクリプト」(PDF) IBM.com 2011年11月2021年1月7日閲覧
  7. ^ 「MQTT入門」 . HiveMQ. 2020年4月24日.
  8. ^ a bチーム、HiveMQ。「MQTTプロトコルの紹介 - MQTTの基本:パート1」。HiveMQ 2021年9月26日閲覧
  9. ^ 「MQTT v3.1とMQTT v3.1.1の相違点」 OASIS Message Queuing Telemetry Transport (MQTT) TC. 2015年2月12日. 2021年8月19日閲覧
  10. ^ 「MQTT V3.1 プロトコル仕様」 . Eurotech, International Business Machines Corporation (IBM). 2010 . 2020年12月15日閲覧
  11. ^ 「OASIS MQTT 技術委員会 2013 年 4 月 25 日木曜日電話会議の議事録」(PDF)
  12. ^ 「MQTT バージョン 3.1.1」 2014年10月29日. 2020年12月16日閲覧
  13. ^ 「最新のMQTT 3.1.1バージョンにアップグレードする価値がある6つの理由」 2014年10月30日. 2020年12月16日閲覧
  14. ^ 「3.1.1と5.0の違い。GitHub
  15. ^ Stanford-Clark, Andy ; Hong Linh Truong (2013年11月14日). 「MQTT For Sensor Networks (MQTT-SN) Protocol Specification Version 1.2」(PDF) . OASIS Open . OASIS Message Queuing Telemetry Transport (MQTT) Technical Committee. p. 28. 2020年12月15日閲覧.
  16. ^ 「MQTT-SN(センサーネットワーク向けMQTT)入門」 2017年1月25日. 2020年9月16日閲覧
  17. ^ Yuan, Michael. 「MQTTを知る」 IBM Developer . 2019年10月13日閲覧
  18. ^ 「クライアント、ブローカー/サーバー、接続の確立 - MQTTの基本:パート3」 HiveMQ 2019年7月17日。 2019年10月13日閲覧
  19. ^ 「保持メッセージ – MQTTの基本:パート8」HiveMQ2015年3月2日。 2019年10月13日閲覧
  20. ^ 「FAQ – よくある質問」 . MQTT.org . 2020年3月19日閲覧。
  21. ^ “MQTT スパークプラグ/タフ” . www.cirrus-link.com 2019 年11 月 5 日に取得
  22. ^コープ、スティーブン (2020).完全な初心者向けの MQTT。ウィドーカ・ニエズナニ。 p. 17.ISBN 9798779030762
  23. ^ 「MQTTとは?定義と詳細」www.paessler.com . 2020年6月9日閲覧
  24. ^ 「IBM Knowledge Center - IBM MQ - IBM Integration BusでのMQTTの使用 - サービス品質と接続管理」 www.ibm.com . 2018年1月30日閲覧
  25. ^ Vaccari, I., Aiello, M., Cambiaso, E. (2020). SlowITe:MQTTに影響を与える新たなサービス拒否攻撃.Sensors, 20(10), 2932. doi : 10.3390/s20102932 .
  26. ^ CVE-2020-13849
  27. ^ 「高可用性MQTTクラスター - Bevywise Networks」www.bevywise.com . 2023年12月22日閲覧
  28. ^ 「APIとプロトコル」 . Solace . 2021年4月8日閲覧
  29. ^ 「MQTT 5.0 サポート🎉」 . Solace コミュニティ. 2021年1月4日. 2021年4月8日閲覧