티스토리 뷰

개발공부/🎸 ETC..

[MQTT] MQTT란 무엇인가?

2023. 8. 9. 14:21

1️⃣  MQTT 란?

 

MQTT는 IoT, 산업용 IoT(IIoT) 및 M2M(machine to machine) 애플리케이션에 광범위하게 사용되는 ISO 표준 발행-구독 기반 메세징 프로토콜(protocol)이다.

 

 

공식 문서에서 MQTT에 대한 요약은 아래와 같다.

MQTT is a Client Server publish/subscribe messaging transport protocol. It is lightweight, open, simple, and designed so as to be easy to implement. These characteristics make it ideal for use in many situations, including constrained environments such as for communication in Machine to Machine (M2M) and Internet of Things (IoT) contexts where a small code footprint is required and/or network bandwidth is at a premium.

MQTT는 클라이언트 서버 발행/구독 메시징 전송 프로토콜이다. 이는 가볍고 개방적이며, 단순하고 구현하기 쉽도록 설계되었다. 
이러한 특성은 작은 코드 설치 공간이 필요하고 네트워크 대역폭이 중요한 M2M(Machine to Machine) 및 IoT(Internet of Things) 컨텍스트의 통신과 같은 제한된 환경을 포함하여 많은 상황에서 사용하기에 이상적이다.

 

MQTT는 작은 코드 설치 공간(small code footprint)이 필요하거나 제한된 네트워크 대역폭으로 원격 장치를 연결하는데 이상적인 초경량 발행-구독 메세징 전송 방식으로 설계되었다.

 

 

 

 

MQTT 프로토콜의 특징으로는 아래와 같은 것들이 있다.

 

1)  초경량 & 효율 (Lightweight and efficient)

MQTT는 간단하고 효율적이며 리소스를 많이 사용하지 않도록 설계되었다.

MQTT를 IoT 디바이스에 구현할 때 최소한의 리소스만 필요하며 아주 작은 전력만 소비된다.

 

예를 들어, 가장 작은 MQTT 제어 메세지는 2btye만큼 작다. MQTT 메세지 헤더도 작기 때문에 네트워크 대역폭을 최적화할 수 있다.

 

 

2)  확장성 (Scalable)

많은 수의 IoT 디바이스와의 통신을 지원하기 위한 기본적인 기능을 갖추고 있다.

MQTT 프로토콜을 구현하여 수백만 개의 디바이스를 연결할 수 있다.

 

 

3)  신뢰성 (Reliable)

많은 IoT 디바이스는 대역폭은 낮고 지연 시간은 긴 신뢰할 수 없는 셀룰러 네트워크를 통해 연결하지만, MQTT는 IoT 디바이스에서 클라우드에 다시 연결하는데 소요되는 시간을 줄여주는 기능이 기본적으로 탑재되어 있다. 

또한 최대 1회, 최소 1회, 정확히 1회라는 3가지 서비스 품질 수준을 정의하여 IoT 사용 사례에 필요한 신뢰성을 보장한다.

 

 

4)  보안 (Secure)

MQTT를 사용해 메세지를 손쉽게 암호화하고 OAuth, TLS1.3, 고객 관리형 인증서 및 기타 최신 인증 프로토콜을 사용하여 디바이스와 사용자를 인증할 수 있다.

 

 

5)  우수한 지원 (Well-supported)

Python 같은 다수의 언어가 MQTT 프로토콜 구현을 광범위하게 지원한다.

모든 유형의 애플리케이션에서 최소한의 코드 작업으로 빠르게 MQTT 프로토콜을 구현할 수 있다.

 

 

 

 

 

 

 

💡 MQTT 프로토콜의 역사

 

MQTT 프로토콜은 1999년 정유 및 가스 사업에서 최소한의 대역폭과 최소한의 배터리 손실을 지원하는 프로토콜로 위성을 통해 정유 파이프라인을 모니터링하기 위해 사용할 목적으로 발명되었다. 

 

