Mobile QR Code QR CODE : The Transactions of the Korean Institute of Electrical Engineers

  1. (Dept. of Smart ICT Convergence, Konkuk University, Korea.)



Quality of Service(QoS), MQTT, Publish-subscribe Model, Synchronous communication

1. 서 론

Message Queuing Telemetry Transport(MQTT)는 ISO 표준(ISO/IEC PRF 20922) 발행-구독(publish-subscribe) 통신 모델 기반의 메시지 전송 프로토콜이다. MQTT는 TCP/IP 프로토콜 위에서 동작하며, 비동기식 통신을 기반으로 한다. 비동기식 통신에서 송신자는 메시지를 전송한 이후 그에 대한 메시지 수신자의 응답을 기다리지 않고 즉시 다음 작업을 수행한다. MQTT에서는 송신자(publisher)가 메시지를 발행한 이후 별도의 기다림 없이 바로 다음 작업을 수행한다.

MQTT에서는 서버(Broker)와 송신자(publisher) 및 수신자(subscriber) 클라이언트 간 메시지를 전달할 때의 신뢰도를 보장하기 위해 3개의 Quality of Service(QoS) 레벨을 지원한다.

MQTT는 주로 Machine to Machine (M2M) 과 Internet of Things (IoT) 컨텍스트와 같이 리소스가 제한된 환경을 포함해 다양한 상황에서 사용된다. MQTT는 헬스 케어 분야에서도 사용되고 있는데, 센서 등을 사용해 측정한 환자의 건강 정보를 의료진에게 전달할 때 주로 사용된다. 이와 관련해 Con- nected health를 위한 서버 기반 구조가 연구되었다(1). 헬스 케어 분야에서는 환자의 정보를 의료진이 제대로 전달받는 것이 중요하다. 특히 생명과 직결되는 정보일 경우 그 중요성은 커진다. 만약 환자의 상태 정보가 계속 변화하고 있다면, 환자 측에서는 의료진에게 받은 처방이 변화한 자신의 현재 정보를 확인하고 내린 처방인지 알아본 이후 처방을 적용해야 한다. 만약 환자 측이 보낸 변화한 상태 정보를 의사 측이 아직 전송받지 못한 상황에서 의사 측이 보낸 이전 상태에 대한 처방을 환자 측이 적용한다면 문제가 생길 수 있다. 기존 MQTT에서는 환자 측에서 보낸 정보가 의료진에게 제대로 전달되었는지 여부를 별도로 확인할 수 있는 방법이 없다. MQTT가 사용되는 또다른 상황으로 페이스북 메신저를 꼽을 수 있다. 페이스북은 페이스북 메신저에 MQTT를 사용하고 있다(2). 페이스북 메신저와 같은 통신 애플리케이션에서는 사용자가 보낸 메시지가 상대방에게 잘 도착하는 것이 중요하다. 특히나 상대방과 대화를 하는 도중이라면 보내는 메시지의 순서가 꼬이지 않도록 자신이 전송한 메시지를 상대방이 받았는지 확인한 이후에 다음 메시지를 보내야 할 것이다.

위와 같은 사례들에서, 송신자는 메시지를 보낸 이후 수신자가 자신이 보낸 메시지를 제대로 받았는지 확인해야 할 필요가 있다. 그러나 MQTT가 발행-구독 기반의 프로토콜이고, 비동기식 통신을 채택하고 있기 때문에 기존의 QoS 레벨은 클라이언트와 서버 사이의 메시지 전달 여부만을 보장한다. 지금의 MQTT에서 메시지를 발행한 송신자 클라이언트는 수신자 클라이언트가 자신이 보낸 메시지를 제대로 받았는지 확인할 수 있는 별도의 방법이 존재하지 않는다. 앞서 언급되었듯 수신자 클라이언트가 메시지를 전송받았는지 송신자 클라이언트가 확인해야 할 필요성이 있는 사례들이 있지만, 현재의 MQTT 프로토콜 상에서 송신자가 보낸 메시지가 수신자에게 확실하게 전송되었는지 송신자가 알 수 있는 방법은 없다. 만약 송신자가 메시지 전송 여부를 확인하고 싶을 경우, 복잡한 과정을 거쳐야만 한다. 송신자 클라이언트가 발행한 메시지를 해당 토픽을 구독 중인 수신자 클라이언트들이 전송받은 이후, 수신자 클라이언트는 자신이 메시지를 받았음을 알리기 위해 새로운 메시지를 발행해야 한다. 송신자 클라이언트는 해당 응답을 받기 위해 새로운 토픽을 구독하고 있어야만 한다.

MQTT와 관련된 기존의 연구들에서는 특정한 상황에서 유용하게 사용될 수 있도록 기존의 MQTT를 변형하고 기능을 추가했으나, 전부 기존의 비동기식 통신 방식을 따랐다. 요청-응답 패턴을 사용하는 비동기식 시스템에 동기식 통신을 추가한 연구가 있지만, MQTT는 발행-구독 패턴을 기반으로 하기 때문에 그에 맞는 동기식 통신 방식이 필요하다.

본 논문에서는 송신자가 자신이 보낸 메시지를 수신자가 받았는지 확인할 수 있도록 MQTT의 송신자와 수신자 간의 동기식 통신을 보장하는 새로운 Quality of Service(QoS) 레벨 3을 만들어 기존의 MQTT를 보완했다.

동기식 통신이란 서버와 클라이언트 간의 통신에서 클라이언트가 서버로 메세지를 보낸 후 서버가 응답 메세지를 보낼 때 까지 다음 작업을 하지 않고 기다리는 것이다. 클라이언트는 서버에게서 응답 메세지를 받은 이후에 다음 실행해야할 작업을 계속할 수 있다(3).

QoS 레벨 3은 기존 QoS 레벨에 동기식 통신을 추가한 것으로, 송신자의 메시지가 수신자에게 동기식으로 전송되는 것을 보장한다. 송신자는 몇 개의 응답 패킷을 기다릴 것인지 미리 지정하여 정해진 개수만큼의 응답 패킷을 받은 후 다음 작업을 수행하게 된다. QoS 3 PUBLISH의 응답 패킷은 기존 MQTT QoS 2의 응답 패킷에 QoS 필드를 추가하여 만들었다. 발행된 메시지의 QoS 필드 값이 2일 경우 기존 MQTT 프로토콜에서 기술된 QoS 2의 과정을 따른다. QoS 필드의 값이 3일 경우 송신자는 몇 개의 응답 패킷을 기다릴 것인지, 어떤 수신자들이 발행될 메시지를 전송받을 것인지 미리 정할 수 있다. 송신자는 메시지를 보낸 후 자신이 지정한, 혹은 발행된 메시지와 같은 토픽을 구독하는 임의의 수신자들로부터 미리 설정한 최소 개수 이상의 확인 응답이 올 때까지 기다린다.

이로써 QoS 3에서는 클라이언트들 간 순차적 메시지 전송을 보장하며, 송신측에서 새로운 토픽을 구독하고 수신측에서 전송 확인을 위한 메시지를 발행하는 별도의 추가 과정 없이도 송신자 클라이언트는 수신자 클라이언트가 메시지를 제대로 받았는지 확인할 수 있다.

본 논문의 구성은 다음과 같다. 2장에서는 MQTT와 활용 사례, 동기식 통신에 대한 관련 연구를 소개한다. 3장에서는 동기식 통신을 추가한 새로운 Quality of Service(QoS) 레벨 3을 제안한다. 4장에서는 QoS 레벨 3을 구현하기 위해 필요한 주요 클래스와 메소드, 추가 필드에 대해 설명한다. 5장에서는 시간 측정 실험과 메시지 크기 측정을 통해 QoS 레벨 3의 성능을 분석하고, 마지막 장에서는 본 논문의 결론과 향후 연구 내용을 서술한다.

2. 관련연구

2.1 MQTT

