Invisible Safety,

Proven by Intelligence

보이지 않는 안전을 인텔리전스로 증명하다.

기술 노트
IT 산업의 변화를 이끄는 MDS인텔리전스의
기술 인사이트를 만나보세요.
DX·AI
MQTT 프로토콜 분석 (1) – 개요 및 패킷 구조 분석
2026년 02월 13일

MQTT의 프로토콜의 분석 및 테스트를 아래와 같이 2개의 파트로 구분하여 연재해 보고자 합니다.


1. MQTT 프로토콜 분석 (1) – 개요 및 패킷 구조 분석

2. MQTT 프로토콜 분석 (2) – 운영 동작의 이해


개요


​MQTT(Message Queuing Telemetry Transport)는,

저전력 및 낮은 대역폭의 환경에서도 사용할 수 있도록 설계된 경량의 Publish/Subscribe(Pub/Sub) 메시징 프로토콜 입니다.



M2M(Machine to Machine)및 IoT 환경에 적합하기 때문에에 많은 IoT 플랫폼에서 채택하고 있는 프로토콜이기도 합니다.

현재 MQTT는 OASIS라는 단체에서 Spec에 대한 유지 보수를 담당합니다. 최신 버전은 5.0 입니다. 가장 널리 쓰이는 버전은 3.1.1이며, 3.1.1 버전의 경우 ISO 표준으로 등록되어 있기도 합니다

우선 MQTT 프로토콜과 관련된 주요 용어부터 정리하여 보겠습니다.

- Server : Application Message를 발행하는 Client와 구독 한 Client간의 중재자 역할을 하는 프로그램 또는 디바이스입니다. Broker 라고도 합니다.
- Application Message : MQTT 프로토콜을 통해 네트워크를 통해 전달되는 메시지, QoS 및 Topic과 연관되어 처리됩니다.
- Subscription : Topic Filter와 Maximum QoS를 포함하여 Server에 요청하게 되며, 구독 시 특정 Topic Name을 가진 Application Message를 전달 받을 수 있습니다.
- Topic Name : Application Message에 붙여진 일종의 라벨. Server는 일치하는 Topic을 Subscription한 Client에게 Application Message을 전달합니다.
- Topic Filter : Subscription 요청 시 포함되는 일종의 표현식. 하나 또는 여러 개의 Topic을 구독할 수 있습니다. Topic Filter는 Wildcard 문자가 포함될 수 있습니다.
- MQTT Control Packet : 네트워크를 통해 전달되는 정보 Packet, MQTT 규격에서는 총 14개의 타입으로 Control Packet을 생성하여 전달할 수 있습니다.
Control Packet Format

1) 기본 구조

 MQTT Control Packet은 아래와 같이 2~5byte의 Fixed Header를 시작으로 가변 헤더(Variable header)와 Payload가 붙어서 구성됩니다. Fixed Header는 필수요소이며 Variable header와 Payload 명령 타입에 따라 추가됩니다.


[표 1]  MQTT Control Packet 구조

2) Control Packet Type

 Byte 1의 7~4bit의 내용으로 Packet의 타입을 표현하고 있습니다. 총 4bit이므로 2^4총 16개의 타입이 정의되어 있으며 각 타입은 아래와 같은 기능을 수행합니다.

[표 2]  Control Packet Type

3) Flags

 byte 1의 0~3bit 부분으로 Control Packet Type에 따른 추가 Flags가 정의됩니다. 다만 현재 규격에서는 PUBLISH Packet을 제외하고는 예약된 고정 값을 사용합니다. PUBLISH Packet은 아래와 같이 Flags field를 사용합니다.

  ▶ DUP(Duplicate flag, bit 3) : 0일 경우, 첫번째 전달 시도임을 의미하며, 
      1일 경우에는 이전에 전달된 Packet이 재전송 Packet이라는 것을 의미합니다. (QoS > 0)

  ▶ QoS(bit 1~2) : QoS(Quality of Service) 레벨입니다. 
       QoS 관련 부분은 다음 파트에서 설명하겠습니다.

  ▶ RETAIN(bit 0) : 1일 경우, 서버는 해당 Topic의 최종 내용을 저장하고 있다가 
       향후 구독하는 Client에게 이를 전달합니다.

