MQTT Version 3.1.1


MQTT Version 3.1.1

MQTT Version 3.1.1

OASIS Standard

29 October 2014

Specification URIs

This version:

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.doc (Authoritative)

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.pdf

Previous version:

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/cos01/mqtt-v3.1.1-cos01.doc (Authoritative)

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/cos01/mqtt-v3.1.1-cos01.html

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/cos01/mqtt-v3.1.1-cos01.pdf

Latest version:

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.doc (Authoritative)

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.pdf

Technical Committee:

OASIS Message Queuing Telemetry Transport (MQTT) TC

Chairs:

Raphael J Cohn (raphael.cohn@stormmq.com), Individual

Richard J Coppen (coppen@uk.ibm.com), IBM

Editors:

Andrew Banks (Andrew_Banks@uk.ibm.com), IBM

Rahul Gupta (rahul.gupta@us.ibm.com), IBM

Related work:

This specification is related to:

·         MQTT and the NIST Cybersecurity Framework Version 1.0. Edited by Geoff Brown and Louis-Philippe Lamoureux. Latest version: http://docs.oasis-open.org/mqtt/mqtt-nist-cybersecurity/v1.0/mqtt-nist-cybersecurity-v1.0.html.

Abstract:

MQTT is a Client Server publish/subscribe messaging transport protocol. It is light weight, open, simple, and designed so as to be easy to implement. These characteristics make it ideal for use in many situations, including constrained environments such as for communication in Machine to Machine (M2M) and Internet of Things (IoT) contexts where a small code footprint is required and/or network bandwidth is at a premium.

The protocol runs over TCP/IP, or over other network protocols that provide ordered, lossless, bi-directional connections. Its features include:

·         Use of the publish/subscribe message pattern which provides one-to-many message distribution and decoupling of applications.

·         A messaging transport that is agnostic to the content of the payload.

·         Three qualities of service for message delivery:

·         "At most once", where messages are delivered according to the best efforts of the operating environment. Message loss can occur. This level could be used, for example, with ambient sensor data where it does not matter if an individual reading is lost as the next one will be published soon after.

·         "At least once", where messages are assured to arrive but duplicates can occur.

·         "Exactly once", where message are assured to arrive exactly once. This level could be used, for example, with billing systems where duplicate or lost messages could lead to incorrect charges being applied.

·         A small transport overhead and protocol exchanges minimized to reduce network traffic.

·         A mechanism to notify interested parties when an abnormal disconnection occurs.

Status:

This document was last revised or approved bythe membership of OASIS on the above date. The level of approval is also listed above. Check the “Latest version” location noted above for possible later revisions of this document. Any other numbered Versions and other technical work produced by the Technical Committee (TC) are listed at https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=mqtt#technical.

TC members should send comments on this specification to the TC’s email list. Others should send comments to the TC’s public comment list, after subscribing to it by following the instructions at the “Send A Comment” button on the TC’s web page at https://www.oasis-open.org/committees/mqtt/.

