stringtranslate.com

MQTT

MQTT (originalmente una inicial de MQ Telemetry Transport [a] ) es un protocolo de red ligero, de publicación-suscripción , de máquina a máquina para cola de mensajes / servicio de cola de mensajes . Está diseñado para conexiones con ubicaciones remotas que tienen dispositivos con limitaciones de recursos o ancho de banda de red limitado , como en el Internet de las cosas (IoT). Debe ejecutarse sobre un protocolo de transporte que proporcione conexiones bidireccionales ordenadas, sin pérdidas , típicamente TCP/IP , [1] pero posiblemente también sobre QUIC [4] . Es un estándar abierto OASIS y una recomendación ISO ( ISO/IEC 20922). ).

Historia

Andy Stanford-Clark ( IBM ) y Arlen Nipper (que entonces trabajaba para Eurotech, Inc. ) escribieron la primera versión del protocolo en 1999. [5] Se utilizó para monitorear oleoductos dentro del sistema de control industrial SCADA . [6] El objetivo era tener un protocolo que fuera eficiente en el ancho de banda, liviano y usara poca energía de la batería, porque los dispositivos se conectaban a través de un enlace satelital que, en ese momento, era extremadamente costoso. [7]

Históricamente, "MQ" en "MQTT" proviene de la línea de productos IBM MQ (entonces 'MQSeries'), donde significa "Message Queue". Sin embargo, el protocolo proporciona mensajes de publicación y suscripción (sin colas, a pesar del nombre). [8] En la especificación abierta por IBM como versión 3.1, el protocolo se denominó "Transporte de telemetría MQ". [9] [10] Las versiones posteriores publicadas por OASIS se refieren estrictamente al protocolo simplemente como "MQTT", aunque el comité técnico en sí se denomina "Comité técnico de transporte de telemetría de colas de mensajes de OASIS". [2] Desde 2013, "MQTT" no significa nada. [11] [8]

En 2013, IBM presentó MQTT v3.1 al organismo de especificación de OASIS con un estatuto que garantizaba que solo se pudieran aceptar cambios menores en la especificación. [2] Después de hacerse cargo del mantenimiento del estándar de IBM, OASIS lanzó la versión 3.1.1 el 29 de octubre de 2014. [12] [13] Se lanzó una actualización más sustancial a la versión 5 de MQTT, agregando varias características nuevas, [14] el 7 de marzo de 2019. [1]

MQTT-SN (MQTT para redes de sensores) es una variación del protocolo principal dirigido a dispositivos integrados alimentados por baterías en redes que no son TCP/IP, [15] como Zigbee . [dieciséis]

Descripción general

El protocolo MQTT define dos tipos de entidades de red: un intermediario de mensajes y varios clientes. Un intermediario MQTT es un servidor que recibe todos los mensajes de los clientes y luego los enruta a los clientes de destino apropiados. [17] Un cliente MQTT es cualquier dispositivo (desde un microcontrolador hasta un servidor completo) que ejecuta una biblioteca MQTT y se conecta a un corredor MQTT a través de una red. [18]

La información está organizada en una jerarquía de temas. Cuando un editor tiene un nuevo dato para distribuir, envía un mensaje de control con los datos al intermediario conectado. Luego, el corredor distribuye la información a los clientes que se hayan suscrito a ese tema. El editor no necesita tener ningún dato sobre el número o la ubicación de los suscriptores y los suscriptores, a su vez, no necesitan estar configurados con ningún dato sobre los editores.

Si un corredor recibe un mensaje sobre un tema para el cual no hay suscriptores actuales, el corredor descarta el mensaje a menos que el editor del mensaje lo haya designado como mensaje retenido. Un mensaje retenido es un mensaje MQTT normal con el indicador retenido establecido en verdadero. El corredor almacena el último mensaje retenido y la calidad de servicio (QoS) correspondiente para el tema seleccionado. Cada cliente que se suscribe a un patrón de tema que coincide con el tema del mensaje retenido recibe el mensaje retenido inmediatamente después de suscribirse. El intermediario almacena sólo un mensaje retenido por tema. [19] Esto permite que los nuevos suscriptores de un tema reciban el valor más actual en lugar de esperar la próxima actualización de un editor.

Cuando un cliente de publicación se conecta por primera vez al intermediario, puede configurar un mensaje predeterminado que se enviará a los suscriptores si el intermediario detecta que el cliente de publicación se ha desconectado inesperadamente del intermediario.

Los clientes sólo interactúan con un corredor, pero un sistema puede contener varios servidores de corredores que intercambian datos en función de los temas de sus suscriptores actuales.