4) Remaining Length

 Fixed Header 부분을 제외한 현재 Packet의 전체 길이를 나타냅니다. 1~4 byte까지 사용 가능합니다. 각 byte의 bit 0 ~ bit 6, 총 7 bit를 가지고 길이를 표현하며 bit 7은 "continuation bit" 라고 하여 다음 byte를 Length 계산에 포함할지를 정의하는데 사용합니다 예를 들어 80은 1byte로 표현하고 300의 2byte를 써서 표현하게 됩니다. 4 byte를 모두 사용했을 때의 표현 가능한 최대 값은 268,435,455byte(255MB)이기에 MQTT 패킷의 최대 길이 또한 255MB입니다.

5) Variable Header & Payload

특정 타입의 MQTT Control Packet의 경우 Variable Header 또는 Payload 필드를 포함하고 있습니다. 특정 타입의 Packet들이 이 필드들을 사용하며, 여기에는 요청과 관련된 추가 정보들이 들어갑니다.

  ▶ Packet ID : 일부 MQTT 패킷의 경우 Non-Zero 2byte의 Packet ID(=Message ID)가 
      Variable Header에 기록되어 있는 경우가 있습니다. 이 ID를 이용하여 동일 요청에 의한 Packet임을 표현합니다.

아래는 Type별 Variable Header와 Payload의 사용여부 및 어떠한 내용들이 포함되는지는 정리한 표입니다.


[표 3]  Variable Header 및 Payload

CONNECT Type 의 Connect Flags, Keep Alive에 대한 부분은 다음 파트에서 설명하도록 하겠습니다. CONNECT Type의 Will Topic, Will Message, User Name, Password는 Connect Flags의 설정에 따라 추가되는 내용입니다.

Control Packet Example

​실제 MQTT Control Packet의 예시입니다. 오픈소스 MQTT Server 및 Client를 활용하여 테스트 하였으며 주요 명령에 대한 Packet 및 분석 내용은 아래와 같습니다.​

1) CONNECT

  · 10 (= 0001 0000) :
       ■ 0001 : Control Packet Type, 1 = CONNECT
       ■ 0000 : Reserved
  ·  1a : Remaining Length, 패킷 길이, 26 Byte
  ·  00, 04 : Protocol Name Length, 4 Byte
  ·  4d ~ 54 : Protocol Name, “MQTT”
  ·  04 : Protocol Version, 4 = 3.1.1
  ·  02 : Connect Flags, Clean Session(true)
  ·  00 3c : Keep Alive, 60s
  ·  00 0e : Client ID Length, 14 Byte
  ·  53 ~ : Client ID, SampleClient02

2) PUBLISH (QoS 0)



·  30 (= 0011 0000) : 
       ■ 0011 : Control Packet Type, 3 = PUBLISH
       ■ 0000 : DUP(False), QoS 0, Retain(false)
  ·  2f : Remaining Length, 패킷 길이, 47 Byte
  ·  00, 0f : Topic Name Length, 4 Byte
  ·  4e ~ 72 : Topic Name, “NeoIDM/Register”
  ·  4d ~ : Application Message, “Message from MqttPublishSample”

3) SUBSCRIBE



 ·  10 (= 1000 0010) : 
       ■ 1000 : Control n  Packet Type, 8 = SUBSCRIBE
       ■ 0010 : Reserved
  ·  0d : Remaining Length, 패킷 길이, 13 Byte
  ·  00, 01 : Packet ID, 1
  ·  00, 08 : Topic Filter Length, 8
  ·  42 ~ 23 : Topic Filter, “NeoIDM/#”
  ·  00 : Requested QoS 0

다음 연재에서는 MQTT 프로토콜 상의 운영 동작과 관련된 규격을 알아보도록 하겠습니다.