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). ).
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]
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]
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:
Espera a que se establezca una conexión con el servidor y crea un enlace entre los nodos.
Espera a que el cliente MQTT finalice cualquier trabajo que deba realizar y a que se desconecte la sesión TCP/IP .
Regresa inmediatamente al hilo de la aplicación después de pasar la solicitud al cliente MQTT.
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]
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.
La seguridad del protocolo MQTT fue comprometida [26] en 2020 por investigadores italianos, ejecutando ataques DoS lentos en dicho protocolo (ver CVE-2020-13849).
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.
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] .