Un mensaje de control MQTT mínimo puede tener tan solo dos bytes de datos. Un mensaje de control puede transportar casi 256 megabytes de datos si es necesario. Hay catorce tipos de mensajes definidos que se utilizan para conectar y desconectar un cliente de un corredor, publicar datos, acusar recibo de datos y supervisar la conexión entre el cliente y el servidor.

MQTT se basa en el protocolo TCP para la transmisión de datos. Se utiliza una variante, MQTT-SN, sobre otros transportes como UDP o Bluetooth.

MQTT envía credenciales de conexión en formato de texto sin formato y no incluye ninguna medida de seguridad o autenticación. Esto se puede lograr mediante el uso de TLS para cifrar y proteger la información transferida contra interceptación, modificación o falsificación.

El puerto MQTT no cifrado predeterminado es 1883. El puerto cifrado es 8883. [20]

corredor MQTT

El corredor MQTT es una pieza de software que se ejecuta en una computadora (que se ejecuta en las instalaciones o en la nube) y puede ser desarrollado por uno mismo o hospedado por un tercero. Está disponible tanto en implementaciones de código abierto como propietarias.

El corredor actúa como oficina de correos. Los clientes MQTT no utilizan una dirección de conexión directa del destinatario previsto, sino que utilizan la línea de asunto llamada "Tema". Cualquiera que se suscriba recibe una copia de todos los mensajes sobre ese tema. Varios clientes pueden suscribirse a un tema desde un único intermediario (capacidad de uno a muchos) y un único cliente puede registrar suscripciones a temas con varios intermediarios (varios a uno).

Cada cliente puede producir y recibir datos mediante publicación y suscripción, es decir, los dispositivos pueden publicar datos de sensores y aún poder recibir información de configuración o comandos de control (MQTT es un protocolo de comunicación bidireccional). Esto ayuda tanto a compartir datos como a administrar y controlar dispositivos. Un cliente no puede transmitir los mismos datos a una variedad de temas y debe publicar varios mensajes al corredor, cada uno con un solo tema.

Con la arquitectura del intermediario MQTT, los dispositivos cliente y la aplicación del servidor se desacoplan. De esta manera, los clientes desconocen la información de los demás. MQTT, si está configurado para ello, puede utilizar cifrado TLS con conexiones protegidas con certificado, nombre de usuario y contraseña. Opcionalmente, la conexión puede requerir certificación, en forma de un archivo de certificado que proporciona un cliente y debe coincidir con la copia del servidor.

En caso de falla, el software del corredor y los clientes pueden transferirlo automáticamente a un corredor de respaldo automático/redundante. Los agentes de respaldo también se pueden configurar para compartir la carga de clientes en múltiples servidores en el sitio, en la nube o una combinación de estos.

El corredor puede admitir tanto MQTT estándar como MQTT para especificaciones compatibles, como Sparkplug. [21] Esto se puede hacer con el mismo servidor, al mismo tiempo y con los mismos niveles de seguridad.

El corredor realiza un seguimiento de toda la información de la sesión a medida que el dispositivo se enciende y apaga, en una función llamada "sesiones persistentes". En este estado, un corredor almacenará información de conexión para cada cliente, los temas a los que cada cliente se ha suscrito y cualquier mensaje para un tema con una QoS de 1 o 2. [22]

Las principales ventajas del corredor MQTT son:

  1. Elimina conexiones de clientes vulnerables e inseguras, si se configuran para
  2. Puede escalar fácilmente desde un solo dispositivo a miles
  3. Administra y rastrea todos los estados de conexión del cliente, incluidas las credenciales y certificados de seguridad, si está configurado para
  4. Reducción de la tensión de la red sin comprometer la seguridad, si está configurado para (red celular o satelital)

Tipos de mensajes

Conectar

Ejemplo de una conexión MQTT (QoS 0) con conexión, publicación/suscripción y desconexión. El primer mensaje del cliente B se almacena debido al indicador de retención.

Espera a que se establezca una conexión con el servidor y crea un enlace entre los nodos.

Desconectar

Espera a que el cliente MQTT finalice cualquier trabajo que deba realizar y a que se desconecte la sesión TCP/IP .

Publicar

Regresa inmediatamente al hilo de la aplicación después de pasar la solicitud al cliente MQTT.

Versión 5.0

En 2019, OASIS lanzó el estándar oficial MQTT 5.0. [1] La versión 5.0 incluye las siguientes características nuevas importantes: [23]

