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 레벨은 연결을 확인하지도 않고 메시지를 그냥 던지는 것이다.





댓글