Message Queuing Telemetry Transport(MQTT)는 발행-구독(publish-subscribe) 통신 모델 기반의 비동기식 메시지 전송 프로토콜이다. MQTT는 주로 Machine to Machine (M2M) 과 Internet of Things (IoT) 컨텍스트와 같이 리소스가 제한된 환경을 포함해 다양한 상황에서 사용된다(4). MQTT는 총 14개의 패킷으로 구성되어 있다. 14개의 패킷을 표시하기 위해 할당하는 바이트 수는 4바이트이며 그 중 0과 15는 사용하지 않는 번호이다. MQTT는 1부터 14까지를 각 패킷들에게 할당한다. MQTT는 신뢰도를 보장하기 위한 3개의 QoS 레벨을 지원한다.

MQTT에서 송신자가 특정한 토픽(topic)으로 메시지를 발행하면 해당 토픽을 구독중인 수신자들은 같은 토픽으로 발행된 모든 메시지를 받아볼 수 있다. 송신자들은 같은 방식으로 토픽에 메시지를 발행할 수 있다(5). 클라이언트들은 서버를 사이에 두고 통신한다. 서버는 토픽들의 리스트와 각 토픽을 구독 중인 수신자들의 리스트를 가지고 있다. 송신자가 토픽을 설정해 둔 메시지를 발행하면 서버는 발행된 메시지의 토픽을 구독중인 수신자들에게 전달함으로써 메시지를 중계해준다.

토픽과 서버를 이용해 메시지를 중계하는 방식을 사용하기 때문에 송신자와 수신자는 IP주소와 같이 직접적으로 통신하기 위해 필요한 정보가 없어도 통신이 가능하다. 대신 송신자와 수신자는 서로의 정보 및 상태를 알 수 없다. 이 탓에 송신자는 자신이 보낸 메시지가 수신자에게 확실하게 전송되었는지 알 수 없다.

MQTT는 클라이언트와 서버 사이에서 메시지를 발행할 때의 신뢰도를 보장하기 위해 세 개의 QoS 레벨을 제공한다. 각 QoS 레벨은 송신자와 서버 사이, 혹은 서버와 수신자 사이에서 일어나는 통신에 대해 메시지가 얼마나 정확하게 전송될 것인가를 보장해 준다. 각 QoS 레벨은 그 이전의 단계를 포함한다(6).

QoS 레벨 0에서는 메시지가 최대 한 번 전송된다. 송신자는 PUBLISH 패킷을 전송한 후 메시지가 제대로 도착했는지 확인하지 않는다. 메시지는 중간에서 손실될 수 있다(6).

그림. 1. MQTT QoS 3

Fig. 1. MQTT QoS 3

../../Resources/kiee/KIEE.2021.70.6.893/fig1.png

QoS 레벨 1과 2에서, 송신자가 PUBLISH 패킷 발행자(publisher)일 경우 수신자는 서버가 된다. 송신자가 서버일 경우엔 수신자가 토픽 구독자(subscriber)가 된다.

QoS 레벨 1은 메시지가 적어도 한 번 전송되는 것을 보장한다. 송신자는 자신이 보낼 PUBLISH 패킷을 저장한 후 수신자에게 전송한다. 수신자는 PUBLISH 패킷을 받았을 경우 PUBACK 패킷을 보내 메시지가 제대로 전송되었음을 알린다. PUBLISH, 혹은 PUBACK 패킷이 중간에서 손실되어 송신자가 응답 패킷인 PUBACK 패킷을 받지 못했을 경우 수신자에게 다시 PUBLISH 패킷을 전송한다. 송신자가 성공적으로 PUBACK 패킷을 받으면 저장했던 PUBLISH 패킷을 삭제한다.

QoS 레벨 2는 4-way handshaking을 통해 메시지가 정확하게 한 번 전송되는 것을 보장한다(7). 송신자는 자신이 보낼 PUBLISH 패킷을 저장한 후 전송하고, 수신자는 받은 PUBLISH 패킷을 저장한 후 PUBREC 패킷으로 응답한다. PUBREC 패킷을 받은 송신자는 저장해 두었던 PUBLISH 패킷을 삭제한 후 PUBREL 패킷으로 응답한다. 수신자가 PUBREL 패킷을 받으면 저장해 두었던 PUBLISH 패킷을 삭제한 후 PUBCOMP 패킷으로 응답한다. 중간에 패킷이 손실되어 수신자가 PUBREC 패킷을 받지 못했을 경우 PUBLISH 패킷을 다시 한 번 보낸다. 수신자가 PUBCOMP 패킷을 받지 못했을 경우 PUBREL 패킷을 다시 한 번 보낸다.

클라이언트는 구독중인 토픽에 QoS 레벨을 각각 설정할 수 있다. 클라이언트가 서버와 통신하며 발행된 메시지를 받아볼 때 설정된 QoS 레벨이 적용된다. MQTT에서는 클라이언트와 서버 간의 통신에서만 QoS 레벨을 보장하며, 클라이언트와 클라이언트 간의 간접 통신에서는 QoS 레벨에 따른 신뢰도 보장을 지원하지 않는다.

2.2 MQTT의 적용/변형 사례

MQTT는 다양한 분야에서 사용된다. MQTT는 Floodnet, SmartLab, 페이스북 메신저와 같은 곳에서 사용되며(4), 헬스케어(Healthcare), 에너지 및 유틸리티(Energy and utilities), 소셜 네트워킹(Social Networking)등의 분야에서도 사용된다(5). 그 외에도 집의 상태를 원격으로 모니터링하고 필요한 작업을 수행할 수 있게 한 MQTT 기반의 홈 오토메이션 시스템에 대한 연구가 있다(8).

Floodnet은 센서에서 수집한 수위 수치를 바탕으로 홍수가 날 가능성을 예측하는 일종의 홍수 경보 시스템으로, 그리드 기반(Grid-based) 홍수 예측 모델을 사용한다(2). Floodnet에서 IBM의 ‘Micro서버’를 사용하기 때문에, 이에 대한 프로토콜로 TCP/IP를 통해 발행-구독 통신 모델을 사용 할 수 있는 MQTT를 선택해 적용했다(7).

MQTT를 connected health에 사용한 사례는 다음과 같다. 클라이언트를 에이전트와 매니저로 나누어서 환자의 건강정보를 에이전트가 발행하면 서버를 거쳐 매니저가 구독하는 방식이다. 기존 MQTT를 변형/적용한 사례로, 새로운 에이전트를 자동으로 찾을 수 있고 에이전트는 연결 요청을 한번만 보내면 된다는 장점이 있지만, 대신 일반 클라이언트-서버 간 연결보다 패킷의 개수와 길이가 증가한다는 단점이 있다(9).

페이스북은 MQTT를 페이스북 메신저에 사용해 왔다. MQTT가 얼마나 사용되고, 어디에 사용되는지는 불분명하며, 센서 애플리케이션이 아닌 전화 애플리케이션임을 고려해야 한다(4).

목적을 가지고 특정 기능들을 추가해 MQTT를 변형한 사례들도 있다. 센서 네트워크에서, MQTT를 보다 작은 센서-액추에이터(SA) 기기들에서 활용하기 위해 변형한 MQTT-S(1)와 기존의 MQTT에 geolocation 정보를 추가한 MQTT-G(10)가 대표적 예시이다. MQTT 패킷의 고정헤더에 priority-QoS 플래그를 추가해 우선순위를 고려할 수 있게 한 연구도 있다(11).

2.3 MQTT와 다른 프로토콜 간의 성능 비교분석

MQTT의 성능을 측정한 연구들도 있다. (12)의 연구에서는 MQTT와 CoAP를 비교 분석했다. 패킷 손실이 적을 때는 MQTT가 CoAP보다 딜레이가 적다. 메시지 크기가 작고, 패킷 손실률이 25% 이하일 때, CoAP는 MQTT보다 적은 추가 트래픽으로 신뢰성 있는 전송을 보장한다(12). 그 외에도 MQTT, CoAP, AMQP, HTTP를 메시지 크기와 오버헤드, 지연, 신뢰성 등의 항목에서 비교분석한 연구도 있다(13).