MQTT 5.0 también admite conexiones MQTT a través del protocolo de transporte QUIC . MQTT sobre QUIC ofrece un rendimiento mejorado al reducir la cantidad de intercambios durante el proceso de conexión, reducir la latencia general y ofrecer un mejor manejo de la congestión y la conmutación de la red. [24]

Calidad de servicio

Cada conexión al intermediario puede especificar una medida de QoS. [25] Se clasifican en orden creciente de gastos generales:

Este campo no afecta el manejo de las transmisiones de datos TCP subyacentes; solo se usa entre remitentes y receptores MQTT.

Seguridad

La seguridad del protocolo MQTT fue comprometida [26] en 2020 por investigadores italianos, ejecutando ataques DoS lentos en dicho protocolo (ver CVE-2020-13849).

Agrupación

La agrupación en clústeres MQTT es una técnica empleada para garantizar alta disponibilidad, tolerancia a fallas y escalabilidad en implementaciones MQTT. [27] Como protocolo de mensajería eficiente y liviano, la agrupación en clústeres MQTT permite la creación de una red resistente de nodos intermediarios interconectados, lo que garantiza una entrega de mensajes continua y confiable incluso ante fallas de hardware o interrupciones de la red.

Implementación de agrupación en clústeres de EMQX [28]

EMQX está escrito en Erlang . Antes de la versión 5.0, en un grupo de corredores MQTT de la comunidad EMQX [29] , cada nodo de corredor está conectado entre sí. Para cada nodo, hay una base de datos Mnesia [30] , una base de datos incorporada para Erlang , para almacenar datos importantes. Uno de los datos más importantes almacenados en la base de datos es el mapeo de los temas a las direcciones IP de los suscriptores. Este mapeo se denomina tabla de suscripción. Otra tabla llamada tabla de enrutamiento contiene la asignación de temas a las direcciones IP del nodo que administra estos temas. Ambas tablas garantizan que cada mensaje enviado al clúster se reenviará al suscriptor correcto. Cuando se envía un mensaje con un tema específico a un nodo aleatorio en el clúster, el nodo verificará la tabla de enrutamiento para ver qué nodo administra este tema. Luego reenviará el masaje al nodo administrador. Después de que el nodo administrador reciba el mensaje, verificará la tabla de suscripción para ver qué cliente se suscribió a este tema y enviará el mensaje a ese cliente.

Sin embargo, existen algunas limitaciones de la base de datos Mnesia [31] : es vulnerable a problemas de red, cuyo resultado es un cerebro dividido . Además, la limitación de tamaño del clúster es de siete nodos, lo que no puede garantizar la escalabilidad. Para solucionar estos problemas, en la versión 5 actual, Mnesia se ha mejorado a Mria. Mria no es una base de datos completamente diferente. En cambio, deriva de Mnesia con algunas mejoras. Además de la base de datos, la función de los nodos en el clúster se divide en dos: núcleo y réplica. Los nodos centrales todavía están conectados entre sí, pero cada nodo central es responsable de varios nodos de réplica. Cada nodo de réplica posee una replicación completa de datos de su nodo central y solo se conecta a él. En el clúster, sólo los nodos centrales pueden escribir datos en la base de datos y leer datos de ella. Por el contrario, los nodos de réplica solo pueden leer datos. Esta arquitectura no solo disminuye el riesgo de situaciones de cerebro dividido al usar la base de datos Mria, sino que también mejora la escalabilidad del clúster al configurar los nodos de réplica para aliviar la presión de los nodos centrales.

EMQX Enterprise, la versión paga de EMQX Community, tiene una arquitectura de clústeres ligeramente diferente. Una de las diferencias clave es que, en lugar de Mria, para lograr una mejor persistencia de los datos , EMQX Enterprise utiliza RocksDB como base de datos [32] .

Ver también

Notas

  1. ^ MQ significa "colas de mensajes", como se deriva del nombre del producto IBM MQ .

