MQTT (Message Queuing Telemetry Transport) について
MQTTは、メッセージ指向ミドルウェアのアプリケーション層で利用される、TCP/IPをベースとしたPub/Sub型のデータ配信プロトコルです。軽量な設計が特徴で、非力な
デバイスやネットワークが不安定な環境でも安定した動作が可能です。旧称はMQ Telemetry Transportで、MQSeriesから名称が来ていますが、
メッセージキューの機能は持ちません。
歴史
1999年に
IBMのアンディー・スタンフォード・クラークとArcom Control Systemsのアーレンニッパーによって最初のバージョンが作成されました。同年にはVersion 2が定義され、1999年10月にはVersion 2.3(Version 3.1.1相当のパケットを備える)にアップデートされました。その後、2000年にVersion 3.0、2010年にはロイヤリティフリーとなったVersion 3.1がリリースされました。2007年にはArcom Control SystemsがEurotechに買収され、仕様は
IBMとEurotechが管理しました。2014年10月29日にはVersion 3.1.1がリリースされ、仕様の管理はOASISに移管されました。2016年にはISO/IEC標準のISO/IEC 20922:2016として採用され、2019年3月には最新のVersion 5.0がリリースされています。
特徴
軽量なプロトコル
MQTTは、ヘッダーサイズが最小2バイトという軽量なプロトコル仕様が特徴です。TCP/IP、TLS、
WebSocketなどのプロトコル上で動作し、ロスレスで順序保証された双方向通信を前提としています。IANAには、TLS使用時は8883番ポート、非TLS時は1883番ポートが登録されています。
柔軟なメッセージ配布
メッセージの配布先は、/区切りの階層構造で指定でき、ワイルドカードも使用可能です。これにより、柔軟なメッセージルーティングが実現します。
トピックベースのPub/Sub
MQTTは、トピックをベースとしたPub/Subモデルを採用しており、1対1、1対N、N対Nのメッセージ配信が可能です。
メッセージ配布の品質 (QoS)
3種類のQoSレベルが設定可能です。
- - QoS 0 (At most once delivery): 最大1回送信。メッセージの到達は保証されず、再送も行いません。
- - QoS 1 (At least once delivery): 少なくとも1回送信。メッセージは必ず届きますが、重複する可能性があります。
- - QoS 2 (Exactly once delivery): 正確に1回送信。メッセージは必ず届き、重複もありません。
QoSレベルは、単一の送信者と受信者間で適用され、
サーバが複数のクライアントにメッセージを配信する際は、それぞれ異なるQoSレベルが使用される場合があります。
メッセージ再配布機能
クライアントが再接続時にセッションが残っている場合、未確認応答のPUBLISHパケットとPUBRELパケットが再送されます。これは、メッセージが再配布される唯一の機会です。QoS 0のPUBLISHパケットは再送されません。
Willメッセージ
クライアントとの接続が異常に切断された場合に、
サーバから他のクライアントへ配信されるメッセージです。クライアントは、接続時にWillメッセージを
サーバに登録しておきます。
Retain
Retainフラグ付きで配信されたメッセージは、
サーバにトピックごとに保存され、後からトピックを購読したクライアントに配信されます。これにより、購読前の最新メッセージを受け取ることができます。
セキュリティ
MQTT自体には具体的なセキュリティ規定はありませんが、実装依存と下位層のセキュリティ技術を利用することが推奨されています。CONNECTパケットでユーザ名と
パスワードを含めることができ、Basic認証が利用できます。TLSやVPNによる
暗号化も可能です。MQTT Version 5.0ではユーザ名が省略可能になり、認証を強化するAUTHパケットが追加されました。OASIS管理のMQTT Version 3.1.1からは、NISTのサイバーセキュリティフレームワークに準拠したガイドラインも提供されています。
パケットタイプ
MQTT Version 5.0では、15種類のパケットタイプが定義されています。
コネクションの接続・切断
CONNECT, CONNACK, DISCONNECT, AUTH, PINGREQ, PINGRESPが含まれます。クライアントはCONNECTを送信し、
サーバはCONNACKで応答します。通信終了時はDISCONNECTが送信されます。PINGREQとPINGRESPは接続維持に使用され、認証を強化するAUTHが追加されました。
メッセージの配布
PUBLISH, PUBACK, PUBREC, PUBREL, PUBCOMPが含まれます。PUBLISHでメッセージ配信を開始し、QoSレベルに応じて、PUBACK, PUBREC, PUBREL, PUBCOMPが使用されます。
トピックの購読・キャンセル
SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACKが含まれます。クライアントはSUBSCRIBEでトピックを購読し、
サーバはSUBACKで応答します。購読をキャンセルする場合は、UNSUBSCRIBEとUNSUBACKを使用します。
ブローカー
MQTTブローカーは多数存在し、それぞれに独自機能があります。
OSS
- - Mosquitto
- - RabbitMQ (Pluginが必要)
- - Apache ActiveMQ
- - MQTTnet (.NET実装)
商用
- - IBM MessageSight
- - IBM WebSphere MQ Telemetry
- - MqttDesk MQTT Client
使用事例
セキュリティの課題
MQTT
サーバの多くが
パスワード保護されていない、または
脆弱性があることが報告されています。
UTF-8文字列による
DoS攻撃や、バッファオーバーフロー攻撃の可能性も指摘されています。TLSによる保護は必須ですが、認証の重要性も認識する必要があります。
脚注
注釈
出典
参考文献
- OASIS (2019年3月7日). “MQTT Version 5.0”
- OASIS (2014年10月29日). “MQTT Version 3.1.1”
- “ISO/IEC 20922:2016”. ISO (2016年6月)
-
IBM, Eurotech (2010年). “MQTT V3.1 Protocol Specification”
-
IBM, Arcom Control Systems (2000年). “MQTT V3 Protocol Specification”
- Andy Stanford-Clark, Arlen Nipper (1999年10月22日). “MQ Integrator Pervasive Device Protocol”
- OASIS (2014年). “MQTT and the NIST Cybersecurity Framework Version 1.0”
外部リンク
- - Official site
- - Official website of Technical Committee