2.4 CM과 비동기식 시스템에서의 동기식 통신 적용

CM은 분산시스템을 개발할 때 사용되는 애플리케이션 레벨의 통신 프레임워크이다. CM은 애플리케이션의 요구사항에 맞춰 다양한 옵션과 보다 유연한 통신 서비스를 제공한다. 애플리케이션 개발자는 CM이 제공하는 API(Application Pro- gramming Interface)와 설정 파일을 사용하여 CM 노드(CM의 통신 서비스를 이용하는 애플리케이션)가 상호작용을 할 수 있는 다양한 통신 기능을 쉽게 구현할 수 있다. CM 노드는 클라이언트와 서버로 나뉜다(3). 본 논문에서는 CM 내에 동기식 통신을 추가한 MQTT를 동기식 발행-구독 통신 서비스로 구현했다.

(3)의 연구에서는 비동기식 통신을 사용하는 클라이언트-서버 시스템인 CM에서의 직간접 동기 통신을 고안했다. 직접 동기 통신은 직접적으로 연결된 클라이언트와 서버 간의 통신이며, 간접 동기 통신은 서버를 사이에 두고 연결된 클라이언트와 클라이언트 간의 동기식 통신이다. 해당 연구에서는 이벤트 동기화(Event synchronizer) 객체를 통해 직접/간접 동기식 통신을 구현했다. 우선, 메시지 송신측의 메인 스레드에서 이벤트 동기화 객체에 전송할 이벤트와 그에 대한 응답 이벤트의 타입, 기다릴 응답 이벤트의 수를 등록해 두고 wait()를 호출해 대기 상태가 된다. 메시지 송신측의 프로세싱 스레드에서 서버로부터 응답 이벤트를 수신하면 프로세싱 스레드는 수신한 이벤트가 이벤트 동기화 객체에 등록되어 있는 응답 이벤트의 타입과 같은지 확인한다. 수신한 이벤트가 기다리고 있던 응답 이벤트와 같을 경우 이벤트 동기화 객체에 등록한다. 이벤트 동기화 객체에 등록된 개수 이상의 응답 이벤트를 받을 경우, 송신측의 프로세싱 스레드는 notify()를 통해 송신측의 메인 스레드를 깨운다. 해당 연구에서 동기식 통신의 성능 분석 결과, 순차적으로 작업을 진행해야 할 필요가 있을 때는 동기식 통신이 비동기식 통신에 비해 효율적이었다.

3. Quality of Service Level 3

Quality of Service(QoS) 레벨 3은 QoS 레벨 2에 동기식 통신을 추가한 것으로, 기존의 QoS 0, 1, 2에서 지원하는 서비스를 포함한다. QoS 3은 동기식 통신을 사용하기 때문에 송신자는 PUBLISH 패킷을 전송한 이후 수신자의 확인 응답을 기다리게 된다. 송신자가 보낸 메시지는 수신자에게 순차적으로 도착하며, 송신자는 응답 메시지를 수신함으로써 자신이 보낸 메시지를 수신자가 받았는지 확인할 수 있게 된다.

3.1 동기식 통신 방법 개요

QoS 레벨 3에서는 서버를 사이에 두고 송신자와 수신자간의 4-way handshaking이 진행된다. 그림 1은 QoS 레벨 3의 동기식 통신 과정을 나타낸다. QoS 3의 전체적인 과정은 QoS 2와 유사하다. 우선 송신자는 자신이 기다릴 패킷의 수(waited_ packet_num)를 설정하고 자신이 보낼 PUBLISH 패킷을 저장한다. 이후 송신자는 PUBLISH 패킷을 토픽 T로 발행한다. 발행된 PUBLISH 패킷은 서버에게로 전송된다. PUBLISH 패킷 전송 후, 송신자는 대기 상태가 된다.

송신자가 보낸 PUBLISH 패킷을 받은 서버는 subscriber_id 필드를 확인해 송신자가 특정 수신자를 지목했는지 확인한다. 송신자가 특정 수신자를 지목했을 경우 서버는 송신자가 지목한 수신자들 중 토픽 T를 구독 중인 수신자들에게 PUBLISH 패킷을 전송한다. 송신자가 어떤 수신자도 지정하지 않았을 경우, 서버는 토픽 T를 구독 중인 모든 수신자들에게 PUBLISH 패킷을 전송한다. 이후 서버가 PUBREC, PUBRE, PUBCOMP 패킷을 받았을 경우, 서버는 송신자와 수신자의 메시지를 그대로 전달하기만 하고 별도의 추가적 처리는 하지 않는다.

수신자는 자신이 받은 PUBLISH 패킷을 저장한 이후 PUBREC 패킷으로 응답한다. PUBREC 패킷은 서버를 통해 송신자에게 전달된다. PUBREC 패킷을 받은 송신자는 수신자가 자신이 보낸 메시지를 받았음을 확인하고, PUBREC 패킷을 저장한다. 이때, 송신자가 받은 PUBREC 패킷의 개수가 미리 지정했던 기다릴 패킷의 수(waited_packet_num) 이상이 될 경우, 송신자는 notify()를 통해 동기식 통신을 종료하고 저장해 두었던 PUBLISH 패킷을 삭제한다.

PUBREC 패킷을 받은 직후 송신자는 수신자에게 PUBREL 패킷을 전송하고, PUBREL 패킷을 저장한다. PUBREL 패킷은 서버를 통해 수신자에게 전송된다. 수신자가 PUBREL 패킷을 받으면 저장해 두었던 PUBLISH 패킷을 삭제하고 PUBCOMP 패킷을 전송한다. PUBCOMP 패킷은 서버를 통해 송신자에게 전송된다. 송신자가 PUBCOMP 패킷을 받아 저장해 두었던 PUBREL 패킷을 삭제하면서 PUBLISH 과정이 끝난다.

메시지 전송 순서를 보장하기 위해 송신자가 PUBLISH 패킷을 보냈을 때부터 PUBREC을 받을 때 까지는 동기식으로 진행되며, 타임아웃 시간을 잡음으로써 패킷이 손실되었을 경우 무한히 기다리지 않도록 한다. 그 외의 전송 과정은 비동기식으로 진행한다.

3.2 패킷 구성

기존의 MQTT에서는 패킷의 종류를 표기하기 위해 bit 7-4, 4개의 비트를 할당한다. 패킷은 총 15개로, 0000부터 1110까지의 번호를 쓰고, 15는 비어있는 번호이다. 그림 2는 기존 MQTT의 PUBLISH 패킷 고정 헤더의 구조이다. 기존 PUBLISH 패킷의 경우 bit 7-4는 14가지의 패킷 타입을 표기하기 위해 사용하고, bit 3은 DUP 플래그(flag)를 표기하기 위해, bit 2-1은 QoS 레벨을 표기하기 위해 사용한다. 기존 QoS 레벨은 0-2까지 총 3개가 있으며, 3은 비어있는 자리이다.

그림. 2. 기존 MQTT의 PUBLISH 패킷의 고정 헤더

Fig. 2. Fixed header of MQTT PUBLISH Packet

../../Resources/kiee/KIEE.2021.70.6.893/fig2.png

그림 3은 PUBLISH QoS 2의 응답 패킷들인 PUBREC, PUBREL, PUBCOMP의 고정 헤더를 나타낸다. PUBREC, PUBREL, PUBCOMP의 경우, 총 8비트 중 bit 7-4, 4개의 비트는 패킷 타입을 표기하기 위해 사용하고, bit 3-0까지는 사용하지 않는다.

그림. 3. 기존 MQTT의 PUBREC, PUBREL, PUBCOMP 패킷의 고정 헤더

