Network/IoT-MQTT

MQTT QoS(Quality of Service)

양디 2016. 2. 6. 14:35


QoS 란?


QoS는 서비스의 질을 보장해주는 레벨을 의미한다.


사물인터넷은 무선의 네트워크 망에서 통신한다. 


와이파이, 지그비, 블루투스 등을 사용하는데 이러한 통신망은 아무래도 유선 통신보다 불안정하다.


따라서 이러한 불안정함을 프로토콜 상에서 안정적으로 보내주기 위하여 QoS가 필요하다.


QoS 레벨


그러나 통신을 할 때에 항상 완벽하게 보내야 할 필요는 없다.


때로는 보내져도 좋고, 안보내져도 상관 없는 경우도 존재한다.


따라서 QoS를 지켜야 할 정도를 등급(레벨)로 나누어서 구분하는데, MQTT에는 3가지 레벨로 정의한다.




위의 사진이 MQTT의 QoS 이다.


QoS 레벨 0은 보내고 잊는다. 잊는다는 것은 저장하지 않는다는 뜻이다. 

한번에 전송이 성공하지 않으면 전송은 실패한 상태로 끝이 난다.

QoS를 보장하지 않는 상태라고 보면 된다.


레벨 1은 최소 한번은 가게 된다.

정상적으로 통신할 경우 1번을 보내게 된다.

그러나 다음의 시나리오를 생각해보자.


1. Publisher가 Broker에게 정상적으로 보낸다.

2. Broker는 받은 메시지를 Subscriber에게 정상적으로 보낸다. (Subscriber는 메시지를 1회 받음)

3. Broker는 메시지를 보냈으므로 PUBACK을 Publisher에게 보낸다.

4. 그러나 PUBACK이 전달 중에 사라졌다. (Loss 발생)

5. Publisher는 PUBACK을 기다리다가, 시간이 지나자 전송이 실패한 줄 알고 다시 Broker에게 보낸다.(Duplicate Publish)

6. Broker는 메시지에 관한 정보를 지웠기 때문에, 처음 받는 메시지인줄 알고 다시 Subscriber에게 보낸다.(Subscriber는 똑같은 메시지를 2번째 받음)

7. 다시 PUBACK을 보내고, 정상 종료된다.

8. Publisher가 PUBACK을 받고, 통신은 종료된다.


위의 시나리오를 보면, PUBACK이 중간에 loss되면 2개 이상의 중복 패킷을 받게되는 경우가 분명히 생길 수 있다는 것을 알 수 있다.


레벨2는 딱 한번만 가게 된다.


레벨 2는 PUBACK의 과정을 3 Way handshaking으로 바꿈으로 정확히 1번만 가도록 구현하였다.


1. Publsiher가 메시지를 보낸다.

2. Broker가 메시지를 전달한다. (Subscirber 1회 전달받음)

3. Broker가 Publisher에게 PUB Recevied를 보낸다.

4. PUBREC이 분실되어 Publisher가 다시 메시지를 보내도, Broker는 메시지를 이미 갖고 있기 때문에 Subscriber에게 다시 메시지를 보내지 않고 PUBREC를 다시 보낸다.

5. Publisher는 PUBREC를 받으면, 이제서야 Publish Release 메시지를 보낸다.

6. PUBREL이 loss되는 것은 문제가 없다. 브로커는 이미 보냈다는 사실을 알고 있기 때문에 새로 보내지 않는다.

7. PUB REL을 받으면, 이제서야 메시지를 삭제한다.

8. 메시지를 정상 종료하였으므로 PUBCOMPLETE를 보낸다.


위와 같은 시나리오대로 메시지를 정확하게 한번만 보낼 수 있게 된다.


이 외에 QoS -1 레벨이 MQTT-SN을 위하여 존재하는데, 이는 클라이언트-브로커 연결이 되지 않아도 메시지를 보내는 것이다.


일반적으로 QOS 0,1,2 레벨은 클라이언트-브로커 연결이 된 이후에 Publish를 하는 것인데


유일하게 -1 레벨은 연결을 확인하지도 않고 메시지를 그냥 던지는 것이다.





Tag
댓글 2
  • 프로필사진build 방문자 2016.02.17 20:48

    mqtt가 tcp에서 구동하는걸로 알고있는데 qos는 어떤 의미가 있는건지 알고싶네요...

    edit
  • 프로필사진 2016.02.17 21:17 신고 양디build

    저희 교수님도 하셨던 질문이네요..

    그때 찾아보았던 검색 내용을 첨부합니다.

    http://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels

    Hi Fernando,

    this is a great question! A very extensive and in-depth answer by Andy Stanford-Clark (one of the inventors of MQTT) can be found here in the following link, make sure to check it out: https://groups.google.com/forum/#!searchin/mqtt/stanford/mqtt/6JZTV5XIwEQ/9K6QolImMdUJ

    To summarize the excellent link: TCP offers reliability on top of the TCP / IP stack, MQTT offers application-to-application data reliability. This differentiation is very important if you are dealing with unreliable networks (mobile, wifi, …) since in-flight packets can get lost if your TCP connection drops.

    Hope this helps!

    짧게 번역하자면, TCP는 TCP/IP 스택에서의 안정성을 보장해주고, MQTT는 어플리케이션 레벨에서 안정성을 보장해준다고 합니다.

    MQTT가 사물 인터넷 프로토콜로 적합하다는 평을 듣는 이유는 제한되고 불안정한 네트워크 환경에서도 안정성을 보장해준다는 것인데, 무선 통신의 경우가 특히 불안정하죠.

    TCP가 안정성을 보장해주는 것은 맞지만, 이 TCP/IP 환경 자체가 불안정한 상황에서는 어플리케이션 레벨에서 통신을 확실하게 성공시킬 필요가 있다 - 라고 이해했었습니다.

    즉 데이터가 전송 중에 TCP 연결이 끊겨버리면, 날아가던 데이터들은 loss될 수 있으니,
    어플리케이션 레벨에서 loss를 체크해주고 다시 보내야 할 필요성이 있다- 정도가 되지 않을까 싶네요.

    또한 MQTT-SN의 경우에는 TCP가 아닌 경우에도 사용되기 때문에 QoS는 더욱 필요하게 되는거구요.

    아직 제가 배움이 얕아서 도움이 되셨을까 모르겠습니다