XMPPには、IoTデバイスが短く頻繁にメッセージを送信するための大きなオーバーヘッドがありますか?


10

私はXMPPをIoTデバイスの潜在的な通信プロトコルとして読んでいましたが、1つのソースを読んだ後、各メッセージのオーバーヘッドを懸念している場合、それが本当に適切なプロトコルであるかどうかわかりません。

このソースは述べています:

ただし、XMPPにはいくつかの問題があり、EMBEDDED IOT PROTOCOLSにはやや望ましくありません。XMPPはXMLベースのプロトコルであるため、HTTPよりも非常に詳細であり、データオーバーヘッドが大きくなります。IOT CONNECTED DEVICEからサーバーに1バイトのデータを送信するための単一の要求/応答交換は、0.5 kBを超えます。

効率的なXML Interchange(EXI)と呼ばれるXMLエンコーディングを使用してXMPPを圧縮するドラフト仕様があります。ただし、EXIを使用しても、同じ1バイトのデータはXMPPだけから数百バイトのプロトコルオーバーヘッドを取得します。EXIは、現在利用可能な他のオプションよりも処理がはるかに難しいフォーマットです。これらの固有の問題のため、組み込みIoTアプリケーションでXMPPを使用しないことをお勧めします。

ただし、XMPP はそれ自体がIoTアプリケーションに適していると宣伝しています(ただし、オーバーヘッドが低いとは具体的には言われていません)。そのため、このような大規模で一見冗長なプロトコルがIoTデバイスに推奨/昇格されるのは奇妙に思われます。

XMPPのオーバーヘッドは、ソースが少量のデータに対して示しているのと同じくらい大きいですか?たとえば、8バイトのメッセージを送信する場合、どのくらいのオーバーヘッドがありますか?

また、(ソースで言及されているように)EXI圧縮が使用されている場合、オーバーヘッドはそれほど大きいですか?これにもいくつかの落とし穴がありますか?


4
興味深い質問です。私はXMPPに慣れていませんが、EXIでは両方のエンドポイントが同期する必要のあるスキーマを持つ必要があることに注意することが重要です。また、IoTデバイスは、8バイトのメッセージを送信するためにそれ自体が非常に複雑に見えるそのxmlをエンコードまたはデコードする必要があります。
ヘルマー

1
@Helmarは確かに、XMPPを使用すると、パケットサイズが大きくなり、計算の複雑さが失われます。
Aurora0001

1
この質問は一般的には問題ないと思いますが、「たとえば、2分ごとに8バイトのメッセージを送信する場合、どのくらいのオーバーヘッドがありますか?」->「2分」は接線方向であり、物事を誤って導く傾向があります。あなたが本当に求めているのは、8バイトのメッセージのオーバーヘッドの大きさです(1バイトのメッセージと同じように、1つのデータの場合はそうでしょう)。時間コンポーネントに関しては、これは帯域幅に依存しているだけであり、ネットワークプロトコルの使用を検討している人にとっては非常に単純な計算である必要あります。
goldilocks 16

1
@delicateLatticeworkFever関連性がないと思われる場合は編集します(私は完全には確信していませんでしたが、詳細は以下より優れていると思いました)
Aurora0001

2
はい、それは提案です。私が行ったことを読んだだけで、「それは、完全に指定されていないデバイスが特定のバイト数を送信するのにかかる時間に依存しませんか?」たとえば、メッセージが〜0.5 kBであるという答えである場合、単位に時間の要素はありません;)これは、指定されていないデバイスの帯域幅にあります。
goldilocks 2016

回答:


8

XMLは冗長であると言っても過言ではありませんが、XMLは意味論をカプセル化しているため、この冗長性がコンテンツに関してすべて「オーバーヘッド」ではないことを認識しておく必要があります。静的な構造ではなく動的な構造を強調するあらゆるプロトコルの兆候であるオーバーヘッドです。たとえば、HTMLは実際には、XMLのリラックスした形式であり、コンテンツの側面と見なすことができる動的な構造を持つコンテンツを伝達します。テーブルのコンテンツとテーブル自体を区別できますが、コンテンツが特定の関係を持つ表形式のデータであるという事実は、コンテンツに不可欠です。各セルを取り出してすべて1つの長い文字列として送信した場合、その構造とそれらの関係は失われ、情報が失われ、その内容ではないでしょうか。