Fig. 3. Fixed header of MQTT PUBREC, PUBREL, PUBCOMP Packet

../../Resources/kiee/KIEE.2021.70.6.893/fig3.png

MQTT에서 패킷의 종류를 표기하기 위해 4비트를 할당하기 때문에, QoS 3을 위해 필요한 패킷을 추가할 경우 2개 이상의 패킷이 추가된다면 패킷 표시를 위해 할당하는 비트 수를 늘려야 한다. 패킷 지정을 위해 할당되는 비트 수를 고정하는 동시에 통일성을 주기 위해 QoS 레벨 3에서는 QoS 레벨 2에서의 패킷을 그대로 사용하는 대신 필요한 필드를 추가했다. 그림 4는 QoS 레벨 3을 구현하기 위해 수정한 PUBREC, PUBREL, PUBCOMP 패킷의 고정 헤더이다. 기존 MQTT의 PUBREC, PUBREL, PUBCOMP 패킷의 고정 헤더의 bit 2-1에 QoS 필드를 추가 했다. QoS 필드가 추가되는 위치는 bit 2-1로, 기존 PUBLISH 패킷에서 QoS 필드가 있는 자리와 동일하다. QoS 필드의 값이 2일때는 기존 MQTT QoS 2의 과정을 따르고, 3일때는 QoS 3의 과정을 따른다.

그림. 4. QoS 레벨 3을 구현하기 위한 필드를 추가한 PUBREC, PUBREL, PUBCOMP 패킷의 고정 헤더

Fig. 4. Fixed header of MQTT PUBREC, PUBREL, PUBCOMP Packet with fields for QoS level 3

../../Resources/kiee/KIEE.2021.70.6.893/fig4.png

MQTT에 동기식 통신을 적용하기 위해 비동기식 통신을 사용하는 클라이언트-서버 시스템에서 직간접 동기 통신을 고안한 연구(3)을 참조했다. PUBLISH-PUBREC의 동기식 통신 과정에서, 송신자는 자신이 기다릴 메시지의 수를 지정할 수 있다. 예를 들어 송신자가 자신이 기다릴 메시지의 수를 2로 설정했을 경우, 송신자는 두 개의 응답메시지를 받은 이후 기다리는 것을 종료하고 다음 작업을 수행한다. 해당 파라미터는 반드시 값을 할당해야 하는 파라미터이며, 기다릴 메시지의 최소 개수는 1개이다.

상호작용이 필요한 상황이란 점을 고려해 해당 메시지를 받게 될 수신자 정보를 입력할 수 있는 필드를 PUBLISH 패킷 페이로드(payload)의 애플리케이션 메시지 필드 다음에 추가했다. 수신자 정보를 입력할 경우, 지정한 수신자에게 메시지가 전송된다. 해당 필드는 옵션 필드로, 입력하지 않아도 괜찮은 필드이다.

3.3 동기식 통신 세부 과정

그림. 5. 송신자의 실행 흐름을 나타낸 플로우차트

Fig. 5. Flowchart of a publisher

../../Resources/kiee/KIEE.2021.70.6.893/fig5.png

그림 5는 송신자 측의 실행 과정을 나타낸 그림이다. 우선 송신자 측에서, 사용자가 MQTT PUBLISH QoS 3 요청을 보내면 CM의 메인 스레드에서 사용자의 발행 요청을 처리한다. 메인 스레드는 unackevent list에 PUBLISH 패킷을 등록한 후, 자신이 받은 요청을 서버에 보내기 위해 송신 스레드에 PUBLISH 이벤트를 전달한다. 송신 스레드는 PUBLISH 이벤트를 서버에 전송한다. 이후 메인 스레드는 이벤트 동기화(Event synchronizer) 객체에 PUBLISH QoS 3 이벤트를 등록하고, wait() 함수를 호출하여 알맞은 응답 패킷이 지정 개수 이상 올 때까지 대기한다. 이후 프로세싱 스레드가 notify() 함수를 통해 메인 스레드를 깨우면, 메인 스레드는 이벤트 동기화 객체에 등록되어 있는 PUBREC 이벤트를 확인한다.

송신자의 프로세싱 스레드는 수신 스레드로부터 들어오는 외부의 이벤트들을 처리하는 스레드이다. QoS 3 과정에서 메인 스레드가 잠든 이후 프로세싱 스레드가 수신 스레드로부터 PUBREC 이벤트를 받으면 프로세싱 스레드는 서버로 PUBREL 이벤트를 전송한 이후 unackevent list에 PUBREL 패킷을 등록한 후 이벤트 동기화 객체에 자신이 받은 PUBREC 이벤트를 등록한다. 등록되어 있는 PUBREC 이벤트의 개수가 송신자가 지정한 최소 응답 개수 이상일 경우 프로세싱 스레드는 unackevent list에서 PUBLISH 패킷을 삭제하고, notify() 함수를 호출해 메인 스레드를 깨운다. 프로세싱 스레드가 PUBCOMP 패킷을 받았을 경우, unackevent list에 저장되어 있는 PUBREL 패킷을 삭제하고 동기식 발행 처리 과정이 끝난다.

그림 6은 서버의 실행 흐름을 나타낸 그림이다. 서버가 송신자로부터 PUBLISH QoS 3 패킷을 받으면 자신이 받은 PUBLISH 이벤트에 수신자 ID가 지정되어 있는지 확인한다. 송신자가 지정한 수신자 ID가 있을 경우, 받은 PUBLISH 패킷에 입력되어 있는 토픽을 구독하는 수신자 중 지정한 ID를 가진 클라이언트들에게 PUBLISH 패킷을 전달한다. 수신자 ID가 지정되어 있지 않을 경우, PUBLISH 패킷에 입력되어 있는 토픽을 구독 중인 모든 클라이언트들에게 PUBLISH 패킷을 전달한다. 서버가 클라이언트로부터 QoS 3 PUBREC, PUBREL, PUBCOMP 패킷을 받은 경우에는, 이를 수신해야 하는 클라이언트들에게 해당 패킷을 그대로 전달한다.

그림. 6. 서버의 실행 흐름을 나타낸 플로우차트

Fig. 6. Flowchart of a broker

../../Resources/kiee/KIEE.2021.70.6.893/fig6.png

그림 7은 수신자의 실행 흐름을 나타낸 그림이다. 수신자가 서버로부터 PUBLISH QoS 3 패킷을 받으면 unackevent list에 PUBLISH 패킷을 저장한 후 서버로 QoS 3 PUBREC 패킷을 전송한다. 수신자가 서버로부터 QoS 3 PUBREL 패킷을 받으면 unackevent list에서 같은 ID를 가진 PUBLISH 패킷을 삭제한 이후 서버에게 PUBCOMP 패킷을 전송한다.

그림. 7. 수신자의 실행 흐름을 나타낸 플로우차트

Fig. 7. Flowchart of a subscriber

../../Resources/kiee/KIEE.2021.70.6.893/fig7.png

그림. 8. QoS 레벨 3에 사용되는 클래스 다이어그램

Fig. 8. Class diagrams for QoS level 3

../../Resources/kiee/KIEE.2021.70.6.893/fig8.png

4. 구 현

MQTT QoS 3의 구현을 위해 통신 프레임워크인 CM을 사용했다. CM에 구현되어 있던 기존 MQTT(ver 3.1.1)를 수정해 QoS 3을 구현했다. PUBLISH 및 SUBSCRIBE 패킷에서 송신자와 수신자가 QoS 3을 그림 8 QoS 레벨 3에 사용되는 클래스 다이어그램 Fig. 8 Class diagrams for QoS level 3 지정할 수 있게 해 송수신자가 메시지를 QoS 3으로 발행 및 구독할 수 있게 했다. PUBREC, PUBREL, PUBCOMP 패킷에는 QoS 필드를 추가해 QoS 2와 3을 구별할 수 있게 했다. 송신자와 수신자, 서버가 PUBLISH, PUBREC, PUBREL, PUBCOMP 패킷을 받았을 때 QoS 레벨이 2일 경우 기존 MQTT QoS 2 메카니즘을 따르고, QoS 레벨이 3일 경우 본 논문에서 고안한 동기식 통신 방식을 따르도록 수정했다.