Referencias

  1. ^ abcde "MQTT Versión 5.0". OÁSIS . 2019-03-07 . Consultado el 15 de diciembre de 2020 .
  2. ^ abc "Estatuto del Comité Técnico de Transporte de Telemetría de colas de mensajes (MQTT) de OASIS". OÁSIS . Consultado el 15 de diciembre de 2020 .
  3. ^ "Subcomité MQTT SN". OÁSIS . Consultado el 15 de diciembre de 2020 .
  4. ^ "MQTT sobre QUIC: protocolo estándar de IoT de próxima generación". EMQ. 2022-08-24.
  5. ^ "Fiesta del décimo cumpleaños". MQTT.org . Julio de 2009. Archivado desde el original el 15 de marzo de 2015 . Consultado el 25 de abril de 2015 .
  6. ^ "Transcripción del podcast de IBM" (PDF) . IBM.com . Noviembre de 2011 . Consultado el 7 de enero de 2021 .
  7. ^ "Introducción a MQTT". ColmenaMQ. 2020-04-24.
  8. ^ Equipo ab, The HiveMQ. "Presentación del protocolo MQTT - MQTT Essentials: Parte 1". www.hivemq.com . Consultado el 26 de septiembre de 2021 .
  9. ^ "Diferencias entre MQTT v3.1 y MQTT v3.1.1". TC de transporte de telemetría de colas de mensajes (MQTT) de OASIS. 12 de febrero de 2015 . Consultado el 19 de agosto de 2021 .
  10. ^ "Especificación del protocolo MQTT V3.1". Eurotech, Corporación Internacional de Máquinas de Negocios (IBM). 2010 . Consultado el 15 de diciembre de 2020 .
  11. ^ "Acta del Comité Técnico de OASIS MQTT de la reunión del jueves 25 de abril de 2013 Teleconferencia" (PDF) .
  12. ^ "MQTT Versión 3.1.1". 2014-10-29 . Consultado el 16 de diciembre de 2020 .
  13. ^ "Seis hechos por los que vale la pena actualizar a la nueva versión MQTT 3.1.1". 2014-10-30 . Consultado el 16 de diciembre de 2020 .
  14. ^ "Diferencias entre 3.1.1 y 5.0". GitHub .
  15. ^ Stanford-Clark, Andy ; Hong Linh Truong (14 de noviembre de 2013). "Especificación del protocolo MQTT para redes de sensores (MQTT-SN) versión 1.2" (PDF) . oasis-open.org . Comité Técnico de Transporte de Telemetría de Cola de Mensajes (MQTT) de OASIS. pag. 28 . Consultado el 15 de diciembre de 2020 .
  16. ^ "Introducción a MQTT-SN (MQTT para redes de sensores)". 25 de enero de 2017 . Consultado el 16 de septiembre de 2020 .
  17. ^ Yuan, Michael. "Conociendo MQTT". Desarrollador IBM . Consultado el 13 de octubre de 2019 .
  18. ^ "Cliente, corredor/servidor y establecimiento de conexión - MQTT Essentials: Parte 3". hivemq.com . Consultado el 13 de octubre de 2019 .
  19. ^ "Mensajes retenidos: conceptos básicos de MQTT: parte 8". hivemq.com . Consultado el 13 de octubre de 2019 .
  20. ^ "Preguntas frecuentes: preguntas frecuentes | MQTT" . Consultado el 19 de marzo de 2020 .
  21. ^ "Bujía MQTT/Tahu". www.cirrus-link.com . Consultado el 5 de noviembre de 2019 .
  22. ^ Hacer frente, Stephen (2020). MQTT para principiantes completos . pag. 17.ISBN _ 9798779030762.
  23. ^ "¿Qué es MQTT? Definición y detalles". www.paessler.com . Consultado el 9 de junio de 2020 .
  24. ^ "Protocolo QUIC: características, casos de uso e impacto de IoT/IoV". www.emqx.com . Consultado el 13 de junio de 2023 .
  25. ^ "IBM Knowledge Center - IBM MQ - Uso de MQTT con IBM Integration Bus - Calidad de servicio y gestión de conexiones". www.ibm.com . Consultado el 30 de enero de 2018 .
  26. ^ Vaccari, I., Aiello, M. y Cambiaso, E. (2020). SlowITe, un novedoso ataque de denegación de servicio que afecta a MQTT. Sensores, 20(10), 2932.
  27. ^ "Clúster MQTT de alta disponibilidad: Bevywise Networks". www.bevywise.com . Consultado el 22 de diciembre de 2023 .
  28. ^ https://www.emqx.io/docs/en/latest/
  29. ^ https://www.emqx.io/docs/en/latest/deploy/cluster/introduction.html
  30. ^ "Pian: otro servidor web más: Vinoski, Steve".
  31. ^ https://www.emqx.io/docs/en/latest/design/clustering.html#routing-table-replication
  32. ^ https://www.emqx.com/en/blog/mqtt-persistence-based-on-rocksdb
  33. ^ "API y protocolos". Consuelo . Consultado el 8 de abril de 2021 .
  34. ^ "Soporte MQTT 5.0 🎉". Comunidad de consuelo . 4 de enero de 2021 . Consultado el 8 de abril de 2021 .

enlaces externos