For information on whether any patents have been disclosed that may be essential to implementing this specification, and any offers of patent licensing terms, please refer to the Intellectual Property Rights section of the Technical Committee web page (https://www.oasis-open.org/committees/mqtt/ipr.php).

Citation format:

When referencing this specification the following citation format should be used:

[mqtt-v3.1.1]

MQTT Version 3.1.1. Edited by Andrew Banks and Rahul Gupta. 29 October 2014. OASIS Standard. http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html. Latest version: http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html.

 

Notices

Copyright ? OASIS Open 2014. All Rights Reserved.

All capitalized terms in the following text have the meanings assigned to them in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The full Policy may be found at the OASIS website.

This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published, and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this section are included on all such copies and derivative works. However, this document itself may not be modified in any way, including by removing the copyright notice or references to OASIS, except as needed for the purpose of developing any document or deliverable produced by an OASIS Technical Committee (in which case the rules applicable to copyrights, as set forth in the OASIS IPR Policy, must be followed) or as required to translate it into languages other than English.

The limited permissions granted above are perpetual and will not be revoked by OASIS or its successors or assigns.

This document and the information contained herein is provided on an "AS IS" basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

OASIS requests that any OASIS Party or any other party that believes it has patent claims that would necessarily be infringed by implementations of this OASIS Committee Specification or OASIS Standard, to notify OASIS TC Administrator and provide an indication of its willingness to grant patent licenses to such patent claims in a manner consistent with the IPR Mode of the OASIS Technical Committee that produced this specification.

OASIS invites any party to contact the OASIS TC Administrator if it is aware of a claim of ownership of any patent claims that would necessarily be infringed by implementations of this specification by a patent holder that is not willing to provide a license to such patent claims in a manner consistent with the IPR Mode of the OASIS Technical Committee that produced this specification. OASIS may include such claims on its website, but disclaims any obligation to do so.

OASIS takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on OASIS' procedures with respect to rights in any document or deliverable produced by an OASIS Technical Committee can be found on the OASIS website. Copies of claims of rights made available for publication and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this OASIS Committee Specification or OASIS Standard, can be obtained from the OASIS TC Administrator. OASIS makes no representation that any information or list of intellectual property rights will at any time be complete, or that any claims in such list are, in fact, Essential Claims.

The name "OASIS" is a trademark of OASIS, the owner and developer of this specification, and should be used only to refer to the organization and its official outputs. OASIS welcomes reference to, and implementation and use of, specifications, while reserving the right to enforce its marks against misleading uses. Please see https://www.oasis-open.org/policies-guidelines/trademark for above guidance.

 

Table of Contents

1        Introduction. 9

1.1 Organization of MQTT. 9

1.2 Terminology. 9

1.3 Normative references. 10

1.4 Non normative references. 11

1.5 Data representations. 13

1.5.1 Bits. 13

1.5.2 Integer data values. 13

1.5.3 UTF-8 encoded strings. 13

1.6 Editing conventions. 15

2        MQTT Control Packet format16

2.1 Structure of an MQTT Control Packet16

2.2 Fixed header16

2.2.1 MQTT Control Packet type. 16

2.2.2 Flags. 17

2.2.3 Remaining Length. 18

2.3 Variable header19

2.3.1 Packet Identifier20

2.4 Payload. 21

3        MQTT Control Packets. 23

3.1 CONNECT – Client requests a connection to a Server23

3.1.1 Fixed header23

3.1.2 Variable header23

3.1.3 Payload. 29

3.1.4 Response. 30

3.2 CONNACK – Acknowledge connection request31

3.2.1 Fixed header31

3.2.2 Variable header31

3.2.3 Payload. 33

3.3 PUBLISH – Publish message. 33

3.3.1 Fixed header33

3.3.2 Variable header35

3.3.3 Payload. 36

3.3.4 Response. 36

3.3.5 Actions. 36

3.4 PUBACK – Publish acknowledgement37

3.4.1 Fixed header37

3.4.2 Variable header37

3.4.3 Payload. 37

3.4.4 Actions. 37

3.5 PUBREC – Publish received (QoS 2 publish received, part 1)37

3.5.1 Fixed header38

3.5.2 Variable header38

3.5.3 Payload. 38

3.5.4 Actions. 38

3.6 PUBREL – Publish release (QoS 2 publish received, part 2)38

3.6.1 Fixed header38

3.6.2 Variable header39

3.6.3 Payload. 39

3.6.4 Actions. 39

3.7 PUBCOMP – Publish complete (QoS 2 publish received, part 3)39

3.7.1 Fixed header39

3.7.2 Variable header40

3.7.3 Payload. 40

3.7.4 Actions. 40

3.8 SUBSCRIBE - Subscribe to topics. 40

3.8.1 Fixed header40

3.8.2 Variable header40

3.8.3 Payload. 41

3.8.4 Response. 42

3.9 SUBACK – Subscribe acknowledgement43

3.9.1 Fixed header44

3.9.2 Variable header44

3.9.3 Payload. 44

3.10 UNSUBSCRIBE – Unsubscribe from topics. 45

3.10.1 Fixed header45

3.10.2 Variable header45

3.10.3 Payload. 46

3.10.4 Response. 46

3.11 UNSUBACK – Unsubscribe acknowledgement47

3.11.1 Fixed header47

3.11.2 Variable header47

3.11.3 Payload. 48

3.12 PINGREQ – PING request48

3.12.1 Fixed header48

3.12.2 Variable header48

3.12.3 Payload. 48

3.12.4 Response. 48

3.13 PINGRESP – PING response. 48

3.13.1 Fixed header48

3.13.2 Variable header49

3.13.3 Payload. 49

3.14 DISCONNECT – Disconnect notification. 49

3.14.1 Fixed header49

3.14.2 Variable header49

3.14.3 Payload. 49

3.14.4 Response. 49

4        Operational behavior51

4.1 Storing state. 51

4.1.1 Non normative example. 51

4.2 Network Connections. 52

4.3 Quality of Service levels and protocol flows. 52

4.3.1 QoS 0: At most once delivery. 52

4.3.2 QoS 1: At least once delivery. 53

4.3.3 QoS 2: Exactly once delivery. 54

4.4 Message delivery retry. 55

4.5 Message receipt56

4.6 Message ordering. 56

4.7 Topic Names and Topic Filters. 57

4.7.1 Topic wildcards. 57

4.7.2 Topics beginning with $. 58

4.7.3 Topic semantic and usage. 58

4.8 Handling errors. 59

5        Security. 60

5.1 Introduction. 60

5.2 MQTT solutions: security and certification. 60

5.3 Lightweight cryptography and constrained devices. 61

5.4 Implementation notes. 61

5.4.1 Authentication of Clients by the Server61

5.4.2 Authorization of Clients by the Server61

5.4.3 Authentication of the Server by the Client61

5.4.4 Integrity of Application Messages and Control Packets. 62

5.4.5 Privacy of Application Messages and Control Packets. 62

5.4.6 Non-repudiation of message transmission. 62

5.4.7 Detecting compromise of Clients and Servers. 62

5.4.8 Detecting abnormal behaviors. 63

5.4.9 Other security considerations. 63

5.4.10 Use of SOCKS. 64

5.4.11 Security profiles. 64

6        Using WebSocket as a network transport65

6.1 IANA Considerations. 65

7        Conformance. 66

7.1 Conformance Targets. 66

7.1.1 MQTT Server66

7.1.2 MQTT Client66

Appendix A.       Acknowledgements  (non normative)68

Appendix B.       Mandatory normative statements (non normative)70

Appendix C.       Revision history  (non normative)80

 

Table of Figures and Tables

Figure 1.1 Structure of UTF-8 encoded strings. 13

Figure 1.2 UTF-8 encoded string non normative example………………………………………………………………..…14

Figure 2.1 – Structure of an MQTT Control Packet16

Figure 2.2 - Fixed header format16

Table 2.1 - Control packet types. 16

Table 2.2 - Flag Bits. 17

Table 2.4 Size of Remaining Length field. 18

Figure 2.3 - Packet Identifier bytes. 20

Table 2.5 - Control Packets that contain a Packet Identifier20

Table 2.6 - Control Packets that contain a Payload. 21

Figure 3.1 – CONNECT Packet fixed header23

Figure 3.2 - Protocol Name bytes. 23

Figure 3.3 - Protocol Level byte. 24

Figure 3.4 - Connect Flag bits. 24

Figure 3.5 Keep Alive bytes. 27

Figure 3.6 - Variable header non normative example. 28

Figure 3.7 - Password bytes. 30

Figure 3.8 – CONNACK Packet fixed header31

Figure 3.9 – CONNACK Packet variable header31

Table 3.1 – Connect Return code values. 32

Figure 3.10 – PUBLISH Packet fixed header33

Table 3.2 - QoS definitions. 34

Table 3.3 - Publish Packet non normative example. 35

Figure 3.11 - Publish Packet variable header non normative example. 35

Table 3.4 - Expected Publish Packet response. 36

Figure 3.12 - PUBACK Packet fixed header37

Figure 3.13 – PUBACK Packet variable header37

Figure 3.14 – PUBREC Packet fixed header38

Figure 3.15 – PUBREC Packet variable header38

Figure 3.16 – PUBREL Packet fixed header38

Figure 3.17 – PUBREL Packet variable header39

Figure 3.18 – PUBCOMP Packet fixed header39

Figure 3.19 – PUBCOMP Packet variable header40

Figure 3.20 – SUBSCRIBE Packet fixed header40

Figure 3.21 - Variable header with a Packet Identifier of 10, Non normative example. 41

Figure 3.22 – SUBSCRIBE Packet payload format41

Table 3.5 - Payload non normative example. 42

Figure 3.23 - Payload byte format non normative example. 42

Figure 3.24 – SUBACK Packet fixed header44

Figure 3.25 – SUBACK Packet variable header44

Figure 3.26 – SUBACK Packet payload format44

Table 3.6 - Payload non normative example. 45

Figure 3.27 - Payload byte format non normative example. 45

Figure 3.28 – UNSUBSCRIBE Packet Fixed header45

Figure 3.29 – UNSUBSCRIBE Packet variable header45

Table3.7 - Payload non normative example. 46

Figure 3.30 - Payload byte format non normative example. 46

Figure 3.31 – UNSUBACK Packet fixed header47

Figure 3.32 – UNSUBACK Packet variable header47

Figure 3.33 – PINGREQ Packet fixed header48

Figure 3.34 – PINGRESP Packet fixed header48

Figure 3.35 – DISCONNECT Packet fixed header49

Figure 4.1 – QoS 0 protocol flow diagram, non normative example. 52

Figure 4.2 – QoS 1 protocol flow diagram, non normative example. 53

Figure 4.3 – QoS 2 protocol flow diagram, non normative example. 54

Figure 6.1 - IANA WebSocket Identifier65

 

 


Chapter 1 - Introduction

Chapter 2 - MQTT Control Packet format

Chapter 3 - MQTT Control Packets

Chapter 4 - Operational behavior

·   Chapter 5 - Security

·   Chapter 6 - Using WebSocket as a network transport

·   Chapter 7 - Conformance Targets

[RFC2119].

Network Connection:

A construct provided by the underlying transport protocol that is being used by MQTT.

·         It connects the Client to the Server.

·         It provides the means to send an ordered, lossless, stream of bytes in both directions.

For examples see Section 4.2.

Application Message:
The data carried by the MQTT protocol across the network for the application. When Application Messages are transported by MQTT they have an associated Quality of Service and a Topic Name.

Client:

A program or device that uses MQTT. A Client always establishes the Network Connection to the Server. It can

·         Publish Application Messages that other Clients might be interested in.

·         Subscribe to request Application Messages that it is interested in receiving.

·         Unsubscribe to remove a request for Application Messages.

·         Disconnect from the Server.

Server:
A program or device that acts as an intermediary between Clients which publish Application Messages and Clients which have made Subscriptions. A Server

·         Accepts Network Connections from Clients.

·         Accepts Application Messages published by Clients.

·         Processes Subscribe and Unsubscribe requests from Clients.

·         Forwards Application Messages that match Client Subscriptions.

Subscription:
A Subscription comprises a Topic Filter and a maximum QoS. A Subscription is associated with a single Session. A Session can contain more than one Subscription. Each Subscription within a session has a different Topic Filter.

Topic Name:
The label attached to an Application Message which is matched against the Subscriptions known to the Server. The Server sends a copy of the Application Message to each Client that has a matching Subscription.

Topic Filter:
An expression contained in a Subscription, to indicate an interest in one or more topics. A Topic Filter can include wildcard characters.

Session:
A stateful interaction between a Client and a Server.Some Sessions last only as long as the Network Connection, others can span multiple consecutive Network Connections between a Client and a Server.

MQTT Control Packet:
A packet of information that is sent across the Network Connection. The MQTT specification defines fourteen different types of Control Packet, one of which (the PUBLISH packet) is used to convey Application Messages.

http://www.ietf.org/rfc/rfc2119.txthttp://www.ietf.org/rfc/rfc5246.txt

 

[http://www.ietf.org/rfc/rfc6455.txt

 

[Unicode]

The Unicode Consortium. The Unicode Standard.

http://www.unicode.org/versions/latest/

http://www.ietf.org/rfc/rfc793.txt

 

http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf

 

[http://csrc.nist.gov/publications/fips/fips46-3/fips46-3.pdf

 

[http://csrc.nist.gov/publications/fips/fips140-2/fips1402.pdf

 

[http://standards.ieee.org/findstds/standard/802.1AR-2009.html

 

[http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=56425

 

[MQTT NIST]

MQTT supplemental publication, MQTT and the NIST Framework for Improving Critical Infrastructure Cybersecurity

http://docs.oasis-open.org/mqtt/mqtt-nist-cybersecurity/v1.0/mqtt-nist-cybersecurity-v1.0.html

 

[MQTTV31]

MQTT V3.1 Protocol Specification.

http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html

 

[http://www.nist.gov/itl/upload/preliminary-cybersecurity-framework.pdf

 

[http://www.nist.gov/smartgrid/upload/nistir-7628_total.pdf

 

[http://www.nsa.gov/ia/programs/suiteb_cryptography/

 

[https://www.pcisecuritystandards.org/security_standards/

 

[http://www.ietf.org/rfc/rfc1928.txt

 

[http://www.ietf.org/rfc/rfc4511.txt

 

[http://www.ietf.org/rfc/rfc5077.txt

 

[http://www.ietf.org/rfc/rfc5280.txt

 

[http://www.ietf.org/rfc/rfc6066.txt

 

[http://www.ietf.org/rfc/rfc6749.txt

 

[http://www.ietf.org/rfc/rfc6960.txt

 

[http://www.gpo.gov/fdsys/pkg/PLAW-107publ204/html/PLAW-107publ204.htm

 

[http://export.gov/safeharbor/eu/eg_main_018365.asp

RFC3629] is an efficient encoding of Unicode [Unicode]characters that optimizes the encoding of ASCII characters in support of text-based communications.

 

Each of these strings is prefixed with a two byte length field that gives the number of bytes in a UTF-8 encoded string itself, as illustrated in Figure 1.1 Structure of UTF-8 encoded strings below. Consequently there is a limit on the size of a string that can be passed in one of these UTF-8 encoded string components; you cannot use a string that would encode to more than 65535 bytes.

 

Unless stated otherwise all UTF-8 encoded strings can have any length in the range 0 to 65535 bytes.

Unicode] and restated in RFC 3629 [RFC3629]. In particular this data MUST NOT include encodings of code points between U+D800 and U+DFFF. If a Server or Client receives a Control Packet containing ill-formed UTF-8 it MUST close the Network Connection [MQTT-1.5.3-1].

A UTF-8 encoded string MUST NOT include an encoding of the null character U+0000. If a receiver (Server or Client) receives a Control Packet containing U+0000 it MUST close the Network Connection [MQTT-1.5.3-2].

The data SHOULD NOT include encodings of the Unicode [Unicode] code points listed below. If a receiver (Server or Client) receives a Control Packet containing any of them it MAY close the Network Connection:

U+0001..U+001F control characters 
U+007F..U+009F control characters 
Code points defined in the Unicode specification [Unicode] to be non-characters (for example U+0FFFF) 

A UTF-8 encoded sequence 0xEF 0xBB 0xBF is always to be interpreted to mean U+FEFF ("ZERO WIDTH NO-BREAK SPACE") wherever it appears in a string and MUST NOT be skipped over or stripped off by a packet receiver [MQTT-1.5.3-3].

 

Figure 2.1 - Structure of an MQTT Control Packet.

 

Figure 2.2 - Fixed header format illustrates the fixed header format.

 

Table 2.1 - Control packet types.

 

Table 2.2 - Flag Bits below. Where a flag bit is marked as “Reserved” in Table 2.2 - Flag Bits, it is reserved for future use and MUST be set to the value listed in that table [MQTT-2.2.2-1]. If invalid flags are received, the receiver MUST close the Network Connection [MQTT-2.2.2-2].See Section 4.8 for details about handling errors.

 

Table 2.4 shows the Remaining Length values represented by increasing numbers of bytes.

 

Table 2.5 - Control Packets that contain a Packet Identifier.

Table 2.6 - Control Packets that contain a Payload lists the Control Packets that require a Payload.

MQTT-3.1.2-5]. It MAY also store QoS 0 messages that meet the same criteria.

 

If CleanSession is set to 1, the Client and Server MUST discard any previous Session and start a new one. This Session lasts as long as the Network Connection. State data associated with this Session MUST NOT be reused in any subsequent Session [MQTT-3.1.2-6].

 

The Session state in the Client consists of:

·         QoS 1 and QoS 2 messages which have been sent to the Server, but have not been completely acknowledged.

·         QoS 2 messages which have been received from the Server, but have not been completely acknowledged. 

 

The Session state in the Server consists of:

·         The existence of a Session, even if the rest of the Session state is empty.

·         The Client’s subscriptions.

·         QoS 1 and QoS 2 messages which have been sent to the Client, but have not been completely acknowledged.

·         QoS 1 and QoS 2 messages pending transmission to the Client.

·         QoS 2 messages which have been received from the Client, but have not been completely acknowledged.

·         Optionally, QoS 0 messages pending transmission to the Client. 

 

Retained messages do not form part of the Session state in the Server, they MUST NOT be deleted when the Session ends [MQTT-3.1.2.7].

 

See Section 4.1 for details and limitations of stored state.

 

When CleanSession is set to 1 the Client and Server need not process the deletion of state atomically.

 

Non normative comment

To ensure consistent state in the event of a failure, the Client should repeat its attempts to connect with CleanSession set to 1, until it connects successfully.

 

Non normative comment

Typically, a Client will always connect using CleanSession set to 0 or CleanSession set to 1 and not swap between the two values. The choice will depend on the application. A Client using CleanSession set to 1 will not receive old Application Messages and has to subscribe afresh to any topics that it is interested in each time it connects. A Client using CleanSession set to 0 will receive all QoS 1 or QoS 2 messages that were published while it was disconnected. Hence, to ensure that you do not lose messages while disconnected, use QoS 1 or QoS 2 with CleanSession set to 0.

 

Non normative comment

When a Client connects with CleanSession set to 0, it is requesting that the Server maintain its MQTT session state after it disconnects. Clients should only connect with CleanSession set to 0, if they intend to reconnect to the Server at some later point in time. When a Client has determined that it has no further use for the session it should do a final connect with CleanSession set to 1 and then disconnect.

Figure 3.8 – CONNACK Packet fixed header.

Table 3.1 – Connect Return code values. If a well formed CONNECT Packet is received by the Server, but the Server is unable to process it for some reason, then the Server SHOULD attempt to send a CONNACK packet containing the appropriate non-zero Connect return code from this table. If a server sends a CONNACK packet containing a non-zero return code it MUST then close the Network Connection [MQTT-3.2.2-5].

Table 3.2 - QoS definitions, below.

 

Figure 3.11 - Publish Packet variable header non normative example illustrates an example variable header for the PUBLISH Packet briefly described in Table 3.3 - Publish Packet non normative example.

Table 3.4 - Expected Publish Packet response as determined by the QoS in the PUBLISH Packet [MQTT-3.3.4-1].

Figure 3.21 shows a variable header with Packet Identifier set to 10.

4.7.1. If it chooses not to support topic filters that contain wildcard characters it MUST reject any Subscription request whose filter contains them [MQTT-3.8.3-2]. Each filter is followed by a byte called the Requested QoS. This gives the maximum QoS level at which the Server can send Application Messages to the Client.

 

The payload of a SUBSCRIBE packet MUST contain at least one Topic Filter / QoS pair. A SUBSCRIBE packet with no payload is a protocol violation [MQTT-3.8.3-3]. See section 4.8 for information about handling errors.

 

The requested maximum QoS field is encoded in the byte following each UTF-8 encoded topic name, and these Topic Filter / QoS pairs are packed contiguously.

 

Figure 3.23 - Payload byte format non normative example shows the payload for the SUBSCRIBE Packet briefly described inTable 3.5 - Payload non normative example.

 

MQTT-3.8.4-3].

 

Where the Topic Filter is not identical to any existing Subscription’s filter, a new Subscription is created and all matching retained messages are sent.

 

If a Server receives a SUBSCRIBE packet that contains multiple Topic Filters it MUST handle that packet as if it had received a sequence of multiple SUBSCRIBE packets, except that it combines their responses into a single SUBACK response [MQTT-3.8.4-4].

 

The SUBACK Packet sent by the Server to the Client MUST contain a return code for each Topic Filter/QoS pair. This return code MUST either show the maximum QoS that was granted for that Subscription or indicate that the subscription failed[MQTT-3.8.4-5]. The Server might grant a lower maximum QoS than the subscriber requested. The QoS of Payload Messages sent in response to a Subscription MUST be the minimum of the QoS of the originally published message and the maximum QoS granted by the Server. The server is permitted to send duplicate copies of a message to a subscriber in the case where the original message was published with QoS 1 and the maximum QoS granted was QoS 0 [MQTT-3.8.4-6].

 

Non normative examples

If a subscribing Client has been granted maximum QoS 1 for a particular Topic Filter, then a QoS 0 Application Message matching the filter is delivered to the Client at QoS 0. This means that at most one copy of the message is received by the Client. On the other hand a QoS 2 Message published to the same topic is downgraded by the Server to QoS 1 for delivery to the Client, so that Client might receive duplicate copies of the Message. 

If the subscribing Client has been granted maximum QoS 0, then an Application Message originally published as QoS 2 might get lost on the hop to the Client, but the Server should never send a duplicate of that Message. A QoS 1 Message published to the same topic might either get lost or duplicated on its transmission to that Client.

 

Non normative comment

Subscribing to a Topic Filter at QoS 2 is equivalent to saying "I would like to receive Messages matching this filter at the QoS with which they were published". This means a publisher is responsible for determining the maximum QoS a Message can be delivered at, but a subscriber is able to require that the Server downgrades the QoS to one more suitable for its usage.

Figure 3.25 - variable header format below illustrates the format of the variable header.

Figure 3.26 - Payload format below illustrates the Return Code field encoded in a byte in the Payload.

Figure 3.27 - Payload byte format non normative example shows the payload for the SUBACK Packet briefly described inTable 3.6 - Payload non normative example.

Figure 3.30 - Payload byte format non normative exampleshow the payload for the UNSUBSCRIBE Packet briefly described inTable3.7 - Payload non normative example.

RFC793]. TCP/IP can be used for MQTT 3.1.1. The following are also suitable:

·         TLS [RFC5246]

·         WebSocket [RFC6455]

Non normative comment

TCP ports 8883 and 1883 are registered with IANA for MQTT TLS and non TLS communication respectively.

 

Connectionless network transports such as User Datagram Protocol (UDP) are not suitable on their own because they might lose or reorder data.

Figure 4.3 shows that there are two methods by which QoS 2 can be handled by the receiver. They differ in the point within the flow at which the message is made available for onward delivery. The choice of Method A or Method B is implementation specific. As long as an implementation chooses exactly one of these approaches, this does not affect the guarantees of a QoS 2 flow.

 

Unicode] [MQTT-4.7.3-2]
  • Topic Names and Topic Filters are UTF-8 encoded strings, they MUST NOT encode to more than 65535 bytes [MQTT-4.7.3-3]. See Section 1.5.3
  • There is no limit to the number of levels in a Topic Name or Topic Filter, other than that imposed by the overall length of a UTF-8 encoded string.

    When it performs subscription matching the Server MUST NOT perform any normalization of Topic Names or Topic Filters, or any modification or substitution of unrecognized characters [MQTT-4.7.3-4]. Each non-wildcarded level in the Topic Filter has to match the corresponding level in the Topic Name character for character for the match to succeed.

     

    Non normative comment

    The UTF-8 encoding rules mean that the comparison of Topic Filter and Topic Name could be performed either by comparing the encoded UTF-8 bytes, or by comparing decoded Unicode characters 

     

    Non normative comment

    ·         “ACCOUNTS” and “Accounts” are two different topic names

    ·         “Accounts payable” is a valid topic name

    ·         “/finance” is different from “finance”

     

    An Application Message is sent to each Client Subscription whose Topic Filter matches the Topic Name attached to an Application Message. The topic resource MAY be either predefined in the Server by an administrator or it MAY be dynamically created by the Server when it receives the first subscription or an Application Message with that Topic Name. The Server MAY also use a security component to selectively authorize actions on the topic resource for a given Client.

    [RFC5246] SHOULD use TCP port 8883 (IANA service name: secure-mqtt).

     

    There are a number of threats that solution providers should consider. For example:

    • Devices could be compromised
    • Data at rest in Clients and Servers might be accessible
    • Protocol behaviors could have side effects (e.g. “timing attacks”)
    • Denial of Service (DoS) attacks
    • Communications could be intercepted, altered, re-routed or disclosed
    • Injection of spoofed Control Packets

     

    MQTT solutions are often deployed in hostile communication environments. In such cases, implementations will often need to provide mechanisms for:

    • Authentication of users and devices
    • Authorization of access to Server resources
    • Integrity of MQTT Control Packets and application data contained therein
    • Privacy of MQTT Control Packets and application data contained therein

     

    As a transport protocol, MQTT is concerned only with message transmission and it is the implementer’s responsibility to provide appropriate security features. This is commonly achieved by using TLS [RFC5246].

     

    In addition to technical security issues there could also be geographic (e.g. U.S.-EU SafeHarbor [USEUSAFEHARB]), industry specific (e.g. PCI DSS [PCIDSS]) and regulatory considerations (e.g. Sarbanes-Oxley [SARBANES]).

    NISTCSF], PCI-DSS [PCIDSS]), FIPS-140-2 [FIPS1402] and NSA Suite B [NSAB].

    Guidance on using MQTT within the NIST Cyber Security Framework [NISTCSF]can be found in the MQTT supplemental publication, MQTT and the NIST Framework for Improving Critical Infrastructure Cybersecurity [MQTT NIST]. The use of industry proven, independently verified and certified technologies will help meet compliance requirements.

    [AES] and Data Encryption Standard [DES] are widely adopted.

     

    ISO 29192 [ISO29192]makes recommendations for cryptographic primitives specifically tuned to perform on constrained “low end” devices.

    [RFC4511] or OAuth [RFC6749] tokens, or leverage operating system authentication mechanisms.

     

    Implementations passing authentication data in clear text, obfuscating such data elements or requiring no authentication data should be aware this can give rise to Man-in-the-Middle and replay attacks. Section 5.4.5 introduces approaches to ensure data privacy.

     

    A Virtual Private Network (VPN) between the Clients and Servers can provide confidence that data is only being received from authorized Clients.

     

    Where TLS [RFC5246] is used, SSL Certificates sent from the Client can be used by the Server to authenticate the Client.

     

    An implementation might allow for authentication where the credentials are sent in an Application Message from the Client to the Server.

    [RFC5246] is used, SSL Certificates sent from the Server can be used by the Client to authenticate the Server. Implementations providing MQTT service for multiple hostnames from a single IP address should be aware of the Server Name Indication extension to TLS defined in section 3 of RFC 6066[RFC6066].This allows a Client to tell the Server the hostname of the Server it is trying to connect to.

     

    An implementation might allow for authentication where the credentials are sent in an Application Message from the Server to the Client.

     

    A VPN between Clients and Servers can provide confidence that Clients are connecting to the intended Server.

    [RFC5246] provides hash algorithms to verify the integrity of data sent over the network.

     

    The use of VPNs to connect Clients and Servers can provide integrity of data across the section of the network covered by a VPN.

    [RFC5246] can provide encryption of data sent over the network. There are valid TLS cipher suites that include a NULL encryption algorithm that does not encrypt data. To ensure privacy Clients and Servers should avoid these cipher suites.

     

    An application might independently encrypt the contents of its Application Messages. This could provide privacy of the Application Message both over the network and at rest. This would not provide privacy for other properties of the Application Message such as Topic Name.

     

    Client and Server implementations can provide encrypted storage for data at rest such as Application Messages stored as part of a Session.

     

    The use of VPNs to connect Clients and Servers can provide privacy of data across the section of the network covered by a VPN.

    5.4.6  [RFC5246] should provide capabilities to ensure that any SSL certificates provided when initiating a TLS [RFC5246] connection are associated with the hostname of the Client connecting or Server being connected to.

     

    Client and Server implementations using TLS [RFC5246] can choose to provide capabilities to check Certificate Revocation Lists (CRLs [RFC5280]) and Online Certificate Status Protocol (OSCP)[RFC6960]to prevent revoked certificates from being used.

     

    Physical deployments might combine tamper-proof hardware with the transmission of specific data in Application Messages. For example a meter might have an embedded GPS to ensure it is not used in an unauthorized location. [IEEE 802.1AR] is a standard for implementing mechanisms to authenticate a device’s identity using a cryptographically bound identifier.

    [RFC5280] and/or OSCP [RFC6960]).

     

    Client or Server authentication credentials, such as User Name and Password, that are lost or considered compromised should be revoked and/or reissued.

     

    In the case of long lasting connections:

    • Client and Server implementations using TLS [RFC5246] should allow for session renegotiation to establish new cryptographic parameters (replace session keys, change cipher suites, change authentication credentials).
    • Servers may disconnect Clients and require them to re-authenticate with new credentials.

     

    Constrained devices and Clients on constrained networks can make use of TLS session resumption [RFC5077], in order to reduce the costs of reconnecting TLS [RFC5246] sessions.

     

    Clients connected to a Server have a transitive trust relationship with other Clients connected to the same Server and who have authority to publish data on the same topics.

    [RFC1928] proxies to make outbound Network Connections. Some MQTT implementations could make use of alternative secured tunnels (e.g. SSH) through the use of SOCKS. Where implementations choose to use SOCKS, they should support both anonymous and user-name password authenticating SOCKS proxies. In the latter case, implementations should be aware that SOCKS authentication might occur in plain-text and so should avoid using the same credentials for connection to a MQTT Server.

    [RFC5246] which provides authentication, integrity and privacy.

     

    TLS [RFC5246]Client authentication can be used in addition to – or in place of – MQTT Client authentication as provided by the Username and Password fields.

    [NISTCSF]NIST Cyber Security Framework
    [NIST7628]NISTIR 7628 Guidelines for Smart Grid Cyber Security
    [FIPS1402]Security Requirements for Cryptographic Modules (FIPS PUB 140-2)
    [PCIDSS]PCI-DSS Payment Card Industry Data Security Standard
    [NSAB]NSA Suite B Cryptography

    [RFC6455] connection, the following conditions apply:

    ·         MQTT Control Packets MUST be sent in WebSocket binary data frames. If any other type of data frame is received the recipient MUST close the Network Connection [MQTT-6.0.0-1].

    ·         A single WebSocket data frame can contain multiple or partial MQTT Control Packets. The receiver MUST NOT assume that MQTT Control Packets are aligned on WebSocket frame boundaries [MQTT-6.0.0-2].

    ·         The client MUST include “mqtt” in the list of WebSocket Sub Protocols it offers [MQTT-6.0.0-3]. 

    ·         The WebSocket Sub Protocol name selected and returned by the server MUST be “mqtt”[MQTT-6.0.0-4].

    ·         The WebSocket URI used to connect the client and server has no impact on the MQTT protocol.

    6.1  geoff.brown@m2mi.com), M2MI

     

    Appendix B.Mandatory normative statements (non normative)

    This Appendix is non-normative and is provided as a convenient summary of the numbered conformance statements found in the main body of this document. See Chapter 7 for a definitive list of conformance requirements. 

    Normative Statement Number

    Normative Statement

    [MQTT-1.5.3-1]

    The character data in a UTF-8 encoded string MUST be well-formed UTF-8 as defined by the Unicode specification [Unicode] and restated in RFC 3629 [RFC3629]. In particular this data MUST NOT include encodings of code points between U+D800 and U+DFFF. If a Server or Client receives a Control Packet containing ill-formed UTF-8 it MUST close the Network Connection.

    [MQTT-1.5.3-2]

    A UTF-8 encoded string MUST NOT include an encoding of the null character U+0000. If a receiver (Server or Client) receives a Control Packet containing U+0000 it MUST close the Network Connection.

    [MQTT-1.5.3-3]

    A UTF-8 encoded sequence 0xEF 0xBB 0xBF is always to be interpreted to mean U+FEFF ("ZERO WIDTH NO-BREAK SPACE") wherever it appears in a string and MUST NOT be skipped over or stripped off by a packet receiver.

    [MQTT-2.2.2-1]

    Where a flag bit is marked as “Reserved” in Table 2.2 - Flag Bits, it is reserved for future use and MUST be set to the value listed in that table.

    [MQTT-2.2.2-2]

    If invalid flags are received, the receiver MUST close the Network Connection.

    [MQTT-2.3.1-1]

    SUBSCRIBE, UNSUBSCRIBE, and PUBLISH (in cases where QoS > 0) Control Packets MUST contain a non-zero 16-bit Packet Identifier.

    [MQTT-2.3.1-2]

    Each time a Client sends a new packet of one of these types it MUST assign it a currently unused Packet Identifier.

    [MQTT-2.3.1-3]

    If a Client re-sends a particular Control Packet, then it MUST use the same Packet Identifier in subsequent re-sends of that packet. The Packet Identifier becomes available for reuse after the Client has processed the corresponding acknowledgement packet. In the case of a QoS 1 PUBLISH this is the corresponding PUBACK; in the case of QO2 it is PUBCOMP. For SUBSCRIBE or UNSUBSCRIBE it is the corresponding SUBACK or UNSUBACK.

    [MQTT-2.3.1-4]

    The same conditions [MQTT-2.3.1-3] apply to a Server when it sends a PUBLISH with QoS >0.

    [MQTT-2.3.1-5]

    A PUBLISH Packet MUST NOT contain a Packet Identifier if its QoS value is set to 0.

    [MQTT-2.3.1-6]

    A PUBACK, PUBREC or PUBREL Packet MUST contain the same Packet Identifier as the PUBLISH Packet that was originally sent.

    [MQTT-2.3.1-7]

    Similarly to [MQTT-2.3.1-6], SUBACK and UNSUBACK MUST contain the Packet Identifier that was used in the corresponding SUBSCRIBE and UNSUBSCRIBE Packet respectively.

    [MQTT-3.1.0-1]

    After a Network Connection is established by a Client to a Server, the first Packet sent from the Client to the Server MUST be a CONNECT Packet.

    [MQTT-3.1.0-2]

    The Server MUST process a second CONNECT Packet sent from a Client as a protocol violation and disconnect the Client.

    [MQTT-3.1.2-1]

    If the protocol name is incorrect the Server MAY disconnect the Client, or it MAY continue processing the CONNECT packet in accordance with some other specification. In the latter case, the Server MUST NOT continue to process the CONNECT packet in line with this specification.

    [MQTT-3.1.2-2]

    The Server MUST respond to the CONNECT Packet with a CONNACK return code 0x01 (unacceptable protocol level) and then disconnect the Client if the Protocol Level is not supported by the Server.

    [MQTT-3.1.2-3]

    The Server MUST validate that the reserved flag in the CONNECT Control Packet is set to zero and disconnect the Client if it is not zero.

    [MQTT-3.1.2-4]

    If CleanSession is set to 0, the Server MUST resume communications with the Client based on state from the current Session (as identified by the Client identifier). If there is no Session associated with the Client identifier the Server MUST create a new Session. The Client and Server MUST store the Session after the Client and Server are disconnected.

    [MQTT-3.1.2-5]

    After the disconnection of a Session that had CleanSession set to 0, the Server MUST store further QoS 1 and QoS 2 messages that match any subscriptions that the client had at the time of disconnection as part of the Session state.

    [MQTT-3.1.2-6]

    If CleanSession is set to 1, the Client and Server MUST discard any previous Session and start a new one. This Session lasts as long as the Network Connection. State data associated with this Session MUST NOT be reused in any subsequent Session.

    [MQTT-3.1.2.7]

    Retained messages do not form part of the Session state in the Server, they MUST NOT be deleted when the Session ends.

    [MQTT-3.1.2-8]

    If the Will Flag is set to 1 this indicates that, if the Connect request is accepted, a Will Message MUST be stored on the Server and associated with the Network Connection. The Will Message MUST be published when the Network Connection is subsequently closed unless the Will Message has been deleted by the Server on receipt of a DISCONNECT Packet.

    [MQTT-3.1.2-9]

    If the Will Flag is set to 1, the Will QoS and Will Retain fields in the Connect Flags will be used by the Server, and the Will Topic and Will Message fields MUST be present in the payload.

    [MQTT-3.1.2-10]

    The Will Message MUST be removed from the stored Session state in the Server once it has been published or the Server has received a DISCONNECT packet from the Client.

    [MQTT-3.1.2-11]

    If the Will Flag is set to 0 the Will QoS and Will Retain fields in the Connect Flags MUST be set to zero and the Will Topic and Will Message fields MUST NOT be present in the payload.

    [MQTT-3.1.2-12]

    If the Will Flag is set to 0, a Will Message MUST NOT be published when this Network Connection ends.

    [MQTT-3.1.2-13]

    If the Will Flag is set to 0, then the Will QoS MUST be set to 0 (0x00).

    [MQTT-3.1.2-14]

    If the Will Flag is set to 1, the value of Will QoS can be 0 (0x00), 1 (0x01), or 2 (0x02). It MUST NOT be 3 (0x03).

    [MQTT-3.1.2-15]

    If the Will Flag is set to 0, then the Will Retain Flag MUST be set to 0.

    [MQTT-3.1.2-16]

    If the Will Flag is set to 1 and If Will Retain is set to 0, the Server MUST publish the Will Message as a non-retained message.

    [MQTT-3.1.2-17]

    If the Will Flag is set to 1 and If Will Retain is set to 1, the Server MUST publish the Will Message as a retained message.

    [MQTT-3.1.2-18]

    If the User Name Flag is set to 0, a user name MUST NOT be present in the payload.

    [MQTT-3.1.2-19]

    If the User Name Flag is set to 1, a user name MUST be present in the payload.

    [MQTT-3.1.2-20]

    If the Password Flag is set to 0, a password MUST NOT be present in the payload.

    [MQTT-3.1.2-21]

    If the Password Flag is set to 1, a password MUST be present in the payload.

    [MQTT-3.1.2-22]

    If the User Name Flag is set to 0, the Password Flag MUST be set to 0.

    [MQTT-3.1.2-23]

    It is the responsibility of the Client to ensure that the interval between Control Packets being sent does not exceed the Keep Alive value. In the absence of sending any other Control Packets, the Client MUST send a PINGREQ Packet.

    [MQTT-3.1.2-24]

    If the Keep Alive value is non-zero and the Server does not receive a Control Packet from the Client within one and a half times the Keep Alive time period, it MUST disconnect the Network Connection to the Client as if the network had failed.

    [MQTT-3.1.3-1]

    These fields, if present, MUST appear in the order Client Identifier, Will Topic, Will Message, User Name, Password.

    [MQTT-3.1.3-2]

    Each Client connecting to the Server has a unique ClientId. The ClientId MUST be used by Clients and by Servers to identify state that they hold relating to this MQTT Session between the Client and the Server.

    [MQTT-3.1.3-3]

    The Client Identifier (ClientId) MUST be present and MUST be the first field in the CONNECT packet payload.

    [MQTT-3.1.3-4]

    The ClientId MUST be a UTF-8 encoded string as defined in Section 1.5.3.

    [MQTT-3.1.3-5]

    The Server MUST allow ClientIds which are between 1 and 23 UTF-8 encoded bytes in length, and that contain only the characters

    "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".

    [MQTT-3.1.3-6]

    A Server MAY allow a Client to supply a ClientId that has a length of zero bytes. However if it does so the Server MUST treat this as a special case and assign a unique ClientId to that Client. It MUST then process the CONNECT packet as if the Client had provided that unique ClientId.

    [MQTT-3.1.3-7]

    If the Client supplies a zero-byte ClientId, the Client MUST also set CleanSession to 1.

    [MQTT-3.1.3-8]

    If the Client supplies a zero-byte ClientId with CleanSession set to 0, the Server MUST respond to the CONNECT Packet with a CONNACK return code 0x02 (Identifier rejected) and then close the Network Connection.

    [MQTT-3.1.3-9]

    If the Server rejects the ClientId it MUST respond to the CONNECT Packet with a CONNACK return code 0x02 (Identifier rejected) and then close the Network Connection.

    [MQTT-3.1.3-10]

    The Will Topic MUST be a UTF-8 encoded string as defined in Section ?1.5.3.

    [MQTT-3.1.3-11]

    The User Name MUST be a UTF-8 encoded string as defined in Section 1.5.3.

    [MQTT-3.1.4-1]

    The Server MUST validate that the CONNECT Packet conforms to section 3.1 and close the Network Connection without sending a CONNACK if it does not conform.

    [MQTT-3.1.4-2]

    If the ClientId represents a Client already connected to the Server then the Server MUST disconnect the existing Client.

    [MQTT-3.1.4-3]

    If CONNECT validation is successful the Server MUST perform the processing of CleanSession that is described in section 3.1.2.4.

    [MQTT-3.1.4-4]

    If CONNECT validation is successful the Server MUST acknowledge the CONNECT Packet with a CONNACK Packet containing a zero return code.

    [MQTT-3.1.4-5]

    If the Server rejects the CONNECT, it MUST NOT process any data sent by the Client after the CONNECT Packet.

    [MQTT-3.2.0-1]

    The first packet sent from the Server to the Client MUST be a CONNACK Packet.

    [MQTT-3.2.2-1]

    If the Server accepts a connection with CleanSession set to 1, the Server MUST set Session Present to 0 in the CONNACK packet in addition to setting a zero return code in the CONNACK packet.

    [MQTT-3.2.2-2] 

    If the Server accepts a connection with CleanSession set to 0, the value set in Session Present depends on whether the Server already has stored Session state for the supplied client ID. If the Server has stored Session state, it MUST set Session Present to 1 in the CONNACK packet.

    [MQTT-3.2.2-3]

    If the Server does not have stored Session state, it MUST set Session Present to 0 in the CONNACK packet. This is in addition to setting a zero return code in the CONNACK packet.

    [MQTT-3.2.2-4]

    If a server sends a CONNACK packet containing a non-zero return code it MUST set Session Present to 0.

    [MQTT-3.2.2-5]

    If a server sends a CONNACK packet containing a non-zero return code it MUST then close the Network Connection.

    [MQTT-3.2.2-6]

    If none of the return codes listed in Table 3.1 – Connect Return code values are deemed applicable, then the Server MUST close the Network Connection without sending a CONNACK.

    [MQTT-3.3.1-1]

    The DUP flag MUST be set to 1 by the Client or Server when it attempts to re-deliver a PUBLISH Packet.

    [MQTT-3.3.1-2]

    The DUP flag MUST be set to 0 for all QoS 0 messages.

    [MQTT-3.3.1-3]

    The value of the DUP flag from an incoming PUBLISH packet is not propagated when the PUBLISH Packet is sent to subscribers by the Server. The DUP flag in the outgoing PUBLISH packet is set independently to the incoming PUBLISH packet, its value MUST be determined solely by whether the outgoing PUBLISH packet is a retransmission.

    [MQTT-3.3.1-4]

    A PUBLISH Packet MUST NOT have both QoS bits set to 1. If a Server or Client receives a PUBLISH Packet which has both QoS bits set to 1 it MUST close the Network Connection.

    [MQTT-3.3.1-5]

    If the RETAIN flag is set to 1, in a PUBLISH Packet sent by a Client to a Server, the Server MUST store the Application Message and its QoS, so that it can be delivered to future subscribers whose subscriptions match its topic name.

    [MQTT-3.3.1-6]

    When a new subscription is established, the last retained message, if any, on each matching topic name MUST be sent to the subscriber.

    [MQTT-3.3.1-7]

    If the Server receives a QoS 0 message with the RETAIN flag set to 1 it MUST discard any message previously retained for that topic. It SHOULD store the new QoS 0 message as the new retained message for that topic, but MAY choose to discard it at any time - if this happens there will be no retained message for that topic.

    [MQTT-3.3.1-8]

    When sending a PUBLISH Packet to a Client the Server MUST set the RETAIN flag to 1 if a message is sent as a result of a new subscription being made by a Client.

    [MQTT-3.3.1-9]

    It MUST set the RETAIN flag to 0 when a PUBLISH Packet is sent to a Client because it matches an established subscription regardless of how the flag was set in the message it received.

    [MQTT-3.3.1-10]

    A PUBLISH Packet with a RETAIN flag set to 1 and a payload containing zero bytes will be processed as normal by the Server and sent to Clients with a subscription matching the topic name. Additionally any existing retained message with the same topic name MUST be removed and any future subscribers for the topic will not receive a retained message.

    [MQTT-3.3.1-11]

    A zero byte retained message MUST NOT be stored as a retained message on the Server.

    [MQTT-3.3.1-12]

    If the RETAIN flag is 0, in a PUBLISH Packet sent by a Client to a Server, the Server MUST NOT store the message and MUST NOT remove or replace any existing retained message.

    [MQTT-3.3.2-1]

    The Topic Name MUST be present as the first field in the PUBLISH Packet Variable header. It MUST be a UTF-8 encoded string.

    [MQTT-3.3.2-2]

    The Topic Name in the PUBLISH Packet MUST NOT contain wildcard characters.

    [MQTT-3.3.2-3]

    The Topic Name in a PUBLISH Packet sent by a Server to a subscribing Client MUST match the Subscription’s Topic Filter according to the matching process defined in Section 4.7.

    [MQTT-3.3.4-1]

    The receiver of a PUBLISH Packet MUST respond according to Table 3.4 - Expected Publish Packet response as determined by the QoS in the PUBLISH Packet.

    [MQTT-3.3.5-1]

    The Server MUST deliver the message to the Client respecting the maximum QoS of all the matching subscriptions.

    [MQTT-3.3.5-2]

    If a Server implementation does not authorize a PUBLISH to be performed by a Client; it has no way of informing that Client. It MUST either make a positive acknowledgement, according to the normal QoS rules, or close the Network Connection.

    [MQTT-3.6.1-1]

    Bits 3,2,1 and 0 of the fixed header in the PUBREL Control Packet are reserved and MUST be set to 0,0,1 and 0 respectively. The Server MUST treat any other value as malformed and close the Network Connection.

    [MQTT-3.8.1-1]

    Bits 3,2,1 and 0 of the fixed header of the SUBSCRIBE Control Packet are reserved and MUST be set to 0,0,1 and 0 respectively. The Server MUST treat any other value as malformed and close the Network Connection.

    [MQTT-3.8.3-1]

    The Topic Filters in a SUBSCRIBE packet payload MUST be UTF-8 encoded strings as defined in Section 1.5.3.

    [MQTT-3.8.3-2]

    If the Server chooses not to support topic filters that contain wildcard characters it MUST reject any Subscription request whose filter contains them.

    [MQTT-3.8.3-3]

    The payload of a SUBSCRIBE packet MUST contain at least one Topic Filter / QoS pair. A SUBSCRIBE packet with no payload is a protocol violation.

    [MQTT-3-8.3-4] 

    The Server MUST treat a SUBSCRIBE packet as malformed and close the Network Connection if any of Reserved bits in the payload are non-zero, or QoS is not 0,1 or 2.

    [MQTT-3.8.4-1]

    When the Server receives a SUBSCRIBE Packet from a Client, the Server MUST respond with a SUBACK Packet.

    [MQTT-3.8.4-2]

    The SUBACK Packet MUST have the same Packet Identifier as the SUBSCRIBE Packet that it is acknowledging.

    [MQTT-3.8.4-3]

    If a Server receives a SUBSCRIBE Packet containing a Topic Filter that is identical to an existing Subscription’s Topic Filter then it MUST completely replace that existing Subscription with a new Subscription. The Topic Filter in the new Subscription will be identical to that in the previous Subscription, although its maximum QoS value could be different. Any existing retained messages matching the Topic Filter MUST be re-sent, but the flow of publications MUST NOT be interrupted.

    [MQTT-3.8.4-4]

    If a Server receives a SUBSCRIBE packet that contains multiple Topic Filters it MUST handle that packet as if it had received a sequence of multiple SUBSCRIBE packets, except that it combines their responses into a single SUBACK response.

    [MQTT-3.8.4-5]

    The SUBACK Packet sent by the Server to the Client MUST contain a return code for each Topic Filter/QoS pair. This return code MUST either show the maximum QoS that was granted for that Subscription or indicate that the subscription failed.

    [MQTT-3.8.4-6]

    The Server might grant a lower maximum QoS than the subscriber requested. The QoS of Payload Messages sent in response to a Subscription MUST be the minimum of the QoS of the originally published message and the maximum QoS granted by the Server. The server is permitted to send duplicate copies of a message to a subscriber in the case where the original message was published with QoS 1 and the maximum QoS granted was QoS 0.

    [MQTT-3.9.3-1]

    The order of return codes in the SUBACK Packet MUST match the order of Topic Filters in the SUBSCRIBE Packet.

    [MQTT-3.9.3-2]

    SUBACK return codes other than 0x00, 0x01, 0x02 and 0x80 are reserved and MUST NOT be used.

    [MQTT-3.10.1-1]

    Bits 3,2,1 and 0 of the fixed header of the UNSUBSCRIBE Control Packet are reserved and MUST be set to 0,0,1 and 0 respectively. The Server MUST treat any other value as malformed and close the Network Connection.

    [MQTT-3.10.3-1]

    The Topic Filters in an UNSUBSCRIBE packet MUST be UTF-8 encoded strings as defined in Section 1.5.3, packed contiguously.

    [MQTT-3.10.3-2]

    The Payload of an UNSUBSCRIBE packet MUST contain at least one Topic Filter. An UNSUBSCRIBE packet with no payload is a protocol violation.

    [MQTT-3.10.4-1]

    The Topic Filters (whether they contain wildcards or not) supplied in an UNSUBSCRIBE packet MUST be compared character-by-character with the current set of Topic Filters held by the Server for the Client. If any filter matches exactly then its owning Subscription is deleted, otherwise no additional processing occurs.

    [MQTT-3.10.4-2]

    If a Server deletes a Subscription It MUST stop adding any new messages for delivery to the Client.

    [MQTT-3.10.4-3]

    If a Server deletes a Subscription It MUST complete the delivery of any QoS 1 or QoS 2 messages which it has started to send to the Client.

    [MQTT-3.10.4-4]

    The Server MUST respond to an UNSUBSUBCRIBE request by sending an UNSUBACK packet. The UNSUBACK Packet MUST have the same Packet Identifier as the UNSUBSCRIBE Packet.

    [MQTT-3.10.4-5]

    Even where no Topic Subscriptions are deleted, the Server MUST respond with an UNSUBACK.

    [MQTT-3.10.4-6]

    If a Server receives an UNSUBSCRIBE packet that contains multiple Topic Filters it MUST handle that packet as if it had received a sequence of multiple UNSUBSCRIBE packets, except that it sends just one UNSUBACK response.

    [MQTT-3.12.4-1]

    The Server MUST send a PINGRESP Packet in response to a PINGREQ packet.

    [MQTT-3.14.1-1]

    The Server MUST validate that reserved bits are set to zero and disconnect the Client if they are not zero.

    [MQTT-3.14.4-1]

    After sending a DISCONNECT Packet the Client MUST close the Network Connection.

    [MQTT-3.14.4-2]

    After sending a DISCONNECT Packet the Client MUST NOT send any more Control Packets on that Network Connection.

    [MQTT-3.14.4-3]

    On receipt of DISCONNECT the Server MUST discard any Will Message associated with the current connection without publishing it, as described in Section 3.1.2.5.

    [MQTT-4.1.0-1]

    The Client and Server MUST store Session state for the entire duration of the Session.

    [MQTT-4.1.0-2]

    A Session MUST last at least as long it has an active Network Connection.

    [MQTT-4.3.1-1]

     

    In the QoS 0 delivery protocol, the Sender

    ·         MUST send a PUBLISH packet with QoS=0, DUP=0.

    [MQTT-4.3.2-1]

     

    In the QoS 1 delivery protocol, the Sender

    ·         MUST assign an unused Packet Identifier each time it has a new Application Message to publish.

    ·         MUST send a PUBLISH Packet containing this Packet Identifier with QoS=1, DUP=0.

    ·         MUST treat the PUBLISH Packet as "unacknowledged" until it has received the corresponding PUBACK packet from the receiver. See Section 4.4 for a discussion of unacknowledged messages.

    [MQTT-4.3.2-2]

     

    In the QoS 1 delivery protocol, the Receiver

    • MUST respond with a PUBACK Packet containing the Packet Identifier from the incoming PUBLISH Packet, having accepted ownership of the Application Message.
    • After it has sent a PUBACK Packet the Receiver MUST treat any incoming PUBLISH packet that contains the same Packet Identifier as being a new publication, irrespective of the setting of its DUP flag.

    [MQTT-4.3.3-1]

     

    In the QoS 2 delivery protocol, the Sender

    • MUST assign an unused Packet Identifier when it has a new Application Message to publish.
    • MUST send a PUBLISH packet containing this Packet Identifier with QoS=2, DUP=0.
    • MUST treat the PUBLISH packet as "unacknowledged" until it has received the corresponding PUBREC packet from the receiver. See Section 4.4 for a discussion of unacknowledged messages.
    • MUST send a PUBREL packet when it receives a PUBREC packet from the receiver. This PUBREL packet MUST contain the same Packet Identifier as the original PUBLISH packet.
    • MUST treat the PUBREL packet as "unacknowledged" until it has received the corresponding PUBCOMP packet from the receiver.
    • MUST NOT re-send the PUBLISH once it has sent the corresponding PUBREL packet.

    [MQTT-4.3.3-2]

     

    In the QoS 2 delivery protocol, the Receiver

    • MUST respond with a PUBREC containing the Packet Identifier from the incoming PUBLISH Packet, having accepted ownership of the Application Message.
    • Until it has received the corresponding PUBREL packet, the Receiver MUST acknowledge any subsequent PUBLISH packet with the same Packet Identifier by sending a PUBREC. It MUST NOT cause duplicate messages to be delivered to any onward recipients in this case.
    • MUST respond to a PUBREL packet by sending a PUBCOMP packet containing the same Packet Identifier as the PUBREL.
    • After it has sent a PUBCOMP, the receiver MUST treat any subsequent PUBLISH packet that contains that Packet Identifier as being a new publication.

    [MQTT-4.4.0-1]

    When a Client reconnects with CleanSession set to 0, both the Client and Server MUST re-send any unacknowledged PUBLISH Packets (where QoS > 0) and PUBREL Packets using their original Packet Identifiers.

    [MQTT-4.5.0-1]

    When a Server takes ownership of an incoming Application Message it MUST add it to the Session state of those clients that have matching Subscriptions. Matching rules are defined in Section 4.7.

    [MQTT-4.5.0-2]

    The Client MUST acknowledge any Publish Packet it receives according to the applicable QoS rules regardless of whether it elects to process the Application Message that it contains.

    [MQTT-4.6.0-1]

    When it re-sends any PUBLISH packets, it MUST re-send them in the order in which the original PUBLISH packets were sent (this applies to QoS 1 and QoS 2 messages).

    [MQTT-4.6.0-2]

    Client MUST send PUBACK packets in the order in which the corresponding PUBLISH packets were received (QoS 1 messages).

    [MQTT-4.6.0-3]

    Client MUST send PUBREC packets in the order in which the corresponding PUBLISH packets were received (QoS 2 messages).

    [MQTT-4.6.0-4]

    Client MUST send PUBREL packets in the order in which the corresponding PUBREC packets were received (QoS 2 messages).

    [MQTT-4.6.0-5]

    A Server MUST by default treat each Topic as an "Ordered Topic". It MAY provide an administrative or other mechanism to allow one or more Topics to be treated as an "Unordered Topic".

    [MQTT-4.6.0-6]

    When a Server processes a message that has been published to an Ordered Topic, it MUST follow the rules listed above when delivering messages to each of its subscribers. In addition it MUST send PUBLISH packets to consumers (for the same Topic and QoS) in the order that they were received from any given Client.

    [MQTT-4.7.1-1]

    The wildcard characters can be used in Topic Filters, but MUST NOT be used within a Topic Name.

    [MQTT-4.7.1-2]

    The multi-level wildcard character MUST be specified either on its own or following a topic level separator. In either case it MUST be the last character specified in the Topic Filter.

    [MQTT-4.7.1-3]

    The single-level wildcard can be used at any level in the Topic Filter, including first and last levels. Where it is used it MUST occupy an entire level of the filter.

    [MQTT-4.7.2-1]

    The Server MUST NOT match Topic Filters starting with a wildcard character (# or +) with Topic Names beginning with a $ character.

    [MQTT-4.7.3-1]

    All Topic Names and Topic Filters MUST be at least one character long.

    [MQTT-4.7.3-2]

    Topic Names and Topic Filters MUST NOT include the null character (Unicode U+0000).

    [MQTT-4.7.3-3]

    Topic Names and Topic Filters are UTF-8 encoded strings, they MUST NOT encode to more than 65535 bytes.

    [MQTT-4.7.3-4]

    When it performs subscription matching the Server MUST NOT perform any normalization of Topic Names or Topic Filters, or any modification or substitution of unrecognized characters.

    [MQTT-4.8.0-1]

    Unless stated otherwise, if either the Server or Client encounters a protocol violation, it MUST close the Network Connection on which it received that Control Packet which caused the protocol violation.

    [MQTT-4.8.0-2]

    If the Client or Server encounters a Transient Error while processing an inbound Control Packet it MUST close the Network Connection on which it received that Control Packet.

    [MQTT-6.0.0-1]

    MQTT Control Packets MUST be sent in WebSocket binary data frames. If any other type of data frame is received the recipient MUST close the Network Connection.

    [MQTT-6.0.0-2]

    A single WebSocket data frame can contain multiple or partial MQTT Control Packets. The receiver MUST NOT assume that MQTT Control Packets are aligned on WebSocket frame boundaries.

    [MQTT-6.0.0-3]

    The client MUST include “mqtt” in the list of WebSocket Sub Protocols it offers.

    [MQTT-6.0.0-4]

    The WebSocket Sub Protocol name selected and returned by the server MUST be “mqtt”.

    [MQTT-7.0.0-1]

    A Server that both accepts inbound connections and establishes outbound connections to other Servers MUST conform as both an MQTT Client and MQTT Server.

    [MQTT-7.0.0-2]

    Conformant implementations MUST NOT require the use of any extensions defined outside of this specification in order to interoperate with any other conformant implementation.

    [MQTT-7.1.1-1]

    A conformant Server MUST support the use of one or more underlying transport protocols that provide an ordered, lossless, stream of bytes from the Client to Server and Server to Client.

    [MQTT-7.1.2-1]

    A conformant Client MUST support the use of one or more underlying transport protocols that provide an ordered, lossless, stream of bytes from the Client to Server and Server to Client.

     

    Appendix C.Revision history  (non normative)

     

    Revision

    Date

    Editor

    Changes Made

    [02]

    [29 April 2013]

    [A Banks]

    [Tighten up language for Connect packet]

    [03]

    [09 May 2013]

    [ A Banks]

    [Tighten up language in Section 02 Command Message Format]

    [04]

    [20 May 2013]

    [Rahul Gupta]

    Tighten up language for PUBLISH message

    [05]

    [5th June 2013]

    [ A Banks]

    [Rahul Gupta]

    [ Issues -5,9,13 ]

    [Formatting and language tighten up in PUBACK, PUBREC, PUBREL, PUBCOMP message]

    [06]

    [20th June 2013]

    [Rahul Gupta]

    [Issue – 17, 2, 28, 33]

    [Formatting and language tighten up in SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK, PINGREQ, PINGRESP, DISCONNECT Control Packets]

    Terms Command message change to Control Packet

    Term “message” is generically used, replaced this word accordingly with packet, publication, subscription.

    [06]

    [21 June 2013]

    [A Banks]

     

    [Rahul Gupta]

    Resolved Issues – 12,20,15, 3, 35, 34, 23, 5, 21

    Resolved Issues – 32,39, 41

    [07]

    [03 July 2013]

    [A Banks]

    [Rahul Gupta]

    Resolved Issues – 18,11,4

    Resolved Issues – 26,31,36,37

    [08]

    [19 July 2013]

    [A Banks]

    [Rahul Gupta]

    Resolved Issues – 6, 29, 45

    Resolved Issues – 36, 25, 24

    Added table for fixed header and payload

    [09]

    [01 August 2013]

    [A Banks]

    Resolved Issues – 49, 53, 46, 67, 29, 66, 62, 45, 69, 40, 61, 30

    [10]

    [10 August 2013]

    [A Banks]

    [Rahul Gupta]

    Resolved Issues – 19, 63, 57, 65, 72

    Conformance section added

    [11]

    [10 September 2013]

    [A Banks]

    [N  O'Leary & Rahul Gupta]

    Resolved Issues – 56

    Updated Conformance section

    [12]

    [18 September 2013]

    [Rahul Gupta]

     

    [A Banks]

    Resolved Issues – 22, 42, 81, 84, 85, 7, 8, 14, 16, Security section is added

    Resolved Issue -1

    [13]

    [27 September 2013]

    [A Banks]

    Resolved Issues – 64, 68, 76, 86, 27, 60, 82, 55, 78, 51, 83, 80

    [14]

    [10 October 2013]

    [A Banks]

    [Rahul Gupta]

    Resolved Issues – 58, 59, 10, 89, 90, 88, 77

    Resolved Issues – 94, 96, 93, 92, 95, 87, 74, 71

    [15]

    [24 October 2013]

    [A Banks]

    [Rahul Gupta]

    Resolved Issues – 52, 97, 98, 101

    Resolved Issues – 100

    Added normative statement numbering and Appendix A

    [16]

    [21 November 2013]

    [A Banks]

    Resolved Issues -103, 104, 44

    [17]

    [05 December 2013]

    [A Banks]

    [Rahul Gupta]

    Resolved Issues – 105, 70, 102, 106, 107, 108, 109, 110

    Updated normative statement numbering and Appendix A

    [CSD04]

    [28January 2014]

    [Rahul Gupta]

    Resolved Issues – 112, 114, 115, 120, 117, 134, 132, 133, 130, 131, 129

    [18]

    [20 February 2014]

    [A Banks]

     

     

    [Rahul Gupta]

    Resolved Issues – 175, 139, 176, 166, 149, 164, 140, 154, 178, 188, 181, 155, 170, 196, 173, 157, 195, 191, 150, 179, 185, 174, 163

    Resolved Issues – 135, 136, 147, 161, 169, 180, 182, 184, 189, 187

    [19]

    [28 February 2014]

    [A Banks]

     

    [Rahul Gupta]

    Resolved Issues – 167, 192, 141, 138, 137, 198, 165

    Resolved Issues – 199, 144, 159,

    [20]

    [07 March 2014]

    [A Banks]

    [Rahul Gupta]

    Resolved Issues – 113, 162, 158, 146

    Resolved Issues – 172, 190, 202, 201

    [21]

    [17 March 2014]

    [A Banks]

    [Rahul Gupta]

    Resolved Issues – 151, 194, 160, 168

    Resolved Issues – 205,

    [22]

    [27 March 2014]

    [Rahul Gupta]

    [A Banks]

    Resolved Issues – 145, 186, 142

    Resolved Issues – 152, 193

    [23]

    [28 March 2014]

    [A Banks]

    Resolved Issues – 204, 148, 210, 208, 209, 171, 183, 117, 212

    [24]

    [7 April 2014]

    [Rahul Gupta]

    [A Banks]

    Added Table of figures

    Corrected Issue 209

    [25]

    [8 May 2014]

    [Rahul Gupta]

    Resolved Issues – 213, 214

    [25]

    [3 September 2014]

    [A Banks]

    Resolved Issues – 240, 242, 246

    [26]

    [17 September 2014]

    [Rahul Gupta]

    Resolved Issues – 247