4.1 클래스 및 메소드

QoS 3의 처리 과정에 있어 중요한 클래스들은 CMMqtt- Manager와 CMMqttEventHandler이다. 그림 8은 CMMqttManager와 CMMqttEventHandler의 클래스 다이어그램이다.

CMMqttManager 클래스는 CM 클라이언트 애플리케이션에서 MQTT 서비스를 요청했을 때 해당 요청을 처리하는 클래스이다. 클라이언트로부터 MQTT PUBLISH 요청이 들어오면 CMMqttManager 클래스는 우선 사용자가 PUBLISH 패킷을 발행하는 데에 필요한 파라미터를 전부 입력했는지 확인한다. 토픽과 메시지는 사용자가 반드시 입력해야 하는 파라미터이다. QoS, DUP 플래그와 retain 플래그, 수신자의 ID값과 기다릴 최소 응답 개수 파라미터는 사용자가 입력하지 않았을 경우 디폴트값을 넣는다. 이후 QoS 0-2의 경우 publishFromClient() 메소드에서, QoS 3의 경우 syncpubFromClient() 메소드에서 해당 발행 요청을 처리한다. 클라이언트에서 보낸 발행 요청을 서버가 받으면, 서버는 자신이 받은 PUBLISH 패킷의 QoS와 토픽, QoS 3일 경우 수신자를 지정하는 필드를 확인한다. QoS 레벨이 3이고 송신자가 수신자를 지정했을 때엔 송신자가 지정한 클라이언트들 중 같은 토픽을 구독 중인 클라이언트들에게, 그 이외의 경우일 때엔 같은 토픽을 구독중인 클라이언트들에게 전송받은 PUBLISH 패킷을 일제히 발행한다. 서버가 송신자에게서 받은 PUBLISH 패킷을 발행할 때, QoS 레벨이 0-2라면 publishFromServer() 메소드가, QoS 3이라면 syncpub- FromServer() 메소드가 사용된다.

CMMqttEventHandler 클래스는 CM이 외부에서 들어온 CM MQTT 이벤트를 받았을 때 해당 이벤트들을 프로세싱하는 클래스이다. CM이 MQTT 이벤트를 받으면 CMMqttEventHandler의 processEvent() 메소드가 호출된다. processEvent()는 받은 MQTT 이벤트의 패킷 타입을 구별하고 각 패킷 별 프로세싱 함수를 호출한다. 각 패킷의 처리 메소드들은 MQTT ver 3.1.1에 맞게 해당 패킷을 받았을 때 해야 하는 일들을 실행한다. processEvent()가 PUBLISH 이벤트를 받은 경우 처리 메소드로 processPUBLISH()가 호출된다. processPUBLISH() 메소드는 받은 PUBLISH 이벤트의 QoS 레벨을 확인한다. QoS 레벨이 0-2일 경우 processPUBLISH() 메소드는 MQTT 프로토콜에 따른 응답 패킷을 전송하는 함수를 호출한다. QoS 레벨이 3일 경우 processQoS3() 메소드를 호출해 QoS 3용 응답 패킷을 전송한다. PUBREC, PUBREL, PUBCOMP 패킷을 받았을 경우 pro- cessEvent()는 각 패킷에 맞는 처리 메소드들을 호출한다. PUBREC, PUBREL, PUBCOMP의 처리 메소드들은 우선 받은 패킷의 QoS 레벨을 확인한다. QoS 레벨이 2이면 해당 메소드에서 기존 MQTT 프로토콜에 따른 작업을 수행 한다. QoS 레벨이 3이면 QoS3 처리 메소드들을 호출한 이후 실행을 끝낸다. QoS3 처리 메소드들은 본 논문에서 고안한 QoS 3에 따른 작업을 수행한다. 처리 메소드들은 작업 수행 과정에서 MQTT 이벤트를 보낸 측에게 알맞은 응답 패킷에 해당하는 MQTT 이벤트를 보낸다. MQTT 이벤트를 보낼 때에는 전송 메소드들이 호출되어 알맞은 패킷을 지정된 대상에게 전송한다.

4.2 추가 필드(MQTT sender/receiver)

CM에는 메시지의 직접 송신 노드와 수신 노드를 지정하는 sender/receiver 파라미터가 있다. 이 때, 서버가 송신자 및 수신자가 된다. 그러나 QoS 3을 구현하기 위해서는 중간 단계의 서버가 아닌 클라이언트인 송신자(publisher)와 수신자(subscriber)를 지정하는 파라미터가 추가로 필요하다. 그러한 이유로, 실제 구현에서는 그림 9와 같이 최종 목적지를 나타내는 MqttSender/MqttReceiver 필드를 가변 헤더에 추가했다.

그림. 9. (a) QoS 레벨 3 PUBLISH 패킷의 가변 헤더, (b)QoS 레벨 3 PUBREC, PUBREL, PUBCOMP 패킷의 가변 헤더

Fig. 9. (a) Variable header of MQTT QoS level 3 PUBLISH Packet, (b)Variable header of MQTT QoS level 3 PUBREC, PUBREL, PUBCOMP Packet

../../Resources/kiee/KIEE.2021.70.6.893/fig9.png

5. 성능평가

QoS 레벨 3의 성능을 분석하기 위해 성능평가실험을 진행했다. 기존의 MQTT 프로토콜에서 QoS 3과 전송과정이 가장 비슷한 것이 QoS 2이기 때문에 기존 MQTT의 QoS 2를 새로 개발한 QoS 3의 성능평가 비교 대상으로 삼았다. 4장에서 구현한 MQTT 레이어 위에 성능평가용 애플리케이션 레이어를 구현했다. 성능평가용 애플리케이션으로 송신자, 수신자, 서버 애플리케이션과 각 애플리케이션 별 전용 이벤트 핸들러 함수를 구현했다. 송신자 애플리케이션에서는 실행할 실험의 종류를 지정하고 실험을 시작한다. 서버와 수신자 애플리케이션에서는 송신자가 보내는 실험 요청을 받는다. 송신자와 서버 애플리케이션에서 요청한 실험에 맞는 결과 값이 출력되면, 해당 값을 기록하는 방식으로 성능평가실험을 진행했다.

성능평가실험으로는 총 4가지를 측정했다. 첫째, 송신자와 수신자 간의 상호작용이 필요한 상황에서의 라운드트립 지연시간을 측정했다. 둘째, 송신자와 수신자 간의 상호작용이 필요 없는 상황에서 송신자의 발행 완료 지연 시간을 측정했다. 셋째, 마찬가지로 상호작용이 필요 없는 상황에서 송신자가 PUBLISH 패킷을 보냈을 때부터 수신자가 PUBLISH 패킷을 받을 때까지의 시간을 측정했다. 마지막으로 이동한 메시지들의 총 크기를 바이트 단위로 측정했다. 모든 실험은 20회를 한 세트로 구성 했고, 총 3세트를 실행하여 평균을 낸 값을 결과 값으로 사용했다.

5.1 실험 환경

실험은 기기 두 대로 진행했다. 서버와 수신자는 데스크탑 PC에서, 송신자는 노트북 PC에서 실행시켰다. 서버와 수신자 애플리케이션을 실행시키는 PC를 PC1, 송신자 애플리케이션을 실행시키는 PC를 PC2라고 칭한다. PC1과 PC2의 기기 사양 및 네트워크 환경은 표 1과 같다. PC1은 이더넷을 통해 유선으로 네트워크에 연결했으며, PC2는 Wifi를 통해 무선으로 네트워크에 연결했다.

