Der Nachrichtenheader jeder WebSphere MQ Telemetry Transport-Befehlsnachricht enthält einen festen Header. Die nachfolgende Tabelle zeigt das Format des festen Headers.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Byte 1 | Nachrichtenart | DUP-Flag | QoS-Stufe | RETAIN | ||||
Byte 2 | Verbleibende Länge |
Enthält die Felder für die Nachrichtenart und Flags (Dup, QoS-Stufe und RETAIN).
(Mindestens ein Byte) enthält das Feld für die verbleibende Länge.
In den nachfolgenden Abschnitten werden die Felder beschrieben. Alle Datenwerte sind in der Big Endian-Reihenfolge sortiert: High-Order-Bytes stehen vor Lower-Order-Bytes. Ein 16-Bit-Wort wird beim Senden als Most Significant Byte (MSB), gefolgt vom Least Significant Byte (LSB), dargestellt.
Dargestellt als 4-Bit-Wert ohne Vorzeichen. Die Aufzählungen für diese Protokollversion sind in der nachfolgenden Tabelle enthalten.
Mnemonisch | Aufzählung | Beschreibung |
---|---|---|
Reserviert | 0 | Reserviert |
CONNECT | 1 | Client fordert Verbindung zu Broker an |
CONNACK | 2 | Verbindungsbestätigung |
PUBLISH | 3 | Nachricht veröffentlichen |
PUBACK | 4 | Veröffentlichungsbestätigung |
PUBREC | 5 | Veröffentlichung empfangen (gesicherte Zustellung Teil 1) |
PUBREL | 6 | Freigabe veröffentlichen (gesicherte Zustellung Teil 2) |
PUBCOMP | 7 | Veröffentlichungsabschluss (gesicherte Zustellung Teil 3) |
SUBSCRIBE | 8 | Client-Subskriptionsanforderung |
SUBACK | 9 | Subskriptionsbestätigung |
UNSUBSCRIBE | 10 | Client-Abbestellungsanforderung |
UNSUBACK | 11 | Abbestellungsbestätigung |
PINGREQ | 12 | PING-Anforderung |
PINGRESP | 13 | PING-Antwort |
DISCONNECT | 14 | Client trennt die Verbindung |
Reserviert | 15 | Reserviert |
Die verbleibenden Bits von Byte 1 enthalten die Felder DUP, QoS und RETAIN. Die Bitpositionen sind verschlüsselt, um die Flags darzustellen (siehe nachfolgende Tabelle).
Bitposition | Name | Beschreibung |
---|---|---|
3 | DUP | Doppelte Zustellung |
2-1 | QoS | Servicequalität |
0 | RETAIN | RETAIN-Flag |
Position: Byte 1, Bit 3.
Dieses Flag wird festgelegt, wenn der Client oder Broker versucht, eine PUBLISH-Nachricht erneut zuzustellen. Dies gilt für Nachrichten, deren QoS-Wert größer ist als Null (0) und die eine Bestätigung erfordern. Wenn das DUP-Bit festgelegt ist, enthält der variable Header eine Nachrichten-ID.
Position: Byte 1, Bits 2-1.
Dieses Flag zeigt die Zusicherungsstufe für die Zustellung einer PUBLISH-Nachricht an. Die QoS-Stufen werden in der nachfolgenden Tabelle dargestellt.
QoS-Wert | Bit 2 | Bit 1 | Beschreibung | ||
---|---|---|---|---|---|
0 | 0 | 0 | At most once | Einmalig starten | <=1 |
1 | 0 | 1 | At least once | Zustellung bestätigt | >=1 |
2 | 1 | 0 | Exactly once | Gesicherte Zustellung | =1 |
3 | 1 | 1 | Reserviert |
Position: Byte 1, Bit 0.
Wenn das Retain-Flag festgelegt ist, zeigt es an, dass der Broker die Nachricht zurückbehält und sie als Startnachricht an neue Subskribenten dieses Themas sendet. Das bedeutet, dass ein neuer Client, der eine Verbindung zum Broker herstellt, die aktuelle Anzahl der Themen schnell erstellen kann. Dies ist dann nützlich, wenn Publisher Nachrichten auf "Bericht bei Ausnahme"-Grundlage senden und es einige Zeit dauern kann, bis ein neuer Subskribent Daten zu einem bestimmten Thema erhält. Die Daten haben den Wert "retained" (zurückbehalten) oder Last Known Good (LKG).
Nachdem ein Subskribent eine SUBSCRIBE-Nachricht für ein oder mehrere Themen versendet hat, erhält er eine SUBACK-Nachricht, gefolgt v on einer Nachricht für jedes neu subskribierte Thema mit zurückbehaltenem Wert. Der zurückbehaltene Wert wird vom Broker an den Subskribenten mit eingerichtetem Retain-Flag und derselben QoS veröffentlicht, mit der er ursprünglich veröffentlicht wurde. Daher unterliegt er den üblichen QoS-Zustellungszusicherungen. Das Retain-Flag wird in der Nachricht an die Subskribenten festgelegt, damit sie sich von "Live"-Daten unterscheidet und vom Subskribenten entsprechend behandelt wird.
Da ein Broker eine zuvor zurückbehaltene PUBLISH-Nachricht unter Umständen nicht länger einbehält, ist es nicht garantiert, dass der Subskribent eine ursprünglich zurückbehaltene PUBLISH-Nachricht zu einem Thema erhält.
Position: Byte 2.
Stellt die Anzahl der in der aktuellen Nachricht verbleibenden Byte dar, einschließlich der Daten im variablen Header und in der Nutzlast.
Das variable Längenverschlüsselungsschema verwendet ein Einzel-Byte für Nachrichten mit einer Länge von bis zu 127 Bytes. Längere Nachrichten werden wie folgt bearbeitet: Sieben Bit von jedem Byte verschlüsseln die Daten zu verbleibenden Länge, das achte Bit zeigt nachfolgende Bytes an. Jedes Byte verschlüsselt 128 Werte und ein "Fortsetzungsbit". Beispiel: Die Zahl 64 dezimal wird als Einzel-Byte, Dezimalwert 64, Hexadezimalwert 0x40, verschlüsselt. Die Zahl 321 dezimal (=128x2 + 65) wird als zwei Bytes, Least Significant First, verschlüsselt. Das erste Byte ist 2+128 = 130. Beachten Sie, dass das oberste Bit festgelegt wird, um mindestens ein nachfolgendes Byte anzuzeigen. Das zweite Byte ist 65.
Das Protokoll beschränkt die Byte-Anzahl in der Darstellung auf vier. Somit können Anwendungen Nachrichten von bis zu 268 435 455 (256 MB) senden. Die Darstellung dieser Zahl beim Senden sie wie folgt aus: 0xFF, 0xFF, 0xFF, 0x7F.
In der nachfolgenden Tabelle werden die Werte für die verbleibende Länge, dargestellt durch ansteigende Byte-Zahlen, gezeigt.
Ziffern | Von | Bis |
---|---|---|
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) |
Der Algorithmus zur Verschlüsselung einer Dezimalzahl (X) in das variable Längenverschlüsselungsschema lautet wie folgt:
do digit = X MOD 128 x = X DIV 128 // Legen Sie das oberste Bit dieser Ziffer fest, wenn mehrere Ziffern verschlüsselt werden sollen if ( X > 0 ) digit = digit OR 0x80 endif 'Ausgabe' digit while ( X > 0 )
dabei steht MOD für den Modulo-Operator (% in C), DIV für die Ganzzahlteilung (/ in C) und OR ist der Bit für Bit-Oder-Operator (| in C).
Der Algorithmus zur Entschlüsselung des Feldes für die verbleibende Länge lautet wie folgt:
Multiplikator = 1 Wert = 0 do digit = 'nächste Ziffer von Datenstrom' value += (digit AND 127) * multiplier; multiplier *= 128; while ((digit AND 128) != 0);
dabei steht AND für den Bit-für-Bit-Und-Operator (& in C).
Wenn dieser Algorithmus beendet ist, enthält value die verbleibende Länge in Bytes.
Die Verschlüsselung der verbleibenden Länge ist nicht Teil des variables Headers. Die Anzahl der zur Verschlüsselung der verbleibenden Länge verwendeten Bytes trägt nicht zum Wert der verbleibenden Länge bei. Die "Erweiterungs-Bytes" mit variabler Länge sind Teil des festen Headers, nicht des variablen Headers.