현재 내가 프로젝트 iot 시스템을 구현 중인데 이 프로젝트에서 mqtt 통신이 핵심이 돼 내가 공부할 겸 mqtt 프로토콜에 대해서 이해한 내용들을 간략하게 정리해봤다...!
python과 같은 다양한 언어에서 MQTT 프로토콜 라이브러리를 지원한다. 따라서 최소한의 코드 작업으로 MQTT 프로토콜을 사용하는 애플리케이션을 구현할 수 있다.
→ 이러한 이유로 Iot 데이터 전송 표준으로 사용된다.
게시/구독 모델의 원칙을 기반으로 작동한다. 전통적으로 사용한 네트워크 통신의 모델인 클라이언트-서버 모델은 클라이언트에서 서버 측으로 요청하면 서버는 이를 응답하고 요청을 처리하는 방식으로 서로 데이터를 직접 주고 받는다.
하지만 MQTT의 통신에서는 Publisher(게시자), Subscriber(구독자)를 분리한 대신 Broker 라는 매개자를 도입해 메세지를 대신 전달해주는 역할을 한다. Broker는 게시자로부터 수신되는 모든 메세지를 필터링하고 구독자에게 직접 배포하는 중재 역할을 한다.
→ 하나의 토픽에 대해서 여러 구독자가 구독할 수 있게 하므로 1:N 통신에도 효과적이다.
공간 분리
• 게시자와 구독자는 서로의 네트워크 위치를 모르며 IP 주소 or Port 번호와 같은 데이터 교환 X
시간분리
• 게시자와 구독자는 동시에 실행되거나 네트워크를 통해 연결 X
동기화 분리
• 게시자와 구독자는 서로를 중단시키지 않고 메시지를 전송하거나 수신 가능
(ex, 구독자는 게시자가 메세지를 전송할 때까지 기다리지 않아도 됨)
아래는 mqtt 프로토콜을 통해 broker와 client가 서로 연결하고 작동하는 방식에 대한 간단한 설명이다.
클라이언트와 브로커가 TCP/IP 연결이 완료되면 클라이언트는 CONNECT 패킷을 보내고 브로커는 이에 대한 대답으로 CONNACK 패킷을 전송한다.
(CONNACK 패킷에는 연결이 수락되었는지 or 거부되었는지를 나타내는 반환 코드가 포함)
topic은 게시한 메세지의 라벨과 같은 제목(UTF-9 문자열)으로 해당 토픽을 구독한 클라인어트 모두에게 해당 토픽 메세지를 브로커가 배포한다.
토픽은 우리가 친숙한 url 구조의 Path 부분처럼 주소 지정 형식을 사용하는데 슬래시(/)로 각 토픽들을 계층화하고 구분할 수 있다.
Mqtt Topic의 여러가지 사항들이 있는데 간단하게 정리하면 다음과 같다.
QoS는 Quality of Service의 약자로 mqtt 프로토콜만 아니라 다양한 네트워크 및 통신의 영역(ISP, VoIP 등)에서 사용되는 말 그대로 메세지의 quality를 보장하는 서비스이다.
무선 네트워크 통신 망은 아무래도 유선 네트워크 망과 비교해 방해 요소도 다양하고 불안정 할 수 밖에 없다. 하지만 메세지의 타입과 구현하는 시스템의 성격에 따라 무선 네트워크 망에서 항상 완벽한 수준으로 데이터를 전송할 필요가 없는 케이스도 존재한다.
QoS는 이러한 각기 다른 요구 사항에 따라 메세지 전송 퀄리티에 대해 “얼만큼 보장해야 하나?” 에 대해서 차등을 준 서비스의 수준으로 mqtt에서는 3개의 레벨로 구분한다.
- QoS-0 (”최대 한 번”)
가장 낮은 수준의 보장 서비스로 메세지는 딱 한번 전송되며 클라이언트에게 전달 여부를 확인하지 않고 바로 잊어버린다.
“Fire and Forget” 타입이라고도 하며, 전달 여부를 확인하지 않고 딱 한번 메세지를 전송하므로 전송 퀄리티 보장 정도는 낮지만 가장 빠른 전송 레벨이다.- Qos-1 (”적어도 한 번”)
중간 수준의 서비스로 메세지가 적어도 한 번은 클라이언트 측으로 전달되도록 보장한다. 이는 전달 여부를 확인해 메세지가 정상적으로 전달되지 못 했으면 다시 메세지를 보내기 위해 시도한다.
하지만 메세지가 중복될 수 있으며 메세지가 도착한다는 보장은 있지만 한 번만 도착한다는 보장은 없다.- Qos-2 (:”정확히 한 번”)
가장 높은 수준의 보장 서비스로 각 메세지가 의도한 클라이언트에게 한 번만 정확히 수신되도록 한다. 메세지의 핸드셰이킹 과정을 추적하며 가장 안전하고 퀄리티를 보장하지만 반대로 가장 느린 전송 레벨이다.
QoS 레벨은 게시자가 브로커에게 메세지를 게시할 때 지정되며 브로커는 지정된 QoS 레벨을 사용해 구독한 클라이언트들에게 일정 퀄리티의 서비스를 보장하며 메세지를 배포한다.
MQTT 프로토콜은 TCP/IP을 기반으로 한 Application Layer의 프로토콜로 명령 및 응답 메세지 형식을 사용한다. MQTT packet은 고정 헤더, 가변 헤더, 페이로드로 최대 세 부분으로 구성된다. 각 필드의 타입과 사이즈는 아래의 표를 참고하면 된다.
위의 패킷 구조 table을 참고하면 알 수 있듯이 MQTT 프로토콜의 가장 작은 패킷의 사이즈는 2byte로 경량화 메시징 프로토콜로 저전력/낮은 리소스로 다양한 서비스 구현이 가능하다.
시중에 라이브러리 형식으로 사용 가능한 MQTT Broker들이 다수 존재한다. 각각의 broker 들마다 고유한 기능과 특징이 존재하며 다음은 그 중 몇 가지 예와 간단한 설명이다.
글 잘 봤습니다, 감사합니다.