MQTT는 IBM 제품인 MQ 시리즈가 초기 단계를 처음으로 지원했기 때문에 Message Queuing Telemetry Transport으로 알려졌는데, 현재는 Message Queuing Telemetry Transport의 약어가 아니라 프로토콜의 공식 이름으로 여겨진다.

 

 

 

 

 

 

 

 

2️⃣  MQTT의 원리

 

MQTT 프로토콜은 발행-구독(publish/subscribe) 모델의 원칙을 기반으로 동작한다.

 

 

전통적인 네트워크 통신

 

-  클라이언트와 서버가 서로 직접 통신한다.

-  클라이언트가 서버의 리소스 또는 데이터를 요청하면 서버가 이를 처리한 후 응답을 보낸다.

 

 

 

MQTT

 

-  발행/구독 패턴을 사용하여 메세지 발신자(발행자)와 메세지 수신자(구독자)를 분리한다.

-  메세지 브로커라는 제3의 구성 요소가 발행자와 구독자 간의 통신을 처리한다.

-  브로커는 발행자(publisher)로부터 수신되는 모든 메세지를 필터링하고 구독자(subscriber)에게 직접 배포한다.

 

 

브로커는 발행자(메세지를 보내는 클라이언트)와 구독자(메세지를 받는 클라이언트)를 아래와 같이 분리한다.

 

1)  공간 분리 (Space decoupling) 

:  발행자와 구독자는 서로의 네트워크 위치를 모르며, IP 주소 또는 포트 번호와 같은 정보를 교환하지 않는다.

 

2)  시간 분리 (Time decoupling) 

:  발행자와 구독자는 동시에 실행되거나 네트워크를 통해 연결되지 않는다.

 

3)  동기화 분리 (Synchronization decoupling)

:  발행자와 구독자는 서로를 중단시키지 않고 메세지를 전송하거나 수신할 수 있다. 

 

 

 

 

 

 

 

 

 

3️⃣  MQTT 구성 요소

 

이미지 출처 : https://mqtt.org/

 

MQTT 클라이언트 (MQTT client)

 

기본적으로 네트워크를 통해 MQTT를 사용하여 통신하는 모든 디바이스(서버부터 MQTT 라이브러리를 실행하는 마이크로컨트롤러 등)를 MQTT 클라이언트라고 할 수 있다.

 

클라이언트는 메세지를 보내는 경우에는 발행자 역할을, 메세지를 수신하는 경우에는 구독자 역할을 한다.

 

 

 

MQTT 브로커 (MQTT broker)

 

MQTT 브로커는 여러 클라이언트 간의 메세지를 조정하는 백엔드 시스템이다.

 

브로커는 메세지 수신 및 필터링, 각 메세지를 구독하는 클라이언트 식별, 메세지 전송 등과 같은 작업을 담당한다.

또한, MQTT 클라이언트 권한 부여 및 인증, 추가 분석을 위해 다른 시스템으로 메세지 전달, 누락된 메세지 및 클라이언트 세션 처리 등과 같은 태스크도 처리한다.

 

 

 

MQTT 연결

 

클라이언트와 브로커는 MQTT 연결을 사용하여 통신을 시작한다.

(클라이언트는 CONNECT 메세지를 브로커로 보내 연결을 시작 / 브로커는 CONNACK 메세지로 응답하여 연결이 설정되었음을 확인)

 

MQTT 클라이언트와 브로커는 모두 TCP/IP 스택이 있어야 통신을 할 수 있다.

 

클라이언트는 서로 연결되지 않으며 브로커에만 연결한다.

 

 

 

 

 

 

 

4️⃣  MQTT 작동 방식

 

1)  MQTT 클라이언트가 MQTT 브로커와 연결을 설정한다.

2)  연결이 완료되면 클라이언트에서 메세지를 발행하거나 특정 메세지를 구독하거나 둘 다 실행할 수 있다.

3)  MQTT 브로커는 메세지를 수신한 후 메세지에 관심이 있는 구독자에게 메세지를 전달한다.

 

 

 

MQTT topic

:  MQTT 브로커가 MQTT 클라이언트를 위한 메세지를 필터링할 때 사용하는 키워드

 