표 1. 기기 사양 및 네트워크 환경

Table 1. Device specification and network environment

PC1

PC2

프로세서

AMD Ryzen 5 3500 6-Core Processor 3.60GHz

Intel® Core™ i5-8250U CPU @ 1.60GHz

RAM

16GB RAM

4GB RAM

운영체제

64비트 운영체제

64비트 운영체제

네트워크

이더넷 연결(링크 속도 1Gbps)

Wifi연결

5.2 송신자-수신자 간의 라운드트립 지연시간

첫 번째 실험에서는 클라이언트들 간의 응답 확인이 필요한 경우, 즉 수신자가 메시지를 받았다는 사실을 송신자가 알아야 할 경우를 가정하고 응답 지연시간을 측정했다. QoS 3의 경우, 수신자는 응답을 위해 별도의 PUBLISH 패킷을 만들지 않아도 된다. QoS 3 PUBLISH에 대한 응답 패킷으로 수신자는 QoS 3 PUBREC을 전송한다. QoS 2의 경우, 수신자는 송신자가 보낸 PUBLISH 패킷을 받은 이후, 새로운 PUBLISH 패킷을 만들어 보냄으로써 송신자에게 응답해야 하므로, 전송 과정이 하나 더 추가된다. QoS 2와 QoS 3에서 이동하는 패킷 수의 차이를 최대한 줄이기 위해, 기존 MQTT QoS 레벨 중 가장 전송 과정이 단순한 QoS 0 PUBLISH 패킷을 QoS 2 PUBLISH 패킷의 응답 패킷으로 삼았다.

먼저 기존 MQTT의 QoS 레벨 2의 경우, 송신자는 수신자의 응답을 받기 위해 미리 토픽 B를 구독하고, 토픽 A로 QoS 2 PUBLISH 패킷을 발행한다. 수신자는 토픽 A를 구독하고 있다가 송신자가 보낸 QoS 2 PUBLISH 패킷을 받는 즉시 QoS 0 PUBLISH 패킷을 토픽 B로 발행함으로써 송신자에게 응답한다. 송신자는 토픽 B를 구독하고 있다가 수신자가 보내는 QoS 0 PUBLISH 패킷을 전달받고 수신자가 송신자가 발행한 QoS 2 PUBLISH 패킷을 제대로 전달받았음을 확인한다.

QoS 레벨 3의 경우 송신자는 토픽 A로 QoS 3 PUBLISH 패킷을 보내고, 수신자는 QoS 3 프로토콜대로 QoS 3 PUBREC 패킷을 보냄으로써 송신자에게 응답한다. 송신자는 QoS 3 PUBREC 패킷을 받음으로써 수신자의 응답 확인을 위한 별도의 토픽을 구독하지 않아도 수신자가 자신이 보낸 PUBLISH 패킷을 제대로 받았는지 확인할 수 있다.

QoS 레벨 2에서는 송신자가 QoS 2 PUBLISH를 보냈을 때부터 수신자가 QoS 0 PUBLISH를 보낼 때까지, QoS 레벨 3에서는 송신자가 QoS 3 PUBLISH를 보냈을 때부터 수신자가 QoS 3 PUBREC을 보낼 때까지의 시간을 측정했다. 클라이언트의 수를 1개에서 50개까지 늘려가며 첫 번째 실험을 진행했다. 그림 10은 해당 실험의 결과를 그래프로 나타낸 것이다.

그림. 10. 송신자와 수신자 사이의 라운드트립 지연시간

Fig. 10. Round-trip delay between publisher and subscriber

../../Resources/kiee/KIEE.2021.70.6.893/fig10.png

실험 결과, 초반에는 QoS 3이 시간이 더 오래 걸렸으나, 수신자의 개수가 20개가 되면 QoS 2와 QoS 3의 지연시간이 비슷해지고, 25개가 넘어가면 QoS 3의 지연시간이 QoS 2의 지연시간보다 짧아졌다. QoS 3에서는 송신자 애플리케이션에서 동기화에 필요한 지연이 발생하는 반면 QoS 2에서는 그러한 비용이 발생하지 않는다. 다른 측면으로는, 애플리케이션 레이어가 아닌 CM의 MQTT 레이어에서 응답 과정이 처리되는 QoS 3과는 달리, QoS 2의 경우 수신자가 보내는 응답을 확인하기 위해 애플리케이션 레이어에서 추가적인 과정을 거치기 때문에 딜레이가 생긴다. 서버 애플리케이션에서는 송신자가 전달한 PUBLISH 패킷의 토픽을 확인하고 구독 중인 수신자들에게 전달하는 딜레이가 공통적으로 생기는데, QoS 2의 경우 이에 더해 수신자가 응답 패킷을 전달할 때도 해당 패킷의 토픽을 확인하고, 해당 토픽을 구독 중인 송신자에게 패킷을 전송하는 과정에서 생기는 딜레이가 추가된다. QoS 3에서는 수신자의 응답 패킷인 QoS 3 PUBREC을 수신할 경우 프로토콜대로 송신자에게 전달하기만 하면 되므로 QoS 2일 때 서버에서 생기는 추가적인 과정 또한 생략된다.

결국, 수신자의 수가 적을 경우에는 QoS 3의 동기화 비용의 영향이 커서 지연시간이 더 길었고, 수신자의 수가 증가하면서 메시지 송수신 과정에서 QoS 2의 지연 요인이 더 크게 작용하여 QoS 3의 지연시간이 짧아진 것으로 분석된다.

5.3 송신자의 발행 완료 지연시간

두 번째 실험에서는 클라이언트들 간의 응답 확인이 필요하지 않은 경우 송신자의 발행 완료 지연시간을 측정했다. 이는 송신자 측에서 인지하는 PUBLISH 전체 과정에 걸린 시간, 즉 송신자가 PUBLISH를 한 이후 서버로부터 PUBCOMP 패킷을 받기까지 걸린 시간이다. 시간은 송신자 측에서 측정 했고, 클라이언트의 수를 1개에서 50개까지 늘려가며 실험을 진행했다. 그림 11은 해당 실험 결과를 그래프로 나타낸 것이다.

그림. 11. 송신자의 발행 완료 지연시간

Fig. 11. Publication completion delay

../../Resources/kiee/KIEE.2021.70.6.893/fig11.png

실험 결과 QoS 3이 전체적으로 오래 걸렸다. QoS 2의 경우 송신자가 메시지를 발행하는 것과 수신자가 구독한 메시지를 받아보는 과정이 서로 무관하게 일어난다. 기존에 존재하는 MQTT의 QoS 2는 송신자가 서버에게 메시지를 정확히 한 번 발행하는 것을 보장한다. 송신자가 QoS 2 PUBLISH 패킷을 발행하면, 송신자와 서버 사이에 4-way handshaking이 일어나며, 송신자가 PUBLISH 패킷을 보냈을 때부터 서버에게 PUBCOMP 패킷을 받기까지의 통신과정에서 총 4번의 메시지 전송과정을 거친다. 반면 QoS 3의 경우 송신자의 메시지가 수신자에게 정확히 한 번 동기적으로 발행되는 것을 보장한다. 이 과정에서 서버는 송신자와 수신자 사이에 오가는 패킷을 전달하는 역할을 하며, QoS 2와는 달리 송신자에게 별도의 응답 패킷을 보내지 않는다. 그렇기 때문에 QoS 3에서는 송신자가 PUBLISH 패킷을 보냈을 때부터 서버에게 PUBCOMP 패킷을 받기위해 송신자와 서버, 서버와 수신자 간에 총 8번의 메시지 전송과정을 거쳐야 한다. 이 때문에 QoS 3에서 송신자가 PUBCOMP 패킷을 받기 까지 QoS 2에 비해 메시지 전송 과정이 두 배 정도 많다. 또한 QoS 3에서는 송신자가 PUBLISH 패킷을 보냈을 때부터 일정 개수 이상의 PUBREC 패킷을 받기까지의 과정을 동기식으로 처리하므로, 이로 인해 송신자가 수신자의 PUBREC 패킷을 기다리는 지연시간이 더해진다. QoS 2와 QoS 3의 발행완료 지연시간의 차이는 이러한 원인으로 인해 발생한 것으로 분석된다.

