Calculadora de tamanho de pacote MQTT e banda
Veja exatamente quantos bytes um MQTT PUBLISH ocupa na rede — cabeçalho, tópico, propriedades, payload e confirmações de QoS — e quanto sua frota inteira envia por dia e por mês.
Detalhamento do pacote PUBLISH
| Campo | Bytes |
|---|---|
| Cabeçalho fixo (tipo de pacote + flags) | 1 |
| Remaining Length — variable byte integer, 1–4 bytes | 1 |
| Prefixo de comprimento do tópico | 2 |
| Nome do tópico (UTF-8) | 35 |
| Identificador de pacote — só QoS 1 e 2 | 2 |
| Comprimento das propriedades — variable byte integer do MQTT 5 | 1 |
| Propriedades | 0 |
| Payload | 47 |
| Total do PUBLISH | 89 |
| PUBACK — confirmação | 4 |
| Total com confirmações | 93 |
Banda da frota
| Tráfego | Por dia | Por mês |
|---|---|---|
| Dispositivos → broker PUBLISH de entrada, acks de saída | 134 MB | 4,02 GB |
| Broker → assinantes (×1) cada entrega é um novo PUBLISH | 134 MB | 4,02 GB |
| Tráfego MQTT total | 268 MB | 8,04 GB |
| Um dispositivo → broker | 134 KB | 4,02 MB |
1 KB = 1.000 bytes; um mês tem 30 dias. Os acks consideram a forma mínima de 4 bytes (no MQTT 5, um ack de sucesso sem propriedades pode omitir o reason code). As entregas aos assinantes consideram o mesmo tópico e QoS. Framing de TCP/IP, TLS e WebSocket não está incluído — veja as notas abaixo.
Anatomia de um pacote MQTT PUBLISH
Todo pacote MQTT começa com um cabeçalho fixo: um byte com o tipo de pacote e as flags (no PUBLISH: DUP, QoS e RETAIN), seguido do Remaining Length — o número de bytes que vêm depois, codificado como variable byte integer. Valores até 127 ocupam um byte, até 16.383 dois bytes, até 2.097.151 três bytes e até 268.435.455 quatro bytes.
O cabeçalho variável de um PUBLISH contém o nome do tópico, precedido de um prefixo de comprimento de 2 bytes, e — só para QoS 1 e 2 — um identificador de pacote de 2 bytes. No MQTT 5 ele também traz o comprimento das propriedades (outro variable byte integer, com pelo menos um byte mesmo quando não há propriedades) e as próprias propriedades, como Message Expiry Interval, Content Type ou User Properties. Tudo o que vem depois é payload: o MQTT não adiciona um prefixo de comprimento a ele, porque seu tamanho é deduzido do Remaining Length.
Por que nomes de tópicos importam para a banda
O nome do tópico é enviado inteiro em cada mensagem. Um tópico como factory/line-1/sensor-042/telemetry custa 35 bytes — muitas vezes mais do que um payload compacto de sensor. Para uma frota que envia dados a cada poucos segundos, encurtar tópicos é uma das otimizações mais baratas que existem. O MQTT 5 também oferece topic aliases: depois da primeira mensagem, o cliente pode enviar um número de alias de 2 bytes (uma propriedade de 3 bytes) em vez da string do tópico. Saiba mais sobre como estruturar tópicos no guia de tópicos e curingas do MQTT.
QoS e confirmações
QoS 0 é “dispare e esqueça”: sem identificador de pacote e sem confirmação. QoS 1 adiciona um identificador de 2 bytes e um PUBACK de 4 bytes. QoS 2 usa um handshake em quatro etapas — PUBLISH, PUBREC, PUBREL, PUBCOMP — que adiciona 14 bytes e uma ida e volta extra completa por mensagem. As confirmações acontecem em cada salto: entre o publicador e o broker, e de novo entre o broker e cada assinante, usando o menor entre o QoS da publicação e o QoS da assinatura. O guia de níveis de QoS explica quando o custo extra compensa.
O que a calculadora não conta
O uso real da rede é maior do que a contagem de bytes do MQTT. Cada segmento TCP carrega 40 bytes de cabeçalhos IPv4 + TCP (60 com IPv6), e mais com opções TCP. O TLS adiciona cabeçalho de registro, MAC/tag e padding de aproximadamente 22–29 bytes por registro, além de alguns kilobytes a cada handshake. MQTT sobre WebSockets adiciona um cabeçalho de frame de 2–14 bytes por mensagem. Além disso, conexões ociosas trocam pacotes PINGREQ/PINGRESP de 2 bytes a cada intervalo de keep alive — veja keep alive do MQTT.
Quer conferir os números? Publique a mesma mensagem no cliente MQTT online e inspecione-a. É novo no protocolo? Comece por o que é MQTT. Se o seu broker rejeita mensagens grandes com o reason code 0x95, compare o tamanho do pacote com a configuração de tamanho máximo de pacote dele.
Perguntas frequentes sobre tamanho de pacote
Qual é o tamanho mínimo de uma mensagem MQTT?
Um PUBLISH QoS 0 no MQTT 3.1.1 com tópico de um caractere e payload vazio tem 5 bytes: 1 byte de cabeçalho fixo, 1 byte de remaining length, 2 bytes de comprimento do tópico e 1 byte de tópico. O MQTT 5 adiciona pelo menos um byte para o comprimento das propriedades.
Qual é o tamanho máximo de uma mensagem MQTT?
O campo Remaining Length consegue codificar até 268.435.455 bytes (cerca de 256 MB), então esse é o limite do protocolo. Na prática, os brokers definem limites bem menores — geralmente de algumas centenas de kilobytes a alguns megabytes — e clientes e brokers MQTT 5 podem anunciar um Maximum Packet Size.
Quanta banda o QoS 1 ou o QoS 2 adiciona?
O QoS 1 adiciona um identificador de pacote de 2 bytes ao PUBLISH mais um PUBACK de 4 bytes, ou seja, 6 bytes por mensagem. O QoS 2 adiciona o mesmo identificador mais PUBREC, PUBREL e PUBCOMP, totalizando 14 bytes por mensagem, além de uma ida e volta extra.
Isso inclui o overhead de TLS e TCP?
Não. A calculadora conta apenas os bytes do MQTT. Os cabeçalhos TCP/IP adicionam cerca de 40–52 bytes por segmento, o TLS cerca de 22–29 bytes por registro e os WebSockets 2–14 bytes por frame. Em mensagens pequenas, esse overhead pode ser maior do que o próprio pacote MQTT.