TCP、UDP、およびMQTTの私の経験に関するいくつかの考え、および確認する追加のリソース。
UDPを使用すると、1つのネットワークノード(クライアント)上のアプリケーションが、送信されたUDPメッセージの一部しか表示しないというサイレント障害の問題が発生しました。ネットワークトラフィックが失敗する理由は多すぎます。UDPの問題は、パケットのプロデューサーとパケットのコンシューマーとの間のネットワークパス内のノードのいずれかが正当である場合は常に、パケットがほとんど破棄される可能性があることです。ウィキペディアのトピック「パケット損失」を参照してください。
問題は、現在のネットワークコンテキストでの損失率はどの程度かということです。したがって、これがLANまたはサブネットワーク内での通信である場合、損失率は低くなる可能性があります。WANまたはインターネット全体で、損失率は非常に高くなる可能性があります。UDPパケットはさまざまな理由で破棄されてルーティングされますが、ネットワークの状態により、そのホップカウントは減少します。説明責任のない大きな空洞にパケットを送信すると、サイレント障害の可能性が残ります。
あなたの場合は、ACKを受信せずにタイムアウト後に再送信する単純なACKで十分だと思われます。
維持されたTCP接続を介してXMLメッセージを送信しましたが、うまくいきました。完全なメッセージをそれぞれバッファーでアプリケーション層に配信して処理する層がありました。XMLを使用してメッセージをパッケージ化し、メッセージの開始用のXML開始タグと、メッセージ全体がいつ受信されたかを知るためのXML終了タグを付けました。
TCPには、パケットの順次順序、繰り返しなし、接続されたトランスポートメカニズムであることなど、いくつかの機能があります。つまり、検出に時間がかかる場合がありますが、もう一方の端が消えたかどうかがわかります。接続と切断により遅延が発生する可能性がありますが、通常の状況では厄介ではありませんが、ネットワークの状況によってTCPスループットが低下する可能性があります。
MQTTは、ネットワークトランスポート層(通常はTCP)によってトランスポートされるプロトコルです。MQTTはパブリッシュ/サブスクライブモデルを使用するため、メッセージの保存はありません。そのため、パブリッシャーがメッセージをパブリッシュするときに、サブスクライバーがその時点で接続されていない場合は、接続してもメッセージは表示されません。MQTTはほぼリアルタイムですが、それが頭字語のテレメトリ部分のすべてです。小さなメッセージにはMQTTが好きで、Mosquittoを使用してMQTTを介してJSONペイロードでいくつかの実験を行っています。この記事を参照してください。MQTTとサービス品質の概要を含む、Mosquitto(MQTT)による信頼性の高いメッセージ配信。また、サンプルアプリケーションIoT – MQTT PublishおよびSubscriber C Codeを含むリソースへのリンクを含むこの簡単な記事を参照してください。
メッセージを格納するためにサブスクライバーでJSONテキストとSQLite3データベースを使用したMQTTでの私の実験は、ソースがCであり、非常に乱雑ですが、https://github.com/RichardChambers/raspberrypi/tree/master/mqttにあります。
13分のビデオ#144インターネットプロトコル:CoAP対MQTT、ネットワークスニッフィング、IKEA Tradfri Hackingの準備を示します。これは、CoAP(Constrained Application Protocol)に関する興味深い記事です。CoAPはIoTの「最新の」プロトコルです。CoAPのこの合計があります:
アーリーアダプターは、制約付きアプリケーションプロトコルが制約付きネットワークおよびデバイスに対して非常に適切に機能することに同意します。あまり知られていないもの:「非常に輻輳したワイヤレスネットワーク-Wi-Fiまたはセルラー-MQAPなどの伝送制御プロトコルベース(TCP)プロトコルがハンドシェイクを完了できない場合でも、CoAPは引き続き機能します。 「バーミラードは言った。
これは、他のほとんどのIoTプロトコルとは異なり、CoAPはUDPに基づいて構築されているためです。つまり、TCPで発生するようなプロトコルハンドシェイクやエラー修正はありません。「CoAPはHTTPほど信頼性が高くない、またはMQTTのようなメッセージの配信を保証しない可能性がありますが、非常に高速です」とMatthieuは述べています。「一部のメッセージが受信されなくても問題ない場合は、同じ時間内にさらに多くのメッセージを送信できます。」
AMQP、STOMP、CBORなど、他にもいくつか見られるかもしれません。CBOR標準のWebサイト、およびこの論文、CBORプロトコルの実装と評価を参照してください。この記事「メッセージングプロトコルの選択:AMQP、MQTT、またはSTOMP」を参照してください。これは、AMQP、MQTT、およびSTOMPを比較対照し、最後にRabitMQブローカーに関する注記を記載しています。
うまくいけば、これは多くの人があなたのユースケースごとにそこからプロトコルスープをナビゲートし始めるのを助けることができます。企業ではさまざまなニーズを持つ多くのアプリケーションを使用することが一般的であるため、異なるアプリケーション全体で3つのブローカーすべてが必要になる可能性は確かにあります。RabbitMQのような堅固なマルチプロトコルポリグロットブローカーが登場するのは、STOMP、MQTT、またはAMQPを送信して他のブローカーの1つを取得できるためです。これらのプロトコルのいずれかでロックインする必要はありません。3つすべてがRabbitMQブローカーでサポートされているため、アプリケーション間の相互運用性にとって理想的な選択肢です。プラグインアーキテクチャにより、RabbitMQは、これらのプロトコルの追加または更新されたバージョンを将来サポートするように進化することもできます。
約60枚のスライドのこのスライド共有パッケージは、信頼性と堅牢性に対するニーズが異なる2つの異なるIoTグループ、コンシューマーとインダストリアルのニーズを検討する4つの異なるIoTプロトコルを比較対照します。IoTに適したメッセージング標準は何ですか?。
Ack
ingは必要ありません。UDPの上で信頼性に取り組むことはあまり意味がないと思います。それがTCPの目的です。