diff --git a/design/protocol.md b/design/protocol.md index ca37998..48e4c9b 100644 --- a/design/protocol.md +++ b/design/protocol.md @@ -129,8 +129,9 @@ on the same machine. Both protocols are supported through METADAPT. ## Message and Transaction Demarcation Protocol (METADAPT) The Message and Transaction Demarcation Protocol is used to break one or more reliable data streams into transactions, which are broken down further into -messages. A message, as well as its associated metadata (length, transaction, -method, etc.) together is referred to as METADAPT Message Block (MMB). +messages. The representation of a message (or a part thereof) on the protocol, +including its associated metadata (length, transaction, method, etc.) is +referred to as METADAPT Message Block (MMB). For transports that offer multiple multiplexed data streams that can be created and destroyed on-demand (such as QUIC) each stream is used as a transaction. If @@ -145,8 +146,12 @@ METADAPT-A requires a transport which offers a single full-duplex data stream that persists for the duration of the connection. All transactions are multiplexed onto this single stream. Each MMB contains a 12-octet long header, with the transaction ID, then the method, and then the payload size (in octets). -The transaction ID is encoded as an I64, and the method and payload size are -both encoded as U16s. The remainder of the message is the payload. Since each +The transaction ID is encoded as an I64, the method is encoded as a U16 and the +and payload size is encoded as a U64. Only the 63 least significant bits of the +payload size describe the actual size, the most significant bit controlling +chunking. See the section on chunking for more information. + +The remainder of the message is the payload. Since each MMB is self-describing, they are sent sequentially with no gaps in-between them. Transactions "open" when the first message with a given transaction ID is sent. @@ -162,13 +167,25 @@ used up, the connection must fail. Don't worry about this though, because the sun will have expanded to swallow earth by then. Your connection will not last that long. +#### Message Chunking + +The most significant bit of the payload size field of an MMB is called the Chunk +Control Bit (CCB). If the CCB of a given MMB is zero, the represented message is +interpreted as being self-contained and the data is processed immediately. If +the CCB is one, the message is interpreted as being chunked, with the data of +the current MMB being the first chunk. The data of further MMBs sent along the +transaction will be appended to the message until an MMB is read with a zero +CCB, in which case the MMB will be the last chunk and any more MMBs will be +interpreted as normal. + ### METADAPT-B METADAPT-B requires a transport which offers multiple multiplexed full-duplex data streams per connection that can be created and destroyed on-demand. Each data stream is used as an individual transaction. Each MMB contains a 4-octet -long header with the method and then the payload size (in octets) both encoded -as U16s. The remainder of the message is the payload. Since each MMB is -self-describing, they are sent sequentially with no gaps in-between them. +long header with the method and then the payload size (in octets) encoded as a +U16 and U64 respectively. The remainder of the message is the payload. Since +each MMB is self-describing, they are sent sequentially with no gaps in-between +them. The ID of any transaction will reflect the ID of its corresponding stream. The lifetime of the transaction is tied to the lifetime of the stream, that is to