MQTT 프로토콜 개념과 이해

안녕하세요. 요즘 졸업 준비가 한창이어서, (핑계지만.. ㅜㅜ) 블로그에 글을 자주 못쓰게 되는군요. 


MQTT 프로토콜에 대한 글을 작성해보려 합니다. MQTT는 제가 현재 졸업 작품에서 사용하고 있는 통신 프로토콜인데요. 처음에는 XMPP 를 사용하여 메시지를 교환하려고 하였으나, 교수님의 조언으로 MQTT 를 사용하게 되었습니다.



MQTT는 무엇일까, XMPP랑 차이는?

제 블로그 포스트에서 XMPP 관련 포스트를 보신 분이시라면, 이 글도 반드시 참고해보시기 바랍니다. 과거 제가 채팅 서비스를 구현하기 위해 XMPP 프로토콜을 사용한 적이 있었습니다. XMPP는 예전 Google Talk 과 Facebook Messenger 에서 사용한 채팅 프로토콜로 현재는 Hangouts 서비스는 XMPP와 호환되는 자체 프로토콜을, Facebook Messenger는 MQTT 프로토콜로 바뀌었습니다.


MQTT 프로토콜은 Message Queue TELEMETRY TRANSPORT 의 약자로, 통신 장비, 모바일, 스마트폰 기기에 최적화된 가벼운 메시징 프로토콜로 IoT 장비에 현재 많이 사용되고 있는 프로토콜입니다. 


물론 메시징 프로토콜에는 HTTP나 HTTPS를 사용할 수도 있지만, IoT와 같은 라이트 장비 (스펙이 높지 않은 장비)에 대해서 단순 메시징 교환을 위해 무거운 프로토콜을 사용하게 되면 그만큼 성능 저하가 생기게 됩니다. 


XMPP 프로토콜의 경우, 메시징 교환으로 적절하지만, 메시지의 크기와 형태가 일반적인 문자열이 아닌 xml 파일 형식으로 주고 받기 때문에 리소스가 크다는 단점이 있습니다.


그래서 사용한 것이 바로 MQTT 입니다.



MQTT (MQ Telemetry Transport)

MQTT는 Broker Pattern을 채택하여 개발된 경량형 메시징 프로토콜로, 1999년 IBM, Eurotech에서 개발하였다가 현재 IBM에서 버전 3.1.1 까지 내놓았습니다.


Broker Pattern을 사용한다는 것은 HTTP, XMPP와 같이 Client-Server Model을 수용하지만, 약간 다릅니다. 보통 메시지 교환 프로토콜은 클라이언트가 전달할 메시지를 서버에게 주고, 서버는 누가, 누구에게 어떤 메시지를 줄 것인지 를 전달 받아, 서버가 클라이언트에게 전송하는 방식입니다.


하지만 Broker Pattern은 Broker 라는 중계자가 중계 서버 등으로 존재하고, 해당 서버에서 Topic (주제)를 선정하고, 해당 Topic 의 구독자들에게 메시지를 전달해주는 방식입니다. 



Broker Pattern을 간단히 그림으로 나타내어 봤습니다. 스마트폰에서 어떤 데이터를 애플리케이션 서버에게 주려고 합니다. 그러면 스마트폰에서는 브로커에게 Topic를 던져주고, 메시지를 남깁니다. 애플리케이션 서버는 스마트폰이 만들어 놓은 Topic 을 구독하여 메시지가 올 때마다 수신하는 것입니다.


같은 방법으로, 왼쪽에 있는 Sensor Device 들도 자신들의 Topic을 만들고, 해당 Topic에 메시지를 보냅니다. 그러면 구독하고 있는 애플리케이션 서버는 해당 메시지를 받아 처리하는 것이지요.


이렇게 하면, 1 : 1 뿐만 아니라, 1 : N, N : N 통신도 쉽게 구현이 가능합니다. 원하는 사용자가 해당 Topic을 구독(Subscribe)하여 메시지를 받고, 그에 대응하는 메시지를 발행(Publish) 할 수 있기 때문이죠. 일반적인 채팅 서버를 만드는 것에 비하면 굉장히 리소스를 덜 필요로 한다는 것이 특징입니다.



MQTT 특징 정리

위에서 간단한 특징을 설명해 드렸듯이 MQTT는 일정한 주제를 놓고, 해당 주제를 서버에 입력해 채팅하는 통신 방식입니다. 그 외에도 여러 특징들이 있습니다.


- 단순하고 가벼운 메시징 프로토콜

- 오버헤드를 최소화 하기 위해 헤더 크기를 대폭 줄이고, Payload 데이터에 중립

- QoS 지원

- 클라이언트와 서버 간 연결이 끊어졌을 때의 보정 기능 제공

- TLS/SSL 지원 (X.509를 이용한 양방향 인증 지원)

- 사용자 인증 방식 제공

- 오픈 소스


MQTT를 도입했을 때 가장 크게 고려하는 부분이 있다면, 아마 보안 문제일 것입니다. http, xmpp는 TLS/SSL 등을 사용해 메시지를 암호화할 수 있는데요. MQTT에서도 이를 지원하기 때문에 보안 문제를 고려하고 계신다면, 안심하셔도 됩니다.


프로토콜 자체가 가벼워서 IoT에 사용하기에 적합합니다. Raspberry PI 에 사용되는 리눅스 기반 운영체제에 간단하게 포팅할 수 있고, Windows 에서도 사용이 가능합니다.



MQTT Broker

MQTT를 사용하려면, 메시지를 보내는 사람과 받는 사람이 있고, 그 다음 메시지를 중계해 줄 Broker가 필요합니다. MQTT Broker에는 여러가지가 존재합니다.


MQTT Broker list


Netty 기반에서 동작하는 Mosquette, Eclipse에서 개발한 Paho 등 여러가지가 존재합니다. 저는 이 중에서 Mosquitto를 사용하였습니다. 가장 많은 언어를 지원하고, 여러가지 제약은 아직 존재하지만, MQTT를 통신하는 데 있어 가장 무난합니다. 실제 Facebook 에서도 Broker로 Mosquitto를 채택해 사용 중입니다.



마치며...

여기까지 MQTT에 대해 알아봤습니다. 프로토콜 자체는 그렇게 어려운 프로토콜이 아닙니다. 다만 최근에는 메시지 교환 프로토콜이 널리 쓰이고 있습니다. 위에서 얘기한 채팅 뿐만 아니라 센서들 간의 메시지 교환, Push 알림 등이 존재합니다. Push 알림도 서버를 사용한다면, 쉽게 구현할 수 있지만, 센서들 간의 메시지 교환에는 전력 한계와 성능 한계치가 존재합니다. 전력을 많이 소모하게 될 경우, IoT 장비에서 불리해지기 때문이지요.


만약 이런 문제를 고려하고 계신다면, MQTT 프로토콜 사용을 한 번 권해봅니다. 


Linux에서 Mosquitto 설치


설치하는 방법의 글을 보시려면 위 버튼을 클릭하시기 바랍니다.

'Network' 카테고리의 다른 글

MQTT 프로토콜 개념과 이해  (0) 2017.08.26
네트워크 프로그래밍의 기초 - Socket  (0) 2017.04.09
IP MASQUERADE  (0) 2016.07.02
NAT (Network Address Translation)  (0) 2016.06.24
TAGS. ,
comments powered by Disqus

Tistory Comments 0