La cabecera de mensaje de cada mensaje de mandato de WebSphere MQ Telemetry Transport contiene una cabecera fija. La tabla de abajo describe el formato de la cabecera fija:
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
byte 1 | Tipo de mensaje | Indicador DUP | Nivel QoS | RETAIN | ||||
byte 2 | Longitud restante |
Contiene los campos Tipo de mensaje e Indicadores (Dup, QoS level y RETAIN).
(Un byte como mínimo) contiene el campo Longitud restante.
Los campos están descritos en las siguientes secciones. Todos los valores de datos están en orden big-endian: los bytes de orden superior preceden a los bytes de orden inferior. Una palabra de 16 bits se presenta en la transmisión como byte más significativo (Most Significant Byte, MSB), seguido por el byte menos significativo (Least Significant Byte, LSB).
Representado como un valor de 4 bits sin signo. Las enumeraciones para esta versión del protocolo se muestran en la tabla que sigue.
Mnemotécnico | Enumeración | Descripción |
---|---|---|
Reservado | 0 | Reservado |
CONNECT | 1 | Petición del cliente para conectar con el intermediario |
CONNACK | 2 | Acuse de recibo de conexión |
PUBLISH | 3 | Mensaje de publicación |
PUBACK | 4 | Acuse de recibo de publicación |
PUBREC | 5 | Publicación recibida (parte 1 de la entrega segura) |
PUBREL | 6 | Liberación de publicación (parte 2 de la entrega segura) |
PUBCOMP | 7 | Publicación completa (parte 3 de la entrega segura) |
SUBSCRIBE | 8 | Petición de suscripción de cliente |
SUBACK | 9 | Acuse de recibo de suscripción |
UNSUBSCRIBE | 10 | Petición de anulación de registro de cliente |
UNSUBACK | 11 | Acuse de recibo de anulación de suscripción |
PINGREQ | 12 | Petición de PING |
PINGRESP | 13 | Respuesta de PING |
DISCONNECT | 14 | El cliente se está desconectando |
Reservado | 15 | Reservado |
Los bits restantes del byte 1 contienen los campos DUP, QoS y RETAIN. Las posiciones de los bits están codificadas para representar los indicadores, como se indica en la tabla que sigue.
Posición de bit | Nombre | Descripción |
---|---|---|
3 | DUP | Entrega duplicada |
2-1 | QoS | Calidad de servicio |
0 | RETAIN | Indicador RETAIN |
Posición: byte 1, bit 3.
Este indicador se establece cuando el cliente o el intermediario intentan volver a entregar un mensaje PUBLISH. Esto se aplica a los mensajes en los que el valor de QoS es mayor que cero (0) y se necesita un acuse de recibo. Cuando se ha establecido el bit DUP, la cabecera variable incluye un ID de mensaje.
Posición: byte 1, bits 2-1.
Este indicador indica el nivel de seguridad para la entrega de un mensaje PUBLISH. Los niveles de QoS aparecen en la tabla que sigue.
Valor de QoS | bit 2 | bit 1 | Descripción | ||
---|---|---|---|---|---|
0 | 0 | 0 | Una vez como máximo | Transmitir y olvidar | <=1 |
1 | 0 | 1 | Una vez como mínimo | Entrega con acuso de recibo | >=1 |
2 | 1 | 0 | Exactamente una vez | Entrega asegurada | =1 |
3 | 1 | 1 | Reservado |
Posición: byte 1, bit 0.
Cuando está establecido, el indicador Retain indica que el intermediario contiene el mensaje y lo envía como mensaje inicial a los nuevos suscriptores de ese tema. Esto significa que un nuevo cliente que se conecte al intermediario puede establecer rápidamente el número actual de temas. Esto es útil cuando los publicadores envían mensajes en base a un "informe por excepción", y puede pasar tiempo antes de que un nuevo suscriptor reciba datos sobre un tema en particular. Los datos tienen un valor 'retenido' o 'lo último que se sabe es correcto (Last Known Good, LKG).
Después de enviar un mensaje SUBSCRIBE a uno o más temas, un suscriptor recibe un mensaje SUBACK seguido de un mensaje para cada tema al que acabe de suscribirse que tenga un valor retenido. EL valor retenido se publica desde el intermediario para el suscriptor que tenga establecido el indicador de retención (Retain) y que tenga el mismo QoS con el que se publicó originalmente y que, por lo tanto, está sujeto a las seguridades de entrega habituales de QoS. El indicador Retain se establece en el mensaje para los suscriptores para distinguirlo de los datos "en directo" de forma que el suscriptor pueda manejarlos adecuadamente.
Como es posible que un intermediario ya no contenga un mensaje previo PUBLISH retenido, no hay ninguna garantía de que el suscriptor reciba un mensaje PUBLISH retenido inicial sobre el tema.
Posición: byte 2.
Representa el número de bytes restante dentro del mensaje actual, incluidos los datos de la cabecera variable y la carga útil.
El esquema de codificación de la longitud variable utiliza un solo byte para mensajes que tengan hasta 127 bytes de largo. Los mensajes más largos se gestionan como sigue. Siete bits de cada byte codifican los datos de Longitud restante y el octavo bit indica los siguientes bytes restantes de la representación. Cada byte codifica 128 valores y un "bit de continuación". Por ejemplo, el número decimal 64 está codificado como un solo byte, valor decimal 64, hex 0x40. El número decimal 321 (=128x2 + 65) está codificado como dos bytes con el menos significativo primero. El primer byte es 2+128 = 130. Tenga en cuenta que el bit superior está establecido para indicar como mínimo un byte siguiente. El segundo byte es 65.
El protocolo limita el número de bytes de la representación a un máximo de cuatro. Esto permite a las aplicaciones enviar mensajes de hasta 268 435 455 (256 MB). La representación de este número en la transmisión es: 0xFF, 0xFF, 0xFF, 0x7F.
La tabla que sigue muestra los valores de la Longitud restante representados por números de bytes crecientes.
Dígitos | De | A |
---|---|---|
1 | 0 (0x00) | 127 (0x7F) |
2 | 128 (0x80, 0x01) | 16 383 (0xFF, 0x7F) |
3 | 16 384 (0x80, 0x80, 0x01) | 2 097 151 (0xFF, 0xFF, 0x7F) |
4 | 2 097 152 (0x80, 0x80, 0x80, 0x01) | 268 435 455 (0xFF, 0xFF, 0xFF, 0x7F) |
El algoritmo para codificar un número decimal (X) en el esquema de codificación de longitud variable es como sigue:
do digit = X MOD 128 x = X DIV 128 // si hay más dígitos por codificar, establezca el bit superior de este dígito if ( X > 0 ) digit = digit OR 0x80 endif 'output' digit while ( X > 0 )
donde MOD es el operador de módulo (% en C), DIV es la división de entero (/ en C), y OR es bit a bit o (| en C).
El algoritmo para decodificar el campo Longitud restante es como sigue:
multiplier = 1 value = 0 do digit = 'next digit from stream' value += (digit AND 127) * multiplier; multiplier *= 128; while ((digit AND 128) != 0);
donde AND es bit a bit y operador (& en C).
Cuando este algoritmo termina, value contiene la longitud restante en bytes.
La codificación de la longitud restante no forma parte de la cabecera variable. El número de bytes usado para codificar la longitud restante no aumenta el valor de la Longitud restante. Los "bytes de extensión" de la longitud variable forman parte de la cabecera fija, no de la cabecera variable.