MQTT Detailed Complement

wldbs._.·2024년 9월 12일

MQTT

목록 보기
5/7
post-thumbnail

패킷 구조

  1. MQTT 프로토콜에서 사용하는 컨트롤 패킷(Control Packet)은 브로커와 클라이언트 간에 통신을 할 때 서로 데이터를 주고받기 위해 사용한다.

  2. MQTT 프로토콜에서 컨트롤 패킷(Control Packet) 은 세 부분으로 구성된다
    : 고정 헤더(Fixed Header), 가변 헤더(Variable Header) [일부 패킷에만 존재], 페이로드(Payload) [필요한 경우]

  3. MQTT Control Packet은 2~5byte의 고정 헤더를 시작으로, 가변 헤더와 페이로드가 붙어서 구성된다.
    : 고정 헤더는 필수 요소이며, 가변 헤더와 페이로드는 명령 타입에 따라 추가된다.


Fixed Header

1) Control Packet type

: Byte 1의 7~4 bit의 내용으로, 패킷의 타입을 표현한다.
: 총 4bit이므로, 2^4, 16개의 타입이 정의되어 있다.

  • Reserved : value 0, 15
  • CONNECT : value 1, 클라이언트의 서버 연결 요청
  • CONNACK : value 2, 서버 연결 요청에 대한 브로커의 ACK
  • PUBLISH : value 3, 발행자의 발행
  • PUBACK : value 4, 발행에 대한 브로커의 ACK (QoS 1)
  • PUBREC : value 5, 발행 전달에 대한 브로커의 확인 Flow 1 (QoS 2)
  • PUBREL : value 6, 발행 전달에 대한 발행자의 확인 Flow 2 (QoS 2)
  • PUBCOMP : value 7, 발행 전달에 대한 브로커의 확인 Flow 3 (QoS 2)
  • SUBSCRIBE : value 8, 구독자의 서버 구독 요청
  • SUBACK : value 9, 구독자의 구독 요청에 대한 브로커의 ACK
  • UNSUBSCRIBE : value 10, 구독자의 서버 구독 해제 요청
  • UNSUBACK : value 11, 서버 구독 해제 요청에 대한 브로커의 ACK
  • PINGREQ : value 12, 클라이언트의 PING 요청
  • PINGRESP : value 13, PING 요청에 대한 브로커의 응답
  • DISCONNECT : value 14, 클라이언트의 서버 연결 해제 요청

MQTT 프로토콜에서 Control Packet Type에 대해 할당된 값 중에서 015는 특별히 예약되어 있다.

  • 이들은 현재 사용되고 잇지 않으며, 향후 프로토콜의 확장이나 변경을 위해 예비로 남겨둔 것
  • 이 값들은 실제 MQTT 메시지 유형으로 사용되지 않으며, 어떤 명령이나 기능을 수행하지 않는다!

2) Flags

