XMPP ha un grande overhead per i dispositivi IoT che inviano messaggi brevi e frequenti?


10

Ho letto su XMPP come un potenziale protocollo di comunicazione per i dispositivi IoT ma, dopo aver letto una fonte, non sono sicuro che sia davvero un protocollo appropriato se sei preoccupato dell'overhead per ogni messaggio.

Questa fonte afferma:

Tuttavia, XMPP presenta una serie di problemi che lo rendono in qualche modo indesiderabile per PROTOCOLLI IOT EMBEDDED. Essendo un protocollo basato su XML, XMPP è molto dettagliato, anche più di HTTP, e ha un pesante sovraccarico di dati. Un singolo scambio di richiesta / risposta per inviare un byte di dati da un IOT CONNECTED DEVICE al server è superiore a 0,5 kB.

Esiste una bozza di specifica che comprime XMPP usando una codifica XML chiamata efficiente XML Interchange (EXI). Ma anche con EXI, lo stesso byte di dati ottiene centinaia di byte di overhead di protocollo dal solo XMPP. EXI è anche un formato molto più difficile da elaborare rispetto ad altre opzioni ora disponibili. A causa di questi problemi intrinseci, si consiglia generalmente di evitare l'uso di XMPP in applicazioni IoT integrate.

Tuttavia, XMPP si promuove come adatto per le applicazioni IoT (anche se non dice specificamente che è a basso costo ambientale), quindi sembra strano che un protocollo così grande, apparentemente dettagliato sia raccomandato / promosso per i dispositivi IoT.

Il sovraccarico di XMPP è davvero grande quanto la fonte suggerisce per piccole quantità di dati? Ad esempio, quanto overhead ci sarebbe quando si invia un messaggio a 8 byte?

Inoltre, l'overhead è così eccezionale se viene utilizzata la compressione EXI (come indicato nella fonte)? Ciò comporterebbe anche alcune insidie?


4
Domanda interessante. Anche se non ho familiarità con XMPP, è importante notare che EXI richiede che entrambi gli endpoint abbiano uno schema che deve essere sincronizzato. Inoltre, il dispositivo IoT deve codificare / decodificare quel file XML che sembra di per sé terribilmente complesso per l'invio di messaggi a 8 byte.
Helmar

1
@Helmar infatti, con XMPP sembra che ciò che guadagni in termini di dimensioni del pacchetto, perdi nella complessità computazionale.
Aurora0001

1
Penso che questa domanda generalmente vada bene ma: "Ad esempio, quanto sovraccarico ci sarebbe quando si invia un messaggio a 8 byte ogni 2 minuti?" -> I "due minuti" sono tangenziali e inclini a portare fuori strada le cose. Quello che stai veramente chiedendo è quanto overhead avrebbe un messaggio da 8 byte (immagino, se si tratta di un solo dato, lo stesso di un messaggio da 1 byte). In relazione a una componente temporale, ciò dipende semplicemente dalla larghezza di banda e per chiunque contempli l'uso di un protocollo di rete che deve essere un semplice calcolo matematico.
Riccioli d'oro

1
@delicateLatticeworkFever Lo modificherò se non pensi che sia rilevante (non ero del tutto convinto ma pensavo che più dettagli fossero meglio di meno)
Aurora0001

2
È un suggerimento, sì. Solo leggendo che ho detto "Non dipende da quanto tempo impiega un dispositivo completamente non specificato a inviare un determinato numero di byte?" Ad esempio, se la risposta è che il messaggio è ~ 0,5 kB, non c'è alcun elemento di tempo nelle unità;) Questo è nella larghezza di banda del dispositivo non specificato.
Riccioli d'oro

Risposte:


8

Mentre è giusto dire che XML è prolisso, questo dovrebbe essere mitigato dalla consapevolezza che questa verbosità non è tutta "ambientale" in relazione al contenuto poiché incapsula la semantica; è il sovraccarico che è sintomatico di qualsiasi protocollo che enfatizza una struttura dinamica anziché statica. Ad esempio, HTML è in realtà una forma rilassata di XML che trasmette contenuto con una struttura dinamica, struttura che potrebbe essere considerata un aspetto del contenuto. È possibile distinguere il contenuto di una tabella dalla tabella stessa, ma il fatto che il contenuto sia costituito da dati tabulari con relazioni specifiche è parte integrante del contenuto; se prendessi solo ogni cella e le trasmettessi tutte come una lunga stringa, quella struttura e quelle relazioni sarebbero sparite, e quindi avrei perso informazioni e non è quel contenuto?

