안녕하세요! 첫 번째 MQTT 이야기에서 인삿말이 늦었습니다. 오늘은 MQTT 패킷의 구조에 대해 자세히 알아보도록 하겠습니다. MQTT는 사물 인터넷 환경에서 널리 사용되는 경량 메시징 프로토콜입니다. 이번 시간에는 MQTT 패킷의 구성 요소와 각 필드의 역할을 살펴보도록 하겠습니다. 이를 통해 MQTT 프로토콜의 작동 원리에 대한 이해를 높일 수 있을 것입니다.
MQTT Peket 구조
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
byte 1 | 메세지 타입(Message Type) | 중복 플래그 (DUP flag) | Qos Level | RETAIN | ||||
byte 2 | Remaining Length | |||||||
byte 3 ~ byte n |
Option Variable header | |||||||
byte n+1 ~ |
Option Payload |
MQTT는 2바이트의 고정 헤더를 사용하여 메시지 타입, 중복 플래그, QoS, RETAIN 정보를 포함하고, 나머지 1바이트는 가변 헤더와 페이로드의 크기를 나타내는 매우 경량화된 프로토콜입니다.
메세지 Type (4bit)
명칭 | 10진수 | 설명 |
Reserved | 0 | 사용하지 않음 |
CONNECT | 1 | 연결됨 |
CONNACK | 2 | 연결 확인(Connect Acknowledgment) |
PUBLISH | 3 | 발행 메시지(Publish message) |
PUBACK | 4 | 발행 확인(Publish Acknowledgment) |
PUBREC | 5 | 발행 수신(Publish Received) |
PUBREL | 6 | 발행 해제(Publish Release) |
PUBCOMP | 7 | 발행 완료(Publish Complete) |
SUBSCRIBE | 8 | 구독 요청(Client Subscribe request) |
SUBACK | 9 | 구독 확인(Subscribe Acknowledgment) |
UNSUBSCRIBE | 10 | 구독취소 요청(Client Unsubscribe request) |
UNSUBACK | 11 | 구독취소 확인(Unsubscribe Acknowledgment) |
PINGREQ | 12 | PING 요청(PING Request) |
PINGRESP | 13 | PING 응답(PING Response) |
DISCONNECT | 14 | 연결 해제 |
Reserved | 15 | 사용하지 않음 |
QoS
QoS(서비스 품질)는 사물인터넷(IoT) 통신에서 메시지 전달의 신뢰성을 보장하는 역할을 합니다. IoT 장치는 주로 Wi-Fi, Zigbee, Bluetooth 같은 무선 네트워크를 사용하는데, 이러한 네트워크는 유선보다 불안정할 수 있습니다. QoS는 이런 불안정성을 보완하여 통신의 안정성을 높여줍니다. MQTT 프로토콜에서 제공하는 QoS 수준은
- QoS 0: 메시지를 한 번만 전송, 확인 없음
- QoS 1: 최소 한 번 전송, 확인 필요
- QoS 2: 정확히 한 번 전송, 중복 방지
이 방식으로 네트워크 문제를 해결해 신뢰성을 유지합니다.
QoS 0
QoS 0은 "최대 한 번" 전달 방식으로, 메시지가 한 번만 전송되고 수신 확인을 하지 않아 가장 빠르지만 신뢰성이 낮으며, 네트워크 상태가 좋고 일부 데이터 손실이 허용되는 경우에 적합한 MQTT의 가장 기본적인 서비스 수준입니다.S 0은 "최대 한 번" 전달 방식으로, 메시지가 한 번만 전송되고 수신 확인을 하지 않아 가장 빠르지만 신뢰성이 낮으며, 네트워크 상태가 좋고 일부 데이터 손실이 허용되는 경우에 적합한 MQTT의 가장 기본적인 서비스 수준입니다.
QoS 1
QoS 1은 "최소 한 번" 전달 방식으로, 발신자가 수신자로부터 PUBACK을 받을 때까지 메시지를 재전송하여 최소 한 번 이상의 전달을 보장하며, 메시지 손실은 방지되지만 중복 가능성이 있어 메시지 순서가 중요하지 않고 손실만 방지하면 되는 상황에 적합한 MQTT의 중간 수준의 서비스입니다.
Qos2
QoS 2는 "정확히 한 번" 전달 방식으로, 4단계 핸드셰이크 과정을 통해 메시지가 정확히 한 번만 전달됨을 보장하여 가장 높은 신뢰성을 제공하지만 가장 느리고 리소스를 많이 사용하므로, 금융 거래나 미션 크리티컬한 시스템과 같이 메시지의 정확한 전달과 순서가 절대적으로 중요한 상황에서 사용되는 MQTT의 최고 수준의 서비스입니다.
중복 플래그(1bit)
MQTT 메시지가 재발행될 때, 해당 메시지가 중복인지 아닌지를 나타내는 중요한 요소입니다. QoS 1과 QoS 2에서 재전송이 발생할 수 있기 때문에, 수신자는 이 플래그를 보고 동일한 메시지가 여러 번 전송되었는지를 확인할 수 있습니다.
QoS 1 메시지 전송
클라이언트가 브로커에게 메시지를 처음 전송할 때, 중복 플래그는 0입니다. 만약 브로커가 이 메시지를 수신하지 못했거나, 클라이언트가 ACK(확인 응답)를 받지 못했다면, 클라이언트는 다시 메시지를 전송합니다. 이때 재전송된 메시지에서 중복 플래그는 1로 설정됩니다.
중복 플래그가 1로 설정된 메시지를 받은 브로커는 해당 메시지가 이미 처리된 것인지 확인한 후, 이미 처리된 메시지라면 무시할 수 있습니다.
QoS 2 메시지 전송
QoS 2는 정확히 한 번 메시지를 전송하기 위한 프로토콜입니다. 여러 단계의 확인 절차를 거치므로, 만약 그 과정에서 네트워크 문제로 재전송이 발생하면 마찬가지로 중복 플래그가 1로 설정됩니다. 이 플래그는 수신자가 메시지가 처음 전송된 것인지, 재전송된 것인지를 구분할 수 있도록 도와줍니다.
RETAIN(1bit)
메시지를 발행할 때, 해당 메시지를 브로커가 "보존"해야 할지 여부를 결정하는 플래그입니다. 이 플래그는 메시지가 새로운 구독자에게 전달될 때 중요한 역할을 합니다.
RETAIN 플래그가 1일 때
- 발행된 메시지는 브로커에 "저장"됩니다.
- 이후에 새로운 구독자가 같은 주제(topic)에 구독하게 되면, 브로커는 저장된 메시지를 해당 구독자에게 즉시 전송합니다.
- 예를 들어, 현재 온도 데이터를 계속 발행하고 있는 시스템에서 마지막으로 발행된 온도 값을 브로커가 저장하고 있다가, 나중에 새로운 클라이언트가 온도 데이터를 구독할 경우 즉시 최신 온도 값을 받아볼 수 있게 됩니다.
RETAIN 플래그가 0일 때
- 발행된 메시지는 브로커에 저장되지 않습니다.
- 메시지가 발행될 당시 구독 중이었던 클라이언트들에게만 전달되고, 이후에 구독을 시작하는 클라이언트는 해당 메시지를 받을 수 없습니다.메세지 Type (4bit)명칭 10진수 설명
'IoT' 카테고리의 다른 글
MQTT(Message Queuing Telemetry Transport)란? (0) | 2024.09.22 |
---|