2016-12-26 13 views
0

우리는 QoS2를 충족시키기 위해 publish와 pubrcv를 사용할 수 있다고 생각합니다.MQTT QoS2 왜 4 패킷을 사용합니까?

  1. ClientA-> 서버는 패킷을
  2. 서버를 게시 - 게시 패킷 RECV 서버가 dB로 저장하면, 서버는 예를 들어, 다른 클라이언트에 게시

> ClientA pubrecv 패킷. ClientB. ClientA에서 두 개의 동일한 게시 패킷을 수신하더라도 서버는 db를 확인하고 이것이 반복되는 메시지임을 알고 있으므로 ClientB에 게시하지 마십시오.

그래서 4 패킷이 필요 없다고 생각합니다.

내 논리가 맞습니까?

+0

나는 그것이 4 개 패킷을 사용 추측 보낸 사람이 초기 패킷을 다시 보내지 않도록하고 수신기에서 처리하는 것을 피하는 것만이 아니라. – Hicaro

답변

4

가 프로토콜의 QoS 2 메시징 정확하게 회 의미를 제공하기 위해 두 패킷의 교환을 이용한다.

C --- PUBLISH --> S 
*1 
C <-- PUBREC --- S 
*2 
C --- PUBREL --> S 
*3 
C <-- PUBCOMP --- S 
*4 

서버는 ID를 저장하고 메시지의 전달합니다 PUBLISH 수신

. 서버가 PUBREL을 받으면 ID를 삭제할 수 있습니다. 연결이 *1에 중단하면 서버가 메시지를받은 아닌지

, 클라이언트는 알 수 없습니다. PUBLISH (전체 메시지 페이로드 포함)을 다시 보냅니다. 서버가 이미 메시지를 수신했다면 PUBREC으로 응답하면됩니다.

연결이 *2에서 중단되면 클라이언트에 PUBREC이 수신되었거나 수신되지 않을 수 있습니다. 그렇지 않은 경우 PUBLISH을 다시 보내야합니다. 그렇지 않으면 PUBREL을 전송합니다. 연결이 *3에 중단하면 서버가 메시지를받은 아닌지

, 클라이언트는 알 수 없습니다. 전체 메시지 페이로드가 포함되지 않은 PUBREL을 다시 보냅니다.

*4에서 연결이 끊어지고 클라이언트가 PUBCOMP을받지 못하면 PUBREL을 다시 보낼 수 있습니다.

두 교환이 필요한 이유를 두 가지 관측이 있습니다

  1. 서버가 본적이있는 모든 메시지를 기억할 필요는 없습니다. 메시지 ID를 저장하는 데는 아주 잘 정의 된 기간이 있습니다. 두 교류를 통해 양측은 메시지가 정확히 전달 된 것을 확실하게 알 수 있습니다. 연결이. *1에서 중단 네트워크 트래픽을 최소화하기위한 것입니다 프로토콜을 감안하지 않는
  2. 클라이언트가 여러 번 게시 재전송 할 필요가 없다는 (이것은 중요한 기능입니다.
+0

MQTT는 데이터베이스를 사용하지 않고 모든 데이터가 메모리에 있으므로 패킷을 4 개 필요합니다. 메시지를 저장하고 2 개의 패킷을 사용할 수 있습니다 – user501836

+0

데이터베이스 사용 여부는 중요하지 않습니다. 귀하의 계획은 중복을 피하기 위해 브로커가 모든 메시지를 영원히 저장해야한다고 제안합니다. – knolleary

+0

MQTT로 IM 서비스를 만들고 싶기 때문에 모든 메시지를 저장해야합니다. MQTT는 매우 유용합니다. – user501836