: Byte 1의 0~3 bit의 내용으로, Control Packet Type에 따른 추가 Flags가 정의된다.

  • 1) DUP(Duplicate Flag, bit 3) : 메시지의 중복 전송 0/1

    • 클라이언트가 메시지를 발행하고, 해당 메시지에 대한 수신 확인(ACK)이 브로커로부터 반환되지 않았을 경우, 클라이언트는 동일한 메시지를 재전송하는 상황을 지시

      • -> 이 때, 재전송되는 메시지의 DUP 플래그는 true로 설정되어, 이 메시지가 원본의 복사본임을 나타냄
    • QoS 1(적어도 한 번), QoS 2(정확히 한 번) 수준에서 메시지 발행 시 사용

    • 0일 경우, 첫번째 전달 시도임을 의미하며, 1일 경우에는 재전송 Packet이라는 것을 의미

      • If the DUP flag is set to 0, it indicates that this is the first occasion that the Client or Server has attempted to send this PUBLISH packet. If the DUP flag is set to 1, it indicates that this might be re-delivery of an earlier attempt to send the packet.

      현재 규격에서는 PUBLISH Packet을 제외하고는 예약된 고정 값 사용

  • 2) QoS(Quality of Service, bit 1~2) : QoS 레벨 0/1/2

    • MQTT 명령줄 도구에서 -q 옵션을 사용하지 않을 경우, 기본적으로 사용되는 QoS 레벨은 0
  • 3) RETAIN(bit 0) : 발행된 메시지의 브로커의 보관 0/1

    • 특정 주제에 대해 발행된 메시지를 브로커에 보관하게 하며, 이후 해당 주제를 구독하는 모든 새로운 구독자에게 이 보관된 메시지를 즉시 전송
    • 이 메시지는 브로커에 의해 삭제되거나 새 메시지로 대체되기 전까지 계속 저장된다.
      • 발행자가 같은 주제에 새로운 메시지를 RETAIN 플래그와 함께 발행하면, 이전에 보관된 메시지는 새 메시지로 대체된다.
      • 만약 발행자가 빈 메시지를 RETAIN 플래그와 함께 해당 주제에 발행하면, 해당 주제의 보관된 메시지는 삭제된다.
    • 1일 경우, 서버는 해당 Topic의 최종 내용을 저장하고 있다가 향후 구독하는 Client에게 이를 전달
      • 발행자가 메시지를 보낼 때 REATIN 플래그를 true로 설정하고 메시지를 발행하면, 해당 메시지는 브로커에 의해 "보존"된다.
      • 새로운 클라이언트가 해당 주제를 구독할 때. 브로커는 즉시 이 보관된 메시지를 새 구독자에게 전송

3) Remaining Length

: 고정 헤더 부분을 제외한 현재 패킷의 전체 길이

  • 1~4 byte까지 사용 가능하다.
    • 각 byte의 bit 0 ~ bit 6 (총 7bit) 로 길이를 표현
    • bit 7은 최상위 비트(Most Significant Bit, MSB), "연속 비트(continuation bit)"라고 함, 다음 byte를 Length 계산에 포함할지 정의하는 데 사용
      - 연속 비트가 1이면 다음 바이트도 길이 정보의 일부임을 나타내고,
      • 0이면 해당 바이트가 마지막 바이트임을 나타낸다.


Variable Header & Payload

특정 타입의 MQTT Control Packet의 경우, 가변 헤더 또는 페이로드 필드를 포함한다.
특정 타입의 패킷들이 이 필드들을 사용하며, 여기에는 요청과 관련된 추가 정보들이 들어간다.

Packet ID : 일부 MQTT 패킷의 경우, Non-Zero 2byte의 Packet ID(=Message ID)가 가변 헤더에 기록되어 있는 경우가 있다.

  • 이 ID를 이용하여 동일 요청에 의한 Packet임을 표현한다.

1) Variable Header

Protocol Name "MQTT"
Protocol Version 예) "3.1.1" = 4
Connect Flags
Keep Alive 예) 60s
Topic Name
Packet Id

2) Payload

Client Id
Will Topic
Will Message
User Name
Password
Application Message 예) "Msg from example"
Topic Filter 예) "ABS/#"
Requested QoS
Granted QoS


CONNECT FLAG

CONNECT 타입의 MQTT 제어 패킷의 경우, CONNECT FLAGS라는 8bit(1Byte)의 정보가 가변 헤더에 포함된다.

  • bit 0은 0으로 예약되어 있다!
  • bit 4와 3이 QoS 레벨을 설정한다. (00/01/10)

아래와 같은 구성을 가진다.
1) bit 7 (Username Flag) : 1로 설정되면, Payload에 사용자 이름이 포함된다는 것
2) bit 6 (Password Flag) : 1로 설정되면, Payload에 비밀번호가 포함된다는 것
3) bit 5 (Will Retain) : 1로 설정되면, 브로커에 의해 보관될 '윌 메시지'가 RETAIN 메시지로 설정됨
4) bit 4 and bit 3 (Will QoS) : 윌 메시지의 QoS 레벨을 설정, 00은 QoS 0을, 01은 QoS 1을, 10은 QoS 2
5) bit 2 (Will Flag) : 1로 설정되면, 연결이 비정상적으로 끊겼을 때 브로커가 윌 메시지를 발행
6) bit 1 (Clean Session) : 1로 설정되면, 이전 세션 데이터를 삭제하고 새 세션을 시작
7) bit 0 (Reserved): 항상 0으로 설정

