L'intestazione del messaggio per ogni messaggio di comando WebSphere MQ Telemetry Transport contiene un'intestazione fissa. La seguente tabella mostra il formato dell'intestazione fissa.
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
byte 1 | Tipo messaggio | Indicatore DUP | Livello QoS | RETAIN | ||||
byte 2 | Lunghezza rimanente |
Contiene i campi Tipo messaggio e Indicatori (Dup, livello QoS e RETAIN).
(Almeno un byte) contiene il campo Lunghezza rimanente.
I campi sono descritti nelle seguenti sezioni. Tutti i valori di dati sono in ordine big-endian: i byte di ordine superiore precedono quelli di ordine inferiore. Una parola a 16-bit è presentata nel collegamento via cavo come MSB (Most Significant Byte), seguita da LSB (Least Significant Byte).
Rappresentato come valore di 4 bit senza segno. Le numerazioni per questa versione del protocollo sono mostrate nella seguente tabella.
Mnemonico | Numerazione | Descrizione |
---|---|---|
Riservato | 0 | Riservato |
CONNECT | 1 | Richiesta client di connessione al broker |
CONNACK | 2 | Conferma connessione |
PUBLISH | 3 | Messaggio di pubblicazione |
PUBACK | 4 | Conferma pubblicazione |
PUBREC | 5 | Pubblicazione ricevuta (consegna garantita parte 1) |
PUBREL | 6 | Rilascio pubblicazione (consegna garantita parte 2) |
PUBCOMP | 7 | Pubblicazione completata (consegna garantita parte 3) |
SUBSCRIBE | 8 | Richiesta sottoscrizione client |
SUBACK | 9 | Conferma sottoscrizione |
UNSUBSCRIBE | 10 | Richiesta annullamento sottoscrizione client |
UNSUBACK | 11 | Conferma annullamento sottoscrizione |
PINGREQ | 12 | Richiesta PING |
PINGRESP | 13 | Risposta PING |
DISCONNECT | 14 | Il client si sta scollegando |
Riservato | 15 | Riservato |
I bit rimanenti del byte 1 contengono i campi DUP, QoS e RETAIN. Le posizioni bit sono codificate per rappresentare gli indicatori come mostrato nella seguente tabella.
Posizione bit | Nome | Descrizione |
---|---|---|
3 | DUP | Consegna duplicato |
2-1 | QoS | Quality of Service |
0 | RETAIN | Indicatore RETAIN |
Posizione: byte 1, bit 3.
Questo indicatore è impostato quando il client o il broker tenta di riconsegnare un messaggio PUBLISH. Questo si applica ai messaggi in cui il valore di QoS è maggiore di zero (0) ed è richiesta una conferma. Quando il bit DUP è impostato, l'intestazione della variabile include un ID di messaggio.
Posizione: byte 1, bit 2-1.
Questo indicatore mostra il livello di garanzia della consegna di un messaggio PUBLISH. I livelli QoS sono mostrati nella seguente tabella.
Valore QoS | 2 bit | 1 bit | Descrizione | ||
---|---|---|---|---|---|
0 | 0 | 0 | Almeno una volta | Fire and Forget | <=1 |
1 | 0 | 1 | Almeno una volta | Consegna confermata | >=1 |
2 | 1 | 0 | Esattamente una volta | Consegna garantita | =1 |
3 | 1 | 1 | Riservato |
Posizione: byte 1, bit 0.
Quando è impostato, l'indicatore Retain specifica che il broker conserva il messaggio e lo invia come messaggio iniziale ai nuovi sottoscrittori a questo argomento. Questo significa che un nuovo client che si connette al broker può stabilire rapidamente il numero attuale di argomenti. Questo è utile nel caso in cui gli autori (publisher) inviino messaggi su base "prospetto per eccezione" e potrebbe trascorrere un po' di tempo prima che un nuovo sottoscrittore riceva i dati su un particolare argomento. I dati hanno un valore di conservato o LKG (Last Known Good).
Una volta inviato un messaggio SUBSCRIBE a uno o più argomenti, un sottoscrittore riceve un messaggio SUBACK, seguito da un messaggio per ogni argomento appena sottoscritto, che abbia un valore di conservato. Il valore di conservato è pubblicato dal broker per il sottoscrittore con l'indicatore Retain impostato e con lo stesso QoS con cui è stato originariamente pubblicato e quindi è soggetto alle normali garanzie di consegna QoS. L'indicatore Retain è impostato nel messaggio per i sottoscrittori, per distinguerlo dai dati "in tempo reale" affinché venga gestito nel modo appropriato dal sottoscrittore.
Poiché un broker potrebbe non conservare più un messaggio PUBLISH precedentemente conservato, non c'è garanzia che il sottoscrittore riceva un messaggio iniziale PUBLISH conservato su un argomento.
Posizione: byte 2.
Rappresenta il numero di byte rimanenti all'interno del messaggio corrente, compresi i dati nell'intestazione variabile e nel payload.
Lo schema di codifica della lunghezza variabile utilizza un singolo byte per messaggi fino a una lunghezza di 127 byte. I messaggi più lunghi sono gestiti nel modo seguente. Sette bit per ogni byte codificano i dati relativi alla Lunghezza rimanente e l'ottavo bit indica tutti i byte successivi nella rappresentazione. Ogni byte codifica 128 valori e un "bit di continuazione". Ad esempio, il numero 64 decimale è codificato come singolo byte, valore decimale 64, esadecimale 0x40. Il numero 321 decimale (=128x2 + 65) è codificato come due byte, il meno significativo per primo. Il primo byte è 2+128 = 130. Si noti che il bit al livello più alto è impostato per indicare almeno uno dei byte successivi. Il secondo byte è 65.
Il protocollo limita il numero di byte nella rappresentazione fino a un massimo di quattro. Questo consente alle applicazioni di inviare messaggi fino a 268 435 455 (256 MB). La rappresentazione di questo numero nel collegamento via cavo è: 0xFF, 0xFF, 0xFF, 0x7F.
La seguente tabella mostra i valori della Lunghezza rimanente rappresentati da numeri di byte di valore crescente.
Cifre | Da | 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) |
L'algoritmo per la codifica di un numero decimale (X) nello schema di codifica della lunghezza variabile è il seguente:
do digit = X MOD 128 x = X DIV 128 // Se vi sono più cifre da codificare, impostare il bit di livello più elevato di questa cifra if ( X > 0 ) digit = digit OR 0x80 endif 'output' digit while ( X > 0 )
dove MOD è l'operatore modulo (% in C), DIV è la divisione numero intero (/ in C) e OR è l'equivalente in bit o (| in C).
L'algoritmo per decodificare il campo Lunghezza rimanente è il seguente:
multiplier = 1 value = 0 do digit = 'la cifra successiva dal flusso' value += (digit AND 127) * multiplier; multiplier *= 128; while ((digit AND 128) != 0);
dove AND è l'equivalente in bit e l'operatore (& in C).
Quando termina questo algoritmo, value contiene la Lunghezza rimanente in byte.
La codifica della Lunghezza rimanente non fa parte dell'intestazione variabile. Il numero di byte utilizzato per codificare la Lunghezza rimanente non contribuisce al valore della Lunghezza rimanente. I "byte di estensione" della lunghezza variabile fanno parte dell'intestazione fissa, non dell'intestazione variabile.