5.4 수신자의 발행 완료 지연시간

세 번째로, 상호작용이 필요하지 않은 상황에서 송신자가 PUBLISH 패킷을 보냈을 때부터 수신자가 서버를 통해 송신자의 메시지를 받고 응답 패킷을 보낼 때까지의 지연시간을 측정했다. 송신자와 수신자 애플리케이션을 실행하는 PC가 달라 송신자 측에서 수신자가 메시지를 받는 시간을 측정 하여 계산할 수 있는 방법이 없었으므로, 서버 측에서 송신자가 보낸 PUBLISH패킷을 받았을 때부터 수신자가 보낸 응답 패킷을 받을 때까지의 시간을 측정했다. 첫 번째 실험에서와 마찬가지로, QoS 2와 QoS 3에서 이동하는 패킷 수의 차이를 최대한 줄이기 위해 기존 MQTT QoS 레벨 중 가장 전송 과정이 단순한 QoS 0 PUBLISH 패킷을 QoS 2 PUBLISH 패킷의 응답 패킷으로 삼았다.

수신자가 QoS 2 PUBLISH 패킷을 받았을 경우, 그에 대한 응답 패킷으로 QoS 0 PUBLISH 패킷을 전송한다. 서버 애플리케이션에서는 송신자가 전송한 QoS 2 PUBLISH 패킷을 받았을 때부터 수신자가 전송한 QoS 0 PUBLISH 패킷을 받을 때까지의 시간을 측정한다. 수신자가 QoS 3 PUBLISH 패킷을 받았을 경우, 그에 대한 응답 패킷으로 QoS 3 PUBREC 패킷을 전송하므로, QoS 3 PUBLISH 패킷을 받았을 경우 수신자는 응답을 위해 새로운 PUBLISH 패킷을 만들어 보낼 필요가 없다. 서버 애플리케이션에서는 송신자가 전송한 QoS 3 PUBLISH 패킷을 받았을 때부터 수신자가 전송한 QoS 3 PUBREC 패킷을 받을 때까지의 시간을 측정한다. 세 번째 실험의 경우 QoS 2와 QoS 3 모두 송신자가 서버로 메시지를 발행하고, 서버가 수신자에게 해당 메시지를 전송하며, 메시지를 받은 수신자가 서버에게 응답 패킷을 보내기까지 총 3번의 메시지 전송과정을 거친다.

이전 실험들과 마찬가지로 클라이언트의 수는 1개에서 50개까지 늘려가며 실험을 진행했다. 그림 12는 해당 실험 결과를 그래프로 나타낸 것이다.

실험 결과, QoS 3이 시간을 좀 더 많이 소모했으나 두 번째 실험에 비해 QoS 2와 QoS 3의 지연시간의 차이가 적었다. 세 번째 실험의 경우 QoS 3과 QoS 2 모두 메시지를 총 3번 전송한다. 따라서 통신과정에서 메시지 전송 횟수에 의해 발생하는 지연시간의 차이는 없다. QoS 3의 지연시간이 QoS 2의 지연시간보다 큰 이유는 다음과 같이 분석된다. 우선, 실험을 진행할 때 메시지를 20회 연속으로 발행하는 것을 한 세트로 정하고 시간을 한 세트 단위로 측정했다. QoS 3의 경우 PUBLISH 패킷을 발행한 이후 수신자의 PUBREC 패킷이 도착할 때까지 기다린 이후에 다음 PUBLISH 패킷을 발행한다. QoS 2는 응답 패킷이 도착하는 것을 기다리지 않기 때문에 PUBLISH 패킷을 발행한 직후 바로 다음 PUBLISH 패킷을 발행하게 된다. 이로 인해 QoS 3에서는 동기식 통신으로 인한 지연시간이 발생 한다. 또한 QoS 2의 경우 첫 번째 실험과 마찬가지로 QoS 2의 경우 수신자가 보내는 응답을 확인하기 위해 애플리케이션 레이어에서 추가적인 과정을 거치기 때문에 생기는 지연시간이 추가된다. 이 두 딜레이들이 상충하며 두 번째 실험의 결과에 비해 QoS 2와 3의 지연시간의 차이가 작아진 것으로 분석된다. 세 번째 실험에서 나타난 지연시간의 차이는 이로 인해 발생한 것이며, 통신과정에서의 메시지 전송 횟수에 의한 차이가 없기 때문에 5.3에서 나타난 실험 결과에 비해 QoS 2와 QoS 3 간의 지연시간의 차이가 적다.

그림. 12. 송신자가 PUBLISH 패킷을 보냈을 때부터 수신자가 PUBLISH 패킷을 받을 때까지의 시간

Fig. 12. Transmission delay until subscribers receive the PUBLISH packet

../../Resources/kiee/KIEE.2021.70.6.893/fig12.png

5.5 메시지 크기 측정

마지막으로, 최종 목적지인 수신자를 지정하지 않은 PUBLISH 과정에서 이동한 패킷들의 크기를 바이트 단위로 측정했다. PUBLISH, PUBREC, PUBREL, PUBCOMP 패킷의 고정 헤더, 가변 헤더, 페이로드의 크기를 각각 측정 했다. CM에서 MQTT 패킷을 발행할 때 MQTT 이벤트를 CM 이벤트로 감싸서 전송하기 때문에, 메시지 크기를 측정할 때 MQTT 패킷의 헤더 이외에 CM 헤더를 포함한 전체적인 패킷 크기를 측정했다. CM 헤더의 크기는 PUBLISH, PUBREC, PUBREL, PUBCOMP 패킷 모두 같다.

그림 13은 측정 결과를 그래프로 나타낸 것이다. PUBLISH 패킷의 경우, QoS 3에서 별도의 수신자 정보를 저장하지 않았기 때문에 QoS 2와 3 모두 토픽을 구독 중인 모든 수신자들에게 메시지를 보내게 된다. QoS 3에서 수신자 정보를 저장하지 않기 때문에 QoS 2와 3의 패킷 크기가 동일하게 측정 되었다. QoS 3 PUBREC, PUBREL, PUBCOMP 패킷들의 경우 통신 중인 대상 수신자의 정보를 저장하고 있기 때문에 가변헤더에서 메시지 크기가 2-4바이트 증가했다. 이는 QoS 3을 구현하기 위해 해당 패킷들의 가변 헤더에 이 패킷이 도달할 최종 목적지를 저장해 두어서 발생한 차이이다. QoS 2 PUBREC, PUBREL, PUBCOMP 패킷들에는 최종 목적지에 대한 정보가 별도로 저장되지 않았다. 최종 목적지에 해당하는 파라미터의 유무로 인한 차이 외에는 두 QoS 레벨 간의 차이는 없었다.

그림. 13. PUBLISH 관련 메시지 크기

Fig. 13. PUBLISH relevant message size

../../Resources/kiee/KIEE.2021.70.6.893/fig13.png

표 2. 수신자 정보를 입력했을 경우 지정수신자의 수에 따른 패킷 크기 (바이트 단위)

Table 2. Packet size by number of specified subscribers when input subscriber information (byte)

QoS

s_num

PUBLISH

PUBREC

PUBREL

PUBCOMP

2

1

41

34

35

35

3

0

41

36

36

36

1

43

38

37

38

2

46

38

37

38

3

49

38

37

38

4

52

38

37

38

5

55

38

37

38