いくつかのタブラデータを構成する可能性のある8バイトのメッセージを考えてみましょう。非常に静的なプロトコルを使用する場合、最低限、次のようなプロトコルを定義するだけで、追加のオーバーヘッドなしでそれを送信できます。

  • 各メッセージは正確に8バイトであるため、長さを指定したり、終了シーケンスを含める必要はありません。
  • 8バイトは常に、各セルに16ビット値が含まれる2 x 2グリッドを参照するために使用されます。

私のすべてのメッセージがまったく同じである場合、XML、HTML、またはXMPPを使用することはばかげていると見なされる可能性があります。常に同じであり、事前に決定されている構造コンポーネントの帯域幅を浪費し、両端で対応する計算時間を浪費してそれを作成および解析しています。各セルに2、3文字の2 x 2のテーブルを含む最小限の適切なHTMLページは、フォーマットとプロトコルのオーバーヘッドに対応するために、少なくとも100バイトになるでしょう。

ただし、すべてのメッセージがそうではない場合、メッセージの種類を指定することは、「ペイロード」の文字どおりの部分ではない可能性がありますが、コンテンツ的には必要なコンポーネントです。追加の2バイトだけでそれを行うことができ、より多くのダイナミズムを導入できます。

  • メッセージは可変長の0〜255バイトになり、最初のバイトは長さを示します。
  • 事前定義されたさまざまなメッセージタイプに対して(最大で)256のコードがあり、その1つが「2 x 2テーブル」で、2番目のバイトです。

現在、8バイトのテーブルコンテンツには2バイトのオーバーヘッドが必要ですが、このカスタムプロトコルを使用して送信できるメッセージの種類に関しては、はるかに幅広い可能性があります。

それでも、HTMLページやXML名前空間の仕様(またはXMPPが本質的には何である)の可能性に近いところはまだありません。

したがって、それに基づいて、ほとんどの場合、単純な8バイトのメッセージを送信する場合、XMPPはおそらくやり過ぎです。しかし、必ずしもそれほどではありません。「IOT CONNECTED DEVICEからサーバーに1バイトのデータを送信するための単一の要求/応答交換が0.5 kBを超える」という主張は、関連するRFCを一見すると、誇張されている可能性があると思われます(ただし、すべて、私はそれをちらっと見て、XMPPを実装または使用したことはありません)。あなたがそのような例を構築できることは間違いありませんが、それはおそらく最小限の例ではありません。

プロトコルはTCP指向であるため、「「jabber:client」名前空間で修飾されたXMLストリーム」の確立は、1つのことを行う場合にのみメッセージの一部と見なす必要があります。デバイスはサーバーに接続して8バイトを送信し、送信しますデータ、切断します。関係がより永続的で、IoTコンテキストにあることが多い場合は、デバイスが宛先への接続を既に確立していると想定できます。この場合、メッセージの最終的な宛先がサーバーである場合(サーバーがメッセージを渡す別のクライアントとは対照的)、プロトコルのオーバーヘッドは潜在的に最小限になります。

<message><body>8 bytes.</body></message>

わずか33バイトの「オーバーヘッド」。XMLはテキストであることをここで指摘する価値があります。そのため、メッセージがバイナリであることが多い場合は、そのデータを(たとえば、base64に)エンコードする必要があり、オーバーヘッドと計算量がさらに増えるため、あまり適切ではなくなります。要件。

つまり、最終的に:

XMPPには、IoTデバイスが短く頻繁にメッセージを送信するための大きなオーバーヘッドがありますか?

持続的な接続があり、メッセージがほとんど構造化されていない場合、私はそうは思いません。ただし、それが提供するもの(構造に関するダイナミズム)が必要ない場合は、おそらくより適切な方法論があります。

