Calculadora de tamaño de paquete MQTT y ancho de banda
Descubre exactamente cuántos bytes ocupa un MQTT PUBLISH en la red (cabecera, topic, propiedades, payload y acuses de QoS) y cuánto envía toda tu flota al día y al mes.
Desglose del paquete PUBLISH
| Campo | Bytes |
|---|---|
| Cabecera fija (tipo de paquete + flags) | 1 |
| Remaining Length — entero de longitud variable, 1–4 bytes | 1 |
| Prefijo de longitud del topic | 2 |
| Nombre del topic (UTF-8) | 35 |
| Identificador de paquete — solo QoS 1 y 2 | 2 |
| Longitud de las propiedades — entero de longitud variable de MQTT 5 | 1 |
| Propiedades | 0 |
| Payload | 47 |
| Total PUBLISH | 89 |
| PUBACK — acuse de recibo | 4 |
| Total con acuses de recibo | 93 |
Ancho de banda de la flota
| Tráfico | Al día | Al mes |
|---|---|---|
| Dispositivos → broker PUBLISH de entrada, acks de salida | 134 MB | 4,02 GB |
| Broker → suscriptores (×1) cada entrega es un nuevo PUBLISH | 134 MB | 4,02 GB |
| Tráfico MQTT total | 268 MB | 8,04 GB |
| Un dispositivo → broker | 134 KB | 4,02 MB |
1 KB = 1.000 bytes; un mes son 30 días. Los acks se calculan en su forma mínima de 4 bytes (en MQTT 5, un ack de éxito sin propiedades puede omitir el reason code). Las entregas a suscriptores asumen el mismo topic y la misma QoS. No se incluyen las tramas TCP/IP, TLS ni WebSocket: consulta las notas más abajo.
Anatomía de un paquete MQTT PUBLISH
Todo paquete MQTT empieza con una cabecera fija: un byte con el tipo de paquete y los flags (en PUBLISH: DUP, QoS y RETAIN), seguido del Remaining Length, es decir, el número de bytes que vienen a continuación, codificado como entero de longitud variable. Los valores hasta 127 ocupan un byte; hasta 16.383, dos bytes; hasta 2.097.151, tres bytes, y hasta 268.435.455, cuatro bytes.
La cabecera variable de un PUBLISH contiene el nombre del topic, precedido de una longitud de 2 bytes, y, solo en QoS 1 y 2, un identificador de paquete de 2 bytes. En MQTT 5 también incluye la longitud de las propiedades (otro entero de longitud variable, de al menos un byte aunque no haya propiedades) y las propias propiedades, como Message Expiry Interval, Content Type o User Properties. Todo lo que viene después es payload: MQTT no le añade un prefijo de longitud, porque su tamaño se deduce del Remaining Length.
Por qué los nombres de topic importan para el ancho de banda
El nombre del topic se envía completo con cada mensaje. Un topic como factory/line-1/sensor-042/telemetry cuesta 35 bytes, a menudo más que el payload compacto de un sensor. En una flota que envía datos cada pocos segundos, acortar los topics es una de las optimizaciones más baratas que existen. MQTT 5 también ofrece topic aliases: después del primer mensaje, el cliente puede enviar un número de alias de 2 bytes (una propiedad de 3 bytes) en lugar de la cadena del topic. Aprende más sobre cómo estructurar topics en la guía de topics y comodines MQTT.
QoS y acuses de recibo
QoS 0 es «dispara y olvida»: sin identificador de paquete ni acuse de recibo. QoS 1 añade un identificador de 2 bytes y un PUBACK de 4 bytes. QoS 2 usa un intercambio en cuatro pasos (PUBLISH, PUBREC, PUBREL, PUBCOMP) que añade 14 bytes y un viaje de ida y vuelta adicional por mensaje. Los acuses se producen en cada salto: entre el publicador y el broker, y de nuevo entre el broker y cada suscriptor, usando la menor entre la QoS de publicación y la QoS de la suscripción. La guía de niveles de QoS explica cuándo compensa el coste adicional.
Lo que la calculadora no cuenta
El uso real de la red es mayor que el recuento de bytes MQTT. Cada segmento TCP lleva 40 bytes de cabeceras IPv4 + TCP (60 con IPv6), y más con opciones TCP. TLS añade una cabecera de registro, MAC/tag y relleno de unos 22–29 bytes por registro, además de unos cuantos kilobytes por cada handshake. MQTT sobre WebSockets añade una cabecera de trama de 2–14 bytes por mensaje. Además, las conexiones inactivas intercambian paquetes PINGREQ/PINGRESP de 2 bytes en cada intervalo de keep alive: consulta keep alive en MQTT.
¿Quieres verificar las cifras? Publica el mismo mensaje en el cliente MQTT online e inspecciónalo. ¿Eres nuevo en el protocolo? Empieza por qué es MQTT. Si tu broker rechaza mensajes grandes con el reason code 0x95, compara el tamaño del paquete con su ajuste de tamaño máximo de paquete.
Preguntas frecuentes sobre el tamaño de paquete
¿Cuál es el tamaño mínimo de un mensaje MQTT?
Un PUBLISH QoS 0 en MQTT 3.1.1 con un topic de un carácter y un payload vacío ocupa 5 bytes: 1 byte de cabecera fija, 1 byte de remaining length, 2 bytes de longitud del topic y 1 byte de topic. MQTT 5 añade al menos un byte para la longitud de las propiedades.
¿Cuál es el tamaño máximo de un mensaje MQTT?
El campo Remaining Length puede codificar hasta 268.435.455 bytes (unos 256 MB), así que ese es el límite del protocolo. En la práctica, los brokers fijan límites mucho más bajos (a menudo desde unos cientos de kilobytes hasta unos pocos megabytes), y en MQTT 5 clientes y brokers pueden anunciar un Maximum Packet Size.
¿Cuánto ancho de banda añaden QoS 1 o QoS 2?
QoS 1 añade un identificador de paquete de 2 bytes al PUBLISH más un PUBACK de 4 bytes, es decir, 6 bytes por mensaje. QoS 2 añade el mismo identificador más PUBREC, PUBREL y PUBCOMP, en total 14 bytes por mensaje, y un viaje de ida y vuelta adicional.
¿Incluye la sobrecarga de TLS y TCP?
No. La calculadora cuenta solo bytes MQTT. Las cabeceras TCP/IP añaden unos 40–52 bytes por segmento, TLS unos 22–29 bytes por registro y WebSockets 2–14 bytes por trama. En mensajes pequeños, esta sobrecarga puede ser mayor que el propio paquete MQTT.