1) Clean Session

서버와 클라이언트는 안정적인 메시지 송수신을 위해 세션 상태를 저장하고 있다.

  • MQTT의 세션
    • 클라이언트와 브로커 간의 상호작용 상태
    • 구성 요소: 구독 정보(주제/QoS), 미전송 메시지(QoS 1과 2로 발행된 메시지 중), 메시지 상태(QoS 1과 2의 경우)

Clean Session은 재연결시, 이전 세션을 사용할지를 설정하는 것이다.

서버는 클라이언트가 Clean Session Flag를 0으로 설정하여 연결 요청을 하면, 저장되어 있는 세션을 찾아 재활용하고, 1로 설정하여 요구하면 신규 세션을 생성하여 사용한다.

1) Clean Session = 1: 클라이언트와 브로커 간의 세션을 "비지속적(non-persistent)"으로 만든다.

  • 클라이언트가 연결을 끊으면, 모든 구독 정보와 언급된 세션 상태가 삭제된다.
  • 즉, 클라이언트가 다시 연결할 때 새로운 세션으로 시작하며, 이전에 받지 못한 메시지는 전달받지 못한다.

2) Clean Session = 0: 클라이언트와 브로커 간의 세션을 "지속적(persistent)"으로 만든다.

  • 클라이언트의 연결이 끊어졌다가 다시 연결되면 브로커는 클라이언트의 구독 정보와 세션 상태를 유지하며,
  • 클라이언트가 오프라인인 동안 받지 못한 메시지를 전달할 수 있다.

또한, QoS 레벨이 1 or 2인 상황에서 클라이언트가 Clean Session 0으로 서버와 재연결되면, 클라이언트와 서버는 각각 응답을 받지 못한 패킷을 동일한 Packet Id로 재전송해야 한다.

2) Will Flag, Will QoS, Will Retain

MQTT에서 클라이언트는 자신이 접속 종료되었을 때, 특정 Topic(메시지)을 발송하라고 서버에 등록할 수 있다. = Will Message

  • Will Message를 사용하기 위해서는 Will Flag를 1로 설정하여 서버에 연결해야 한다.
  • -> 이렇게 하면 서버는 해당 클라이언트가 연결 종료되었을 때 모든 구독자들에게 Will Message를 발행하여 해당 클라이언트의 연결 상태를 전달한다.

Will Message 전송 시에도 QoS 레벨과 Retain 설정을 할 수 있으며, 이 값은 Connect Flags 내의 Will QoS, Will Retain에 설정된다.

Will Message 전송을 위한 Topic과 MEssage는 페이로드에 포함된다.

3) User Name Flag, Password Flag

1로 설정될 경우, 페이로드에 사용자명, 비밀번호 필드를 사용한다.

  • User Name Flag가 0이면, Password Flag도 0이다!

페이로드의 User Name과 Password는 인증 및 권한 부여를 위해 서버에서 사용 가능


Keep Alive

CONNECT 타입의 MQTT 제어 패킷에 포함되어 전달되는 정보이며, 16bit를 사용한다.

MQTT 프로토콜은 이 Keep Alive 필드를 이용하여 Keep Alive interval을 설정한다.

  • 기본적으로 클라이언트는 Keep ALive Interval이 지나기 전의 메시지 전송을 보장해야 한다.
  • 전송할 메시지가 없는 경우에도 클라이언트는 Connection 연장을 위하여 메시지를 전달해야 하며, 이때 사용되는 제어 패킷이 PINGREQ, PINGRESP이다.

서버는 Keep Alive 시간의 1.5배 내에 아무런 패킷이 들어오지 않으면, 클라이언트와의 연결이 끊겼다고 판단하고, Will 메시지 전송 등의 절차를 수행할 수 있다.

  • Keep Alive 설정의 최대값은 65535초 (18H 12M 15S)

출처: 블로그 + ChatGPT
MQTT 프로토콜 분석 (1)
MQTT 프로토콜 분석 (2)

profile
공부 기록용 & 프로젝트 회고용 24.08.05~ #AI/LLM #RAG

0개의 댓글