topic은 파일 또는 폴더와 유사한 계층 구조로 정렬된다.

 

예를 들어, 여러 층으로 된 주택에서 작동하는 스마트 홈 시스템을 가정해보자.

각 층에는 서로 다른 스마트 디바이스가 있을 때, 이 경우 MQTT 브로커는 topic을 아래와 같이 정렬할 수 있다.

myhome/groundfloor/livingroom/light
myhome/firstfloor/kitchen/temperature

 

 

 

 

MQTT publish

:  MQTT 클라이언트는 주제 및 데이터가 바이트 형식으로 포함된 메세지를 발행(publish)한다.

 

클라이언트는 텍스트 데이터(text data), 바이너리 데이터(binary data), XML, JSON 파일과 같은 데이터 형식을 결정한다.

 

예를 들어, 스마트 홈 시스템의 조명은 livingroom/light 라는 topic에 on이라는 메세지를 발행할 수 있다.

 

 

 

 

MQTT subscribe

:  MQTT 클라이언트는 MQTT 브로커에게 SUBSCRIBE 메세지를 보내 관심 topic에 대한 메세지를 수신한다. 이 메세지에는 구독에 대한 고유 식별자와 목록이 포함된다.

 

예를 들어, 휴대폰의 스마트 홈 앱을 사용하여 집 안에 켜져 있는 조명의 수를 표시하려면 light라는 topic을 구독하고 모든 on 메세지의 카운터를 증가시킨다.

 

 

 

 

 

 

 

5️⃣  MQTT over WSS

 

MQTT over WebSockets(WSS)는 데이터를 웹 브라우저로 직접 수신하는 MQTT 구현이다.

 

MQTT 프로토콜은 자바스크립트 클라이언트를 정의하여 브라우저에 대한 WSS 지원을 제공한다.

이 경우, MQTT 프로토콜은 평상시와 마찬가지로 작동하지만 MQTT 메세지에 추가 헤더를 삽입하여 WSS 프로토콜도 지원한다.

(MQTT 메세지 payload가 WSS 봉투로 포장되었다고 생각하면 된다)

 

 

 

 

 

 

 

6️⃣  이 외 MQTT의 특징

 

MQTT는 안전한가?

 

MQTT 통신은 SSL 프로토콜을 사용하여 IoT 디바이스에서 전송되는 민감함 데이터를 보호한다. SSL 인증서와 암호를 사용하여 클라이언트와 브로커 간의 ID, 인증 및 권한 부여를 구현할 수 있다.

 

MQTT 브로커는 일반적으로 암호와 각 클라이언트에 할당되는 고유 클라이언트 식별자를 사용하여 클라이언트를 인증한다.

 

대부분의 구현에서 클라이언트는 인증서 또는 DNS 조회를 통해 서버를 인증한다.

 

MQTT와 함께 암호화 프로토콜을 구현할 수도 있다.

 

 

 

 

MQTT는 RESTful인가?

 

MQTT는 RESTful이 아니다.

 

REST (Representational State Transfer)는 네크워크 통신에 대한 아키텍처 접근 방식으로, 메세지 발신자와 수신자 간의 요청-응답(request-response) 패턴 통신을 사용한다.

 

MQTT는 이와 반대로 애플리케이션 계층에서 발행-구독 모델 통신을 사용하며, 메세지를 푸시 방식으로 전송하기 위한 고정된 TCP 연결이 필요하다.

 

그러나 MQTT 버전 5에는 REST와 유사한 방식으로 작용하는 새로운 요청-응답 메서드를 추가되어

발행자는 특수한 response topic을 첨부할 수 있고 수신자는 이를 처리하여 적절한 응답(response)을 생성할 수 있다.

 

 

 

 

 

 

 

 

 

참고자료

🔗 [mqtt.org]  Getting started - MQTT Essentials

🔗 [aws]  MQTT란 무엇인가요?

🔗 [wikipeida] MQTT

🔗 [paho.mqtt.javascript]

 

 

반응형
프로필사진
개발자 삐롱히

프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그