본문 바로가기

CS & ITS/CS

QoS란(Quality of Service)란? MQTT의 QoS 동작 방식

더보기

MQTT(Message Queueing Telemetry Transport)는 IoT와 같은 제한된 혹은 대규모 트래픽을 처리하기 위한 프로토콜입니다.

TCP/IP 프로토콜 위에서 동작하지만 더 가볍고 기존 프로토콜의 여러 제약에서 자유롭습니다.

QoS(Quality of Service)란?

QoS는 데이터 전송 과정에서 품질을 보장하는 레벨-수준을 의미합니다.

IoT는 Wifi, Bluetooth, ZigBee와 같은 무선 네트워크 망에서 통신하기 때문에 유선 통신보다 더 불안정한 환경에서 동작합니다.

이처럼 불안정한 통신 망에서 프로토콜 수준에서 품질을 보장하기 위한 기술이 QoS입니다.

MQTT의 QoS 레벨

때로는 메시지의 전송을 보장해야 하며 어떤 경우는 안정성이 떨어지더라도 성능을 우선시해야 하는 경우도 있습니다.

QoS에서는 품질 보장의 정도를 QoS 레벨로 나누어서 관리합니다. 예를 들어 MQTT에서는 3가지 QoS 레벨을 관리합니다.

  • QoS 레벨 0은 보내고 잊습니다.
  • QoS 레벨 1은 최소 한 번은 보냅니다.
  • QoS 레벨 2는 반드시 한 번만 보냅니다.

메시지는 QoS 레벨과 함께 전달되며 레벨에 따라서 지정된 품질을 보장합니다.

따라서 각 메시지가 서로 다른 QoS 레벨에 의해서 지정되며 어떤 메시지를 보내는지에 따라서 품질을 다르게 정할 수 있습니다.

MQTT의 QoS 레벨 0: At most once

메시지는 최대 한 번 전달되거나 전달되지 않을 수 있습니다.

이는 네트워크에서 메시지에 대한 품질 보장을 어떠한 방법으로도 하지 않겠다는 것을 의미합니다.

품질 보장의 의무가 없으므로 메시지는 저장되지 않습니다. Publisher는 메시지를 송신하고 즉시 삭제합니다.

QoS=0는 실행 후 삭제(Fire and Forget)이라고 부르며 가장 빠른 전송 모드입니다.

MQTT의 QoS 레벨 1: At least once

QoS=1은 기본 전송 모드입니다. 메시지는 항상 최소 한 번 전달됩니다.

Publisher는 수신 확인을 완료하지 못하면 메시지는 DUP 플래그가 설정되어 다시 송신합니다.

따라서 Subscriber는 동일한 메시지를 여러 번 수신 할 수 있습니다.

MQTT의 QoS 레벨 2: Extactly once

QoS=2는 가장 안전하지만 가장 느린 전송 모드입니다. 메시지는 반드시 한 번만 전달됩니다.

네트워크에서 완전한 품질을 보장하며 이를 위한 PUBACK 과정에서 3 Way Handshake가 추가됩니다(Receive, Release, Complete).

PUBREC에서 Loss가 생겨 Publisher에서 메시지를 다시 보내더라도 Broker는 이전 상태를 모두 알고 있기 때문에 메시지를 중복으로 보내지 않습니다.

Publisher는 PUBREC를 수신하면 PUBREL를 발생시킵니다. 이제 Publisher는 더 이상 중복 메시지를 보내지 않습니다.

PUBCOM를 받은 Broker와 Publisher는 메시지가 완전히 전송되었으니 더 이상 메시지를 저장 할 필요가 없습니다.

정리 및 복습

  • QoS는 데이터 전송 과정에서 품질을 보장하는 수준을 의미합니다.
  • MQTT의 QoS 레벨 0은 최대 한 번 보냅니다.
  • MQTT의 QoS 레벨 1은 최소 한 번 이상 보냅니다. Publisher는 PUBACK를 받기 전까지 메시지를 중복으로 송신합니다.
  • MQTT의 Qos 레벨 2는 정확히 한 번 보냅니다. 이를 위해 3 Way Handshake가 추가됩니다(Receive, Release, Complete).