표 2는 송신자가 보낸 메시지를 받게 될 수신자 정보를 입력했을 경우, QoS 레벨과 미리 지정해 둔 수신자의 수(s_num)에 따른 각 패킷들의 크기를 바이트 단위로 측정한 결과이다. 해당 결과는 송신자가 QoS 3 패킷을 전송받을 수신자의 ID를 미리 지정하여 서버로 보냈을 경우의 결과로, 동기식 통신을 위해 몇 개의 응답 패킷을 기다릴 것인지 정하는 필드와는 무관하다. 몇 개의 응답 패킷을 기다릴 것인지 결정하는 필드는 패킷의 크기에 영향을 주지 않았다. 송신자 측에서 메시지를 발행할 때 지정한 수신자의 수(s_num)를 하나씩 늘려가며 패킷의 크기를 측정했다.

QoS 레벨 3에서 PUBLISH 패킷은 메시지를 전송받을 모든 수신자의 리스트를 저장 한다. 따라서 미리 지정해 둔 수신자의 수가 하나 증가할 때마다 PUBLISH 패킷의 크기는 3바이트씩 증가했다. PUBREC, PUBREL, PUBCOMP의 경우 모든 수신자의 리스트를 저장하는 PUBLISH 패킷과 달리 자신이 현재 통신 중인 대상의 정보만을 저장한다. QoS 3 PUBREC, PUBREL, PUBCOMP 패킷은 단 하나의 정보만을 저장하기 때문에 기존 QoS 2 PUBREC, PUBREL, PUBCOMP 패킷보다 패킷의 크기가 2-4바이트 더 컸고, 송신자 측에서 지정한 수신자의 수에 따른 증가 추세는 없었다.

6. 결 론

기존의 MQTT는 클라이언트와 서버 사이의 메시지 전달 여부만을 보장하기 때문에 클라이언트들 간의 메시지 전달 여부는 별도로 확인할 수 없었다.

이 문제를 해결하기 위해, 본 논문에서는 클라이언트들 간의 동기식 통신이 가능한 QoS 레벨 3을 고안했다. 제안하는 동기식 MQTT QoS 3에서 송신자는 메시지를 전송한 이후 수신자의 확인 응답을 기다림으로써 자신이 보낸 메시지를 수신자들이 받았는지 확인한 후에 다음 작업을 수행할 수 있다.

동기식 MQTT의 성능 실험 결과 QoS 3의 경우 패킷 내에 최종 목적지인 수신자의 정보를 추가하여 기존 QoS 레벨에 비해 메시지 크기가 증가했으나, 송신자가 메시지를 발행한 이후 수신자의 응답을 기다리는 시간은 줄어들었다. 결론적으로 QoS 3은 송신자가 수신자의 상태를 확인하면서 다음 작업을 진행해야 하는 상황에서 클라이언트들의 수가 많을수록 효과적으로 사용될 수 있다.

본 논문에서는 발행-구독 패턴을 사용하는 프로토콜에서 송신자와 수신자 사이의 종단 간 동기식 통신인 MQTT QoS 레벨 3을 제안하고, 이를 MQTT 버전 3.1.1에 맞춰 구현했다. 제안한 QoS 레벨 3을 통해 송신자는 수신자의 상태를 확인하며 다음 작업을 진행할 수 있게 되었다. 또한, 송신자와 수신자 간 상호작용이 필요하며 클라이언트들의 수가 많은 경우 QoS 레벨 3를 사용하면 기존 MQTT의 비동기식 통신 방식에 비해 효율적으로 작업을 수행할 수 있다.

향후 연구 과제로써 송신자가 수신자의 응답을 기다릴 필요가 없는 QoS 레벨 3의 비동기식 통신 방식을 추가할 예정이며, MQTT 버전 5에서의 QoS 레벨 3의 적용 방안 또한 분석할 예정이다.

Acknowledgements

This work was supported by the Basic Science Research Program through the National Research Foundation of Korea (NRF) funded by the Ministry of Education under Grant NRF-2018R1D1A1A09082580.

References

1 
U. Hunkeler, H. L. Truong, A. Stanford-Clark, Jan 2008, MQTT- S—A Publish/Subscribe Protocol for Wireless Sensor Net- works, International Conference on Communication Systems Software and Middleware and Workshops, pp. 791-798DOI
2 
J. Zhou, D. Roure, Jan 2007, Floodnet: Coupling Adaptive Sampling with Energy Aware Routing in a Flood Warning System, Journal of Computer Science and Technology, pp. 121-130DOI
3 
M. Lim, June 2019, Directly and Indirectly Synchronous Communi- cation Mechanisms for Client-Server Systems Using Event- Based Asynchronous Communication Framework, IEEE Access 7, pp. 81969-81982DOI
4 
S. R. Akbar, K. Amron, H. Mulya, S. Hanifah, Jan 2016, MQTT- Message Queuing Telemetry Transport Protocol, Inter- national Journal of Research, pp. 240-244Google Search
5 
D. Soni, A. Makwana, April 2017, A Survey on MQTT: a Protocol of Internet of Things (IoT), International Conference On Telecommunication, pp. power analysis and computing techni-quesGoogle Search
6 
S. Lee, H. Kim, D. Hong, H. Ju, Jan 2013, Correlation Analysis of MQTT Loss and Delay According to QoS Level, The International Conference on Information Networking, pp. 714-717DOI
7 
D. D. Roure, C. Hutton, D. Cruickshank, E. L. Kuan, J. Neal, R. Roddis, A. Stanford-Clark, S. Vivekanandan, J. Zhou, 2005, Floodnet–Improving Flood Warning Times Using Pervasive and Grid Computing, FloodNet Overview, pp. 121-130Google Search
8 
R. K. Kodali, S. Soratkal, Feb 2016, MQTT Based Home Auto- mation System Using ESP8266, IEEE Region 10 Humani- tarian Technology Conf., pp. 1-5DOI
9 
Y. F. Gomes, D. F. S. Santos, H. O. Almeida, A. Perkusich, Jan 2015, Integrating MQTT and ISO/IEEE 11073 for Health Information Sharing in the Internet of Things, IEEE International Conference on Consumer Electronics, pp. 200-201DOI
10 
R. Bryce, T. Shaw, G. Srivastava, July 2018, Mqtt-G: A Publish/Subscribe Protocol with Geolocation, International Conference on Telecommunications and Signal Processing, pp. 1-4DOI
11 
S. Kim, C. Oh, July 2017, Method for Message Processing According to Priority in MQTT Broker, Journal of the Korea Institute of Information and Communication Engi- neering, pp. 1320-1326DOI
12 
D. Thangavel, X. Ma, A. Valera, H. Tan, C. K. Tan, April 2014, Performance Evaluation of MQTT and CoAP via a Com- mon Middleware, IEEE Ninth International Conference on Intelligent Sensors, Vol. sensor networks and information pro- cessing, pp. 1-6DOI
13 
N. Naik, Oct 2017, Choice of Effective Messaging Protocols for IoT Systems: MQTT, CoAP, AMQP and HTTP, IEEE Inter- national Systems Engineering Symposium, pp. 1-7DOI

저자소개

임예린(YeRin Im)
../../Resources/kiee/KIEE.2021.70.6.893/au1.png

She received the B.S degree in Smart ICT Convergence, Konkuk University, Korea, in 2021.

She is currently a master’s student at the Department of Smart ICT Convergence, Konkuk University, Korea.

Her current research interests include IoT pro- tocols, communication framework, and distri- buted systems.

임민규(Mingyu Lim)
../../Resources/kiee/KIEE.2021.70.6.893/au2.png

He received the B.S. degree in computer science from the Korea Advanced Institute of Science and Technology (KAIST), Daejeon, South Korea, in 1998, the M.S. and Ph.D. degrees in computer science from Information and Communications University (ICU), Daejeon, South Korea, in 2000 and 2006, respectively.

He is currently a Professor with the Department of Smart ICT Convergence, Konkuk University, Seoul, South Korea.

His current research interests include communication middleware and framework, efficient event transmissions, and content distribution in distributed systems.