Network Working Group E. Forigo ITI G. Marconi VR November 2018 THE MCCHAT PROTOCOL (VERSION 1) Status of this Memo This document specifies the MCCHAT protocol, and requests discussion and suggestions for improvements. Distribution of this memo is unlimited. Summary MCCHAT is a protocol to transfer text messages. This document describes the protocol and its types of packets. The document also explains the reasons behind the design decision process. Acknowledgements The protocol was originally designed by the students of the 5EI section, and formalized by Devis Zanoni, Tobia Valerio and Ettore Forigo, with the help of Antonio Sette. The current revision of the document includes an initial design proposal with basic features and space for future extensions. The protocol was inspired by TFTP in the design of the packets' structure and by MQTT in the topics concept. 1. Purpose MCCHAT is a protocol to exchange messages in groups, referred by the protocol as topics. The term topic will therefore be used throughout the document to mean a group of clients that receive messages sent to the topic itself. 2. Connection details MCCHAT standard implementation uses the Internet Transport Control Protocol (TCP), but MCCHAT can be implemented in any protocol that is connection oriented and stream based. In this document, every reference to "the transfer layer" refers to the chosen protocol of implementation. Clients must open a connection to the server using the transfer layer. In default TCP implementation clients must open a socket to the server's IP address, port 1502. 3. Relation to other Protocols MCCHAT will interact with the transfer layer in 3 ways. It will establish a connection through it, it will use it to send packets back and forth between the client and server on the two streams made available by the transfer layer and it will be signaled the termination of the connection by it. The transfer layer must also provide each endpoint of connection with a unique identifier accessible from the MCCHAT protocol. 4. Normal operation Since this protocol is implemented on top of the transfer layer, there will be a phase of establishing the connection. After the connection is established clients will receive an information packet with the version of the protocol used by the server. A client is identified by the server using an identifier that is unique to each client and is provided by the transfer layer. In the default TCP implementation this identifier will be the socket established with the client (the client's IP & port). This is how the server manages every operation that requires the knowledge of the clients identity. (Subscriptions/Push notifications, etc.) MCCHAT uses topics as communication channels. A client may at any given time ask the server to start sending messages from a certain topic with a Subscribe packet, and ask the server to stop sending a certain topic's messages with an Unsubscribe packet. On startup clients can connect by default to the topic "" (empty string). This is a reserved topic used to discover other topics. A client may also at any given time send a message to a certain topic with a Message packet, specifying the topic, the username to be displayed by other client for that message and the message content. The client can send messages to a topic even if it not subscribed itself to the topic. The message will be received only by the subscribers. If a client is subscribed to the topic the message is sent to, it will get a copy of its own message from the server. When a message is sent to a topic, all subscribed clients will receive the Message packet as sent by the original sender. The client may also obtain a list of active topics using the Topic List Request packet. The server will respond with a Topic List packet, containing a null terminated list of topics. A topic is considered active if it has at least one client subscribed to it. Upon connection termination, the server will automatically unsubscribe a client from all topics. Every string sent with the protocol is encoded with UTF-8 and ends when a 0x0 byte is encountered (null-terminated). For this reasons, all strings sent with the protocol cannot contain bytes with value 0x0. Topic names cannot contain bytes with value 0x4, since TL packets contain a list terminated by a 0x4 byte. 5. MCCHAT Packets MCCHAT supports six types of packets, all of which have been mentioned above: opcode operation 0 Information (INFO) 1 Subscription (SUB) 2 Unsubscription (UNSUB) 3 Message (MSG) 4 Topic List Request (TLRQ) 5 Topic List (TL) The MCCHAT header of a packet contains the opcode associated with that packet. 1 byte 1 byte -------------------- | Opcode | Version | -------------------- Figure 5-1: INFO packet The INFO packet (opcode 0) has the format shown in Figure 5-1. The version field contains the version of the protocol used by the server. 1 byte string 1 byte ------------------------- | Opcode | Topic | 0 | ------------------------- Figure 5-2: SUB/UNSUB packet SUB/UNSUB packets (opcodes 1 and 2 respectively) have the format shown in Figure 5-2. The topic field contains a UTF-8 encoded string that uniquely identifies a topic. 1 byte string 1 byte string 1 byte string 1 byte -------------------------------------------------------------- | Opcode | Topic | 0 | Username | 0 | Message | 0 | -------------------------------------------------------------- Figure 5-3: MSG packet Messages are actually transmitted in MSG packets depicted in Figure 5-3. MSG packets (opcode 3) contain the topic the message needs to be delivered to, a username to display as the sender of the message and the message data itself. 1 byte -------- | Opcode | -------- Figure 5-4: TLRQ packet The TLRQ packet (opcode 4) has the format shown in Figure 5-4. 1 byte string 1 byte string 1 byte 1 byte --------------------------- / ------------------------ | Opcode | Topic | 0 | \ Topic | 0 | 4 | --------------------------- / ------------------------ Figure 5-5: TL packet The TL packet (opcode 5) is the most complex one. It contains a sequence of strings, all null terminated, representing each the name of a topic. There could be 0 to n topics in the TL packet. The sequence ends when a 0x4 byte (end of transmission) is encountered. I. Appendix MCCHAT Formats Type Op # Format without header 1 byte 1 byte ----------------- INFO | 0 | Version | ----------------- 1 byte string 1 byte ------------------------ SUB/ | 1/2 | Topic | 0 | UNSUB ------------------------ 1 byte string 1 byte string 1 byte string 1 byte ------------------------------------------------------------ MSG | 3 | Topic | 0 | Username | 0 | Message | 0 | ------------------------------------------------------------ 1 byte ------- TLRQ | 4 | ------- 1 byte string 1 byte string 1 byte 1 byte -------------------------- / ------------------------ TL | 5 | Topic | 0 | \ Topic | 0 | 4 | -------------------------- / ------------------------ Connection details Clients must open a socket to the server's IP address, port 1502. Security Considerations Since MCCHAT includes no login or access control mechanisms, care must be taken when sending data with it and no important or secret data should be sent with it. Data sent with the MCCHAT protocol is in clear over the network and can be sniffed and/or tampered with by malicious third parties. User's discretion is advised. Author's Address Ettore Forigo ITI G. Marconi Verona 5EI Piazzale Romano Guardini 1 Verona, 37138 Phone: *redacted* EMail: *redacted*