각 WebSphere MQ Telemetry Transport 명령 메시지의 메시지 헤더에는 고정된 헤더가 포함되어 있습니다. 다음 표에서는 고정된 헤더 형식을 보여줍니다.
비트 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
바이트 1 | 메시지 유형 | DUP 플래그 | QoS 레벨 | RETAIN | ||||
바이트 2 | 나머지 길이 |
메시지 유형 및 플래그(Dup, QoS 레벨 및 RETAIN) 필드를 포함합니다.
(최소 1바이트) 나머지 길이 필드를 포함합니다.
필드는 다음 절에 설명되어 있습니다. 모든 데이터 값은 big-endian 순서입니다. 순서가 높은 바이트가 순서가 낮은 바이트에 우선합니다. 16비트 단어는 Wire에 MSB(Most Significant Byte)와 그 다음의 LSB(Least Significant Byte)로 표시됩니다.
4비트의 부호가 없는 값으로 표현됩니다. 아래의 표에는 이 프로토콜 버전의 나열이 표시되어 있습니다.
니모닉 | 나열 | 설명 |
---|---|---|
예약됨 | 0 | 예약됨 |
CONNECT | 1 | 브로커에 연결하기 위한 클라이언트 요청 |
CONNACK | 2 | 연결 수신확인 |
PUBLISH | 3 | Publish 메시지 |
PUBACK | 4 | Publish 수신확인 |
PUBREC | 5 | Publish 수신(보증된 전달 부분 1) |
PUBREL | 6 | Publish 해제(보증된 전달 부분 2) |
PUBCOMP | 7 | Publish 완료(보증된 전달 부분 3) |
SUBSCRIBE | 8 | 클라이언트 Subscribe 요청 |
SUBACK | 9 | Subscribe 수신확인 |
UNSUBSCRIBE | 10 | 클라이언트 Unsubscribe 요청 |
UNSUBACK | 11 | Unsubscribe 수신확인 |
PINGREQ | 12 | PING 요청 |
PINGRESP | 13 | PING 응답 |
DISCONNECT | 14 | 클라이언트가 연결을 끊는 중 |
예약됨 | 15 | 예약됨 |
바이트 1의 나머지 비트에는 DUP, QoS 및 RETAIN 필드가 들어 있습니다. 비트 위치는 아래의 표에 표시된 플래그를 표시하도록 인코딩됩니다.
비트 위치 | 이름 | 설명 |
---|---|---|
3 | DUP | 중복 전달 |
2-1 | QoS | QoS |
0 | RETAIN | RETAIN 플래그 |
위치: 바이트 1, 비트 3.
이 플래그는 클라이언트 또는 브로커가 PUBLISH 메시지를 다시 전달할 때 설정됩니다. QoS 값이 0보다 크고 수신확인이 필요한 메시지에 적용됩니다. DUP 비트가 설정되면 변수 헤더에 메시지 ID가 포함됩니다.
위치: 바이트 1, 비트 2-1.
이 플래그는 PUBLISH 메시지 전달 보증 레벨입니다. 아래 표에 QoS 레벨이 표시되어 있습니다.
QoS 값 | 비트 2 | 비트 1 | 설명 | ||
---|---|---|---|---|---|
0 | 0 | 0 | 최대 한 번 | 송신 후 삭제 | <=1 |
1 | 0 | 1 | 최소 한 번 | 수신확인 전달 | >=1 |
2 | 1 | 0 | 단 한 번 | 전달 보증 | =1 |
3 | 1 | 1 | 예약됨 |
위치: 바이트 1, 비트 0.
설정할 경우, 보유 플래그는 브로커가 메시지를 보유하며 이 메시지를 이 토픽에 대한 새 subscriber로 초기 메시지로서 송신한다는 것을 표시합니다. 브로커에 연결하는 새 클라이언트가 현재 토픽 수를 신속하게 설정할 수 있다는 것을 의미합니다. publisher가 "예외별 보고"를 기초로 메시지를 송신할 때 유용하며 새 subscriber가 특정 토픽의 데이터를 수신하려면 시간이 소요될 수 있습니다. 데이터는 보유 또는 LKG(Last Known Good) 값을 가집니다.
하나 이상의 토픽에 대해 SUBSCRIBE 메시지를 송신한 경우, subscriber는 SUBACK 메시지에 이어 새로 subscribe된 각 토픽에 대해 값을 보유한 하나의 메시지를 수신합니다. 보유된 값은 보유 플래그 세트 및 원래 발행된 것과 동일한 QoS를 사용하여 브로커에서 subscriber로 발행되므로 일반 QoS 전달 보증에 해당됩니다. Retain 플래그는 "실제" 데이터와 구분하여 subscriber가 적절히 핸들링할 수 있도록 subscriber에 대한 메시지에 설정됩니다.
브로커는 이제 이전에 보유했던 PUBLISH 메시지를 보유하지 않으므로, 토픽의 초기 보유 PUBLISH 메시지를 수신한다고 보장할 수 없습니다.
위치: 바이트 2.
가변 헤더 및 페이로드(payload)에 있는 데이터를 비롯하여 현재 메시지 내에 남아 있는 바이트 수를 표시합니다.
가변 길이 인코딩 설계에서는 메시지에 대해 1바이트에서 최대 127바이트까지 사용합니다. 더 긴 메시지는 다음과 같이 핸들링됩니다. 각 바이트의 7비트는 나머지 길이 데이터를 인코딩하며 8번째 비트는 표현에서 다음 바이트를 표시합니다. 각 바이트는 값 128과 "연속 비트"를 인코딩합니다. 예를 들면, 10진수 64는 단일 바이트의 10진수로는 64, 16진수로는 0x40으로 인코딩됩니다. 10진수 321(=128x2 + 65)은 두 바이트로 인코딩되며 LSB(Least Significant Byte)가 앞에 옵니다. 첫 번째 바이트는 2+128 = 130입니다. 뒤에 최소 한 바이트가 더 있다는 것을 표시하기 위해 최상위 비트가 설정됩니다. 두 번째 바이트는 65입니다.
프로토콜은 표현의 바이트 수를 최대 4로 제한합니다. 이로써 응용프로그램은 최대 268 435 455(256MB)의 메시지를 송신할 수 있습니다. Wire에서 이 숫자는 0xFF, 0xFF, 0xFF, 0x7F로 표현됩니다.
다음 표에는 바이트 수를 증가시킴으로써 표현되는 나머지 길이 값이 표시되어 있습니다.
숫자 | 최소값 | 최대값 |
---|---|---|
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) |
10진수(X)를 가변 길이 인코딩 설계로 인코딩하는 알고리즘은 다음과 같습니다.
do digit = X MOD 128 x = X DIV 128 // if there are more digits to encode, set the top bit of this digit if ( X > 0 ) digit = digit OR 0x80 endif 'output' digit while ( X > 0 )
여기서 MOD는 모듈로 연산자(% in C), DIV는 정수 나눗셈(C에서는 /)이며, OR는 비트 단위의 or(C에서는 |)입니다.
나머지 길이 필드를 디코드하는 알고리즘은 다음과 같습니다.
multiplier = 1 value = 0 do digit = 'next digit from stream' value += (digit AND 127) * multiplier; multiplier *= 128; while ((digit AND 128) != 0);
여기서 AND는 비트 단위의 and 연산자(C에서는 &)입니다.
이 알고리즘이 종료되면 value에는 나머지 길이(바이트 단위)가 포함됩니다.
나머지 길이 인코딩은 가변 헤더의 부분이 아닙니다. 나머지 길이 인코딩에 사용되는 바이트 수는 나머지 길이의 값에 영향을 미치지 않습니다. 가변 길이 "확장 바이트"는 가변 헤더가 아닌 고정된 헤더의 부분입니다.