Consideriamo un messaggio a 8 byte che potrebbe costituire alcuni dati tablari. Se utilizzo un protocollo molto statico, potrei, minimamente, trasmetterlo senza costi aggiuntivi semplicemente definendo un protocollo come questo:

  • Ogni messaggio ha esattamente 8 byte, quindi non è necessario indicare la lunghezza o includere una sequenza finale.
  • Gli otto byte vengono sempre presi come riferimento a una griglia 2 x 2 in cui ogni cella contiene un valore di 16 bit.

Se tutti i miei messaggi sono esattamente così, usare XML, HTML o XMPP potrebbe essere considerato stupido - sto sprecando larghezza di banda su componenti strutturali che sono sempre uguali e predeterminati, e sto sprecando il tempo di calcolo corrispondente ad entrambe le estremità per crearlo e analizzarlo. Una pagina HTML corretta e minima che contiene solo una tabella 2 x 2 con un paio di caratteri in ogni cella sarà probabilmente di almeno 100 byte per adattarsi al sovraccarico di formattazione e protocollo.

Tuttavia, se non tutti i miei messaggi sono esattamente così, allora specificare quale tipo di messaggio potrebbe non essere una parte letterale del "payload" ma è un componente necessario, dal punto di vista del contenuto. Potrei farlo con solo due byte extra e introdurre molto più dinamismo:

  • I messaggi ora hanno una lunghezza variabile, 0-255 byte e il primo byte indica la lunghezza.
  • Esistono (fino a) 256 codici per diversi tipi di messaggi predefiniti, uno dei quali è "tabella 2 x 2", ovvero il secondo byte.

Ora i miei 8 byte di contenuto della tabella richiedono 2 byte di sovraccarico, ma esiste una gamma molto più ampia di possibilità in termini di quali tipi di messaggi possono essere inviati con questo protocollo personalizzato.

Non è ancora vicino alle possibilità di una pagina HTML o di una specifica dello spazio dei nomi XML (o di un suo insieme, che è essenzialmente XMPP ).

Quindi, in base a ciò, se principalmente quello che stai facendo è l'invio di semplici messaggi a 8 byte, XMPP è probabilmente eccessivo. Tuttavia, non necessariamente così tanto. L'affermazione secondo cui "un singolo scambio di richieste / risposte per inviare un byte di dati da un IOT CONNECTED DEVICE al server è superiore a 0,5 kB" mi sembra, dando un'occhiata al RFC pertinente , essere una potenziale esagerazione (ma nb, tutto L'ho fatto dare un'occhiata, non ho mai implementato o usato XMPP). Non dubito che potresti costruirne un esempio, ma probabilmente non è un esempio minimo .

Poiché il protocollo è orientato al TCP, la creazione di "un flusso XML qualificato dallo spazio dei nomi" jabber: client "deve essere considerata parte del messaggio solo se stiamo facendo una cosa sola: i dispositivi contatta un server a cui inviare 8 byte, invia i dati, si disconnette. Se la relazione è più persistente, come spesso accadrebbe in un contesto IoT, allora possiamo supporre che il dispositivo abbia già una connessione stabilita con la destinazione. In questo caso, se la destinazione finale del messaggio è il server (al contrario di un altro client a cui passerà il messaggio), l'overhead del protocollo è potenzialmente minimo.

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

Un misero 33 byte di "sovraccarico". Vale la pena sottolineare che XML è testo e quindi se i tuoi messaggi sono spesso binari, diventerà molto meno appropriato, perché quei dati devono essere codificati (ad esempio, su base64 ), che aggiunge ulteriori costi generali e computazionali requisiti.

Quindi, in definitiva:

XMPP ha un grande overhead per i dispositivi IoT che inviano messaggi brevi e frequenti?

Se esiste una connessione persistente e i messaggi sono in gran parte non strutturati, non credo. Tuttavia, se non hai bisogno di ciò che offre (il dinamismo per quanto riguarda la struttura), allora ci sono probabilmente metodologie più appropriate.