そのため、単一の中央サーバーがさまざまなデバイス間でメッセージを処理および/または依存するコンテキストがある場合、それらのデバイスのいずれかが常に単純で単純である場合でも、カプセル化できるプロトコルさまざまなメッセージがまだ役に立ちます。クライアントデバイスのリソースが限られている場合は、プロトコルの多くをハードコーディングでき、その端からの各メッセージをラップすることは非常に単純なタスクになります。私は、HTTPサーバーをデプロイする多くのIoTデバイスがそれを行うと信じています(これは、「単純なクライアント、複雑なサーバー」の逆です)。これらのサーバーは、どのような種類のHTTP要求も処理できず(事前にフォーマットされた拒否を除く)、実行する処理と送信する応答が非常に明確に定義され、焦点が絞られていますが、HTTPサーバーとして正しく機能するため、


3

まず第一に、XMLはリアルタイムメッセージをカプセル化するために、特にIMとプレゼンスをXMPPで通信するために、大規模に使用されてきたと言えるでしょう。また、XML知識を活用して、このデータ表現システムのさらに別のアプリケーション領域を見つけようとする企業もあるようです。

ただし、XMLがメッセージングシステムのすべてに対する答えであると誰もが確信しているわけではありません。たとえば、近年、XMLではなくデータをシリアル化する方法としてJSONを使用するオンラインシステムへの注目すべき変化があり、開発者の帽子を少しかければ、ネイティブからエンコード/デコードするツールは、表現(たとえば、Python、PHP、Javascript)は、XMLがそれらの答えを得るのにより多くの時間を持っていたとしても、XMLの同等のものよりもJSONよりもはるかに使いやすいようです。

XMLは、比較的複雑なテキストパーサーと、データをプログラムで抽出できるようにするためのある種の階層表現を必要とするため、コンピューターにとって扱いにくい表現です。非常に多くのテキストが含まれるため、エンコード/デコードに使用できるかなりのメモリが必要です。

多くの場合、XMLがデータの表現に多くの価値を付加していることは不明瞭に思われます。コアメッセージが深く階層的でない場合、多くのテキストのチャフを追加する必要はないように見えますが、逆に、階層が多い場合は、メッセージをデコードします。そのテキスト表現は大変な作業であり、多くのリソースを必要とします。また、テキストで表現することの利点は明確ではありません。通信システムを最初に作成してデバッグするときは、監視/デコードツール(たとえば、Wireshark)を使用して、何が問題なのかを理解するのに役立ちます。長期的には、すべてが正常に機能しており、人間がやり取りするメッセージを詳細に確認する必要はありません(コンピュータのみ)。コンピュータはバイナリ表現を好みます。テキスト表現は、展開のどの段階でも関係する誰にも利益をもたらしません。

XMLは人間が読む(そして手動で作成する)のが難しいと同時に、コンピュータのハードワークである; したがって、これはコンピュータにも人間にも適さないシステムです。

重要なことに、IoTには、効率的であることが望ましいいくつかの特別な制約があります。IoTデバイスは通常、処理能力とストレージが限られています(通常、大規模なセカンダリストレージはなく、一部のRAMとEEPROMのみ)。IoTデバイスには、可能な限り単純な通信リンクがあり、TCP / IPスタックさえもない場合があります。標準のオペレーティングシステム(Linux、Androidなど)が使用される高度なレベルでさえ、さまざまなマイクロコントローラーの設計が存在します。これにより、使いやすいXMLインターフェースを提供するために使用される既製のツールの数が制限されます。

要約すると、IoTでは、ハードウェアの制約、通信のスタイル(ブロードキャスト、データグラム、信頼性など)、通信の頻度などに応じて、ケースバイケースでデータ表現を残すほうがよいと思います。XMLは、確かにIoTの基本的な要素と考えるべきではありません。


3
  1. 何年も前に、私は使用の違いを分析しました

    従来と比較した支払いトランザクション表現(card_number、日付、時刻、terminal_id、および追加要素のリスト)の支払いネットワークのXML

    ビットマップされたISO8583

  2. XMLには大きなオーバーヘッドがあります。10000以上のノードがあるネットワークへの影響を考慮した場合、各ノードが中央ホストに毎時または毎日10以上のメッセージを送信すると、XMLが消えて、より効率的なものが必要になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.