Persegui ciò, se abbiamo un contesto in cui un singolo server centrale sta elaborando e / o facendo affidamento sui messaggi tra una varietà di dispositivi, anche se ciò che uno di questi dispositivi sta facendo può essere sempre semplice e diretto, un protocollo che può incapsulare un varietà di messaggi sarebbe comunque utile. Se un dispositivo client ha risorse limitate, possiamo codificare gran parte del protocollo e avvolgere ogni messaggio da quel fine diventa un compito molto semplice; Credo che molti dispositivi IoT che distribuiscono server HTTP lo facciano (che è l'inverso di "client semplici, server complessi"). Questi server non sono in grado di gestire alcun tipo di richiesta HTTP (tranne che per il rifiuto preformattato) e hanno un insieme ben definito e focalizzato di cose che cosa faranno e risposte che invieranno, ma dal momento che funzionano comunque correttamente come server HTTP,


3

Prima di tutto, dovrei dire che XML è stato usato per incapsulare messaggi in tempo reale con un certo successo, e su larga scala, in particolare per comunicare IM e presenza in XMPP. Sembrano esserci anche alcune aziende che intendono sfruttare le proprie conoscenze XML per cercare di trovare un'altra area di applicazione per questo sistema di rappresentazione dei dati.

Tuttavia, non tutti sono convinti che XML sia la risposta a tutto nei sistemi di messaggistica. Ad esempio, negli ultimi anni c'è stato un notevole spostamento verso i sistemi online che utilizzano JSON come un modo per serializzare i dati piuttosto che XML, e se avessi messo il mio cappello da sviluppatore per un momento, direi che gli strumenti per codificare / decodificare da nativi la rappresentazione (ad esempio in Python, PHP, Javascript) sembra molto più facile da usare rispetto a JSON rispetto ai loro equivalenti per XML, anche se XML ha avuto più tempo per ottenere quelle risposte giuste.

L'XML è una rappresentazione difficile da gestire per i computer, in quanto necessita di un parser di testo relativamente complesso e quindi una sorta di rappresentazione gerarchica per consentire l'estrazione dei suoi dati in un programma. Poiché è coinvolto così tanto testo, è necessario disporre di un po 'di memoria disponibile per la codifica / decodifica.

Spesso non è chiaro che XML stia aggiungendo molto valore alla rappresentazione dei dati: se il messaggio principale non è profondamente gerarchico, l'aggiunta di molte chiacchiere testuali sembra superflua, ma paradossalmente se c'è molta gerarchia, decodifica il messaggio da la sua rappresentazione testuale sarà un duro lavoro e avrà bisogno di molte risorse. Inoltre, il vantaggio di rappresentare nel testo non mi è chiaro: quando scriviamo ed eseguiamo il debug dei sistemi di comunicazione per la prima volta, è comune utilizzare strumenti di monitoraggio / decodifica (ad esempio Wireshark) per aiutarci a capire cosa non va. A lungo termine, tutto funziona bene e nessun essere umano dovrà guardare in dettaglio i messaggi che vanno avanti e indietro (solo computer). I computer preferiscono la rappresentazione binaria. La rappresentazione testuale non giova a nessuno coinvolto in nessuna fase di spiegamento.

L'XML è difficile per gli umani da leggere (e costruire manualmente) mentre è allo stesso tempo un duro lavoro per i computer; È quindi un sistema che non è né adatto ai computer né adatto all'uomo.

È importante sottolineare che l'IoT ha alcuni vincoli speciali che rendono desiderabile essere efficiente. I dispositivi IoT avranno in genere una potenza di elaborazione e uno spazio di archiviazione limitati (di solito non c'è spazio di archiviazione secondario su larga scala, solo alcuni RAM ed EEPROM). Un dispositivo IoT potrebbe avere i collegamenti di comunicazione più semplici possibili, forse nemmeno uno stack TCP / IP. Ci sarà un'ampia varietà di progetti di microcontrollori, nemmeno a livello di sofisticazione in cui un sistema operativo standard (ad esempio Linux, Android) sarebbe in uso; questo limita il numero di strumenti standard che saranno disponibili offrendo interfacce XML facili da usare.

In sintesi, sospetto che con l'IoT sia meglio lasciare la rappresentazione dei dati caso per caso, a seconda dei vincoli hardware, dello stile di comunicazione (ad es. Trasmissione, datagramma, affidabilità, ecc.), Frequenza di comunicazione e così via. L'XML non dovrebbe certamente essere considerato una condizione sine qua non per l'IoT.


3
  1. Molti anni fa ho analizzato la differenza per l'utilizzo

    XML nella rete di pagamento per la rappresentazione della transazione di pagamento (card_number, data, ora, terminal_id ed elenco di elementi aggiuntivi) rispetto al tradizionale

    bit-MAPED ISO8583

  2. XML ha un enorme sovraccarico. Se si considera l'impatto nelle reti con oltre 10000 nodi, ciascuno dei quali invia più di 10 messaggi all'ora / ogni giorno all'host centrale, l'XML si spegne e occorre davvero qualcosa di più efficiente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.