From 6f0b02d41b18122d33038a445026bd01586a176c Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 4 Nov 2019 10:54:44 +0700 Subject: [PATCH 01/13] add a multiselect 2.0 spec --- connections/handshake.png | Bin 0 -> 159462 bytes connections/multiselect2.md | 103 ++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 connections/handshake.png create mode 100644 connections/multiselect2.md diff --git a/connections/handshake.png b/connections/handshake.png new file mode 100644 index 0000000000000000000000000000000000000000..b32b6862ce196375b6ccf135df65ff47cdd33df0 GIT binary patch literal 159462 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Ž!uZTa%T><*e}Eamw9%2ZC|<-+dRyj9@z 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

iww-Lm1x+(LUeX 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%0D#5$rN}G$A64C!Q9;XXmGpbYFfJze3@i^BX@MD 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 HQ$iB}_Bu-L literal 0 HcmV?d00001 diff --git a/connections/multiselect2.md b/connections/multiselect2.md new file mode 100644 index 000000000..264605836 --- /dev/null +++ b/connections/multiselect2.md @@ -0,0 +1,103 @@ +# Multiselect 2.0 + +## Introduction + +Multiselect 2.0 replaces the Multistream protocol. Compared to its predecessor, it offers: + +1. Downgrade protection for the security protocol negotiation. +2. Zero-rountrip stream multiplexer negotiation for handshake protocols that take advantage of early data mechanisms (one-roundtrip negotation for protocols / implementations that don't). +3. Compression for the protocol identifiers of frequently used protocols. + +By using protobufs for all control messages, Multiselect 2.0 provides an easy path for future protocol upgrades. The protobuf format guarantees that unknown field in a message will be skipped, thus future version of the protocol can add new fields that signal support for new protocol features. + +## High-Level Overview + +### Handshake Protocol Selection + +Handshake protocols are not being negotiated, but are announced in the peers' multiaddrs. + +**TODO**: Do we need to describe the format here? I guess we don't, but we will probably need another document for that change, and we can link to it from here. + +Peers advertising a multiaddr that includes a handshake protocol MUST support Multiselect 2.0 as described in this document. + +#### TCP Simultaneous Open + +TCP allows the establishment of a connection if two endpoints start initiating a connection at the same time. This is called TCP Simultaneous Open. For libp2p, this is problematic, since most stream multiplexers assign stream IDs based on the role (client or server) of and endpoint. + +It is therefore desirable to fail a connection attempt as early as possible, if a TCP Simultaneous Open occurs. TLS 1.3 and Noise provide this guarantee: For example, the TLS handshake will fail if an endpoint receives a ClientHello instead of a ServerHello as a response to its ClientHello. + +Since secio doesn't provide this property, secio cannot be used with Multiselect 2.0. + +### Stream Multiplexer Selection + +This section only applies if Multiselect 2 is run over a transport that is not natively multipexed. Transports that provide stream multiplexing on the transport layer (e.g. QUIC) don't need to do anything described in this section. + +Some handshake protocols (TLS 1.3, some variants of Noise (**TODO**: specify which)) support sending of *Early Data*. Early Data can be sent by the server after receiving the first handshake message from the client. It is encrypted, however, at that point of the handshake the client's identity is not yet verified. + +In Multiselect 2 the server makes use of Early Data by sending a list of stream multiplexers. This ensures that the client can choose a stream multiplexer as soon as the handshake completes (or fail the connection if it doesn't support any stream multiplexer offered by the server). + +Note that this negotiation scheme allows peers to negotiate a "monoplexed" connection, i.e. a connection that doesn't use any stream multiplexer. Endpoints can offer support for monoplexed connections by offering the `/monoplex` stream multiplexer. + +**TODO**: Do we need to define a way to send an error code / error string? Or do we have something like that in libp2p already? + +![](handshake.png) + +Handshake protocols (or implementations of handshake protocols) that don't support sending of Early Data will have to run the stream multiplexer selection after the handshake completes. + +#### 0-RTT + +When using 0-RTT session resumption as offered by TLS 1.3 and some variants of Noise (**TODO**: specify which), the endpoints MUST remember the negotiated stream multiplexer used on the original connection. This ensures that the client can send application data in the first flight when resuming a connection. + +## Protocol Speficiation + +All messages are Protobuf messages using the `proto3` syntax. Every message is wrapped by the `Multiselect` message: + +```protobuf +# Wraps every message +message Multiselect { + oneof message { + Offer offer = 1; + Use use = 2; + } +} +``` + +The `Offer` message is used to initiate a conversation on a new stream. It contains either a single or multiple protocols that the endpoint would like to use on the stream. +A `Protocol` is the application protocol spoken on top of an ordered byte stream. The `name` of a protocol is the protocol identifier, e.g. `/ipfs/ping/1.0.0`. The `id` is a numeric abbreviation for this protocol (see below for details how `id`s are assigned). +If the endpoint only selects a single protocol, it MAY start sending application data right after the protobuf message. Since it has not received confirmation if the peer actually supports the protocol, any such data might be lost in that case. +If the endpoint selects multiple protocols, it MUST wait for the peer's choice of the application protocol (see description of the `Use` message) before sending application. + +```protobuf +# Select a list of protocols. +message Offer { + message Protocol { + oneof protocol { + string name = 1; + uint64 id = 2; + } + } + repeated Protocol protocols = 1; +} +``` + +The `Use` message is sent in response to the `Offer`. And endpoint MUST treat the receipt of a `Use` message before having sent a `Offer` message on the stream as a connection error. +If none of the protocol(s) listed in the `Offer` message are acceptable, and endpoint resets both the send- and the receive-side of the stream. + +If an endpoint receives an `Offer` message that only offers a single protocol, it accepts this protocol by sending an empty `Use` message (i.e. a message that doesn't list any `protocol`), or a `Use` message that assigns a protocol id (see below). Sending an empty `Use` message in response to a`Offer` message that offers multiple protocols is not permitted, and MUST be treated as a connection error by an endpoint. + +If an endpoint receives a `Offer` message that offers multiple protocols, it chooses an application protocol that it would like to speak on this stream. It informs the peer about its choice by sending its selection in the `protocol` field of the `Use` message. + +When choosing a protocol, an endpoint can allow its peer to save bytes on the wire for future use of the same protocol by assigning a numeric identifier for the protocol by sending an `id`. The identifier is valid for the lifetime of the connection. The identifier must be unique for the protocol, an endpoint MUST NOT use the same identifier for different protocols. + +```protobuf +# Declare that a protocol is used on this stream. +# By using an id (instead of a name), an endpoint can provide the peer +# an abbreviation to use for future uses of the same protocol. +message Use { + message Protocol { + uint64 id = 1; + string name = 2; + } + Protocol protocol = 1; +} +``` From 73afa0b159d86cbd2112aa6db6d78e8ecdbdce69 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Fri, 15 Nov 2019 11:27:28 +0700 Subject: [PATCH 02/13] enable Simultaneous Open by assigning roles based on the H(sent messages) --- connections/multiselect2.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/connections/multiselect2.md b/connections/multiselect2.md index 264605836..120f96424 100644 --- a/connections/multiselect2.md +++ b/connections/multiselect2.md @@ -22,11 +22,14 @@ Peers advertising a multiaddr that includes a handshake protocol MUST support Mu #### TCP Simultaneous Open -TCP allows the establishment of a connection if two endpoints start initiating a connection at the same time. This is called TCP Simultaneous Open. For libp2p, this is problematic, since most stream multiplexers assign stream IDs based on the role (client or server) of and endpoint. +TCP allows the establishment of a connection if two endpoints start initiating a connection at the same time. This is called TCP Simultaneous Open. For libp2p, on the one hand, this poses a problem, since most stream multiplexers assign stream IDs based on the role (client or server) of an endpoint. On the other hand, it can be used as a hole punching technique to facilitate NAT traversal. -It is therefore desirable to fail a connection attempt as early as possible, if a TCP Simultaneous Open occurs. TLS 1.3 and Noise provide this guarantee: For example, the TLS handshake will fail if an endpoint receives a ClientHello instead of a ServerHello as a response to its ClientHello. +TLS as well as Noise will fail the handshake if both endpoints act as clients. In case of such a handshake failure, the two endpoints need to restart the handshake. Endpoints MUST NOT close the underlying TCP connection in this case. Implementations SHOULD specifically test for this type of handshake failure, and not treat any handshake failure as a potential Simultaneous Open. -Since secio doesn't provide this property, secio cannot be used with Multiselect 2.0. +To determine the roles in the second handshake attempt, endpoints calculate the SHA-256 hash of the handshake messages that were sent and received (including any error message(s) that the handshake protocol might have sent) during the failed handshake attempt. +The peer that sent the messages resulting in the numerically smaller hash value acts a client in the second handshake attempt, the peer that sent the messages resulting in the numerically larger hash value acts as a server. + +Since secio assign roles during the handshake, it is not possible to detect a Simultaneous Open in this case. Therefore, secio MUST NOT be used with Multiselect 2.0. ### Stream Multiplexer Selection From 7e23e02ea497742ac024b856a6a743ab91a1ebb8 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 23 Nov 2019 16:05:08 +0700 Subject: [PATCH 03/13] apply Raul's suggestions in the secure channel section --- connections/multiselect2.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/connections/multiselect2.md b/connections/multiselect2.md index 120f96424..a006086be 100644 --- a/connections/multiselect2.md +++ b/connections/multiselect2.md @@ -12,9 +12,9 @@ By using protobufs for all control messages, Multiselect 2.0 provides an easy pa ## High-Level Overview -### Handshake Protocol Selection +### Secure Channel Selection -Handshake protocols are not being negotiated, but are announced in the peers' multiaddrs. +Conversely to multistream-select 1.0, secure channel protocols are not dynamically negotiated in multiselect 2.0. Instead, they are announced upfront in the peer multiaddrs. It is up to the implementers to decide whether each secure channel is exposed over a different port, or if a single port handles all secure channels, and a demultiplexing strategy is used to identify which protocol is being used. **TODO**: Do we need to describe the format here? I guess we don't, but we will probably need another document for that change, and we can link to it from here. From 0780f9e452905782210dcc8f57cb1a8155ddd3fc Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 23 Nov 2019 16:22:45 +0700 Subject: [PATCH 04/13] expand on Noise and Early Data --- connections/multiselect2.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/connections/multiselect2.md b/connections/multiselect2.md index a006086be..5a061e594 100644 --- a/connections/multiselect2.md +++ b/connections/multiselect2.md @@ -35,10 +35,13 @@ Since secio assign roles during the handshake, it is not possible to detect a Si This section only applies if Multiselect 2 is run over a transport that is not natively multipexed. Transports that provide stream multiplexing on the transport layer (e.g. QUIC) don't need to do anything described in this section. -Some handshake protocols (TLS 1.3, some variants of Noise (**TODO**: specify which)) support sending of *Early Data*. Early Data can be sent by the server after receiving the first handshake message from the client. It is encrypted, however, at that point of the handshake the client's identity is not yet verified. +Some handshake protocols (TLS 1.3, Noise) support sending of *Early Data*. In Multiselect 2 the server makes use of Early Data by sending a list of stream multiplexers. This ensures that the client can choose a stream multiplexer as soon as the handshake completes (or fail the connection if it doesn't support any stream multiplexer offered by the server). +When using TLS 1.3, the server can send Early Data after it receives the ClientHello. Early Data is encrypted, but at this point of the handshake the client's identity is not yet verified. +While Noise in principle allows sending of unencrypted data, endpoints MUST NOT use this to send their list of stream multiplexers. An endpoint MAY send it as soon it is possible to send encrypted data, even if the peers' identity is not verified at that point. + Note that this negotiation scheme allows peers to negotiate a "monoplexed" connection, i.e. a connection that doesn't use any stream multiplexer. Endpoints can offer support for monoplexed connections by offering the `/monoplex` stream multiplexer. **TODO**: Do we need to define a way to send an error code / error string? Or do we have something like that in libp2p already? @@ -49,7 +52,7 @@ Handshake protocols (or implementations of handshake protocols) that don't suppo #### 0-RTT -When using 0-RTT session resumption as offered by TLS 1.3 and some variants of Noise (**TODO**: specify which), the endpoints MUST remember the negotiated stream multiplexer used on the original connection. This ensures that the client can send application data in the first flight when resuming a connection. +When using 0-RTT session resumption as offered by TLS 1.3 and Noise, the endpoints MUST remember the negotiated stream multiplexer used on the original connection. This ensures that the client can send application data in the first flight when resuming a connection. ## Protocol Speficiation From 205dfca300a43f54698addf466009cde76f67982 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sun, 24 Nov 2019 10:27:03 +0700 Subject: [PATCH 05/13] use SHA-256(peer id) to determine roles in simultaneous open --- connections/multiselect2.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/connections/multiselect2.md b/connections/multiselect2.md index 5a061e594..70df1fb1b 100644 --- a/connections/multiselect2.md +++ b/connections/multiselect2.md @@ -26,8 +26,7 @@ TCP allows the establishment of a connection if two endpoints start initiating a TLS as well as Noise will fail the handshake if both endpoints act as clients. In case of such a handshake failure, the two endpoints need to restart the handshake. Endpoints MUST NOT close the underlying TCP connection in this case. Implementations SHOULD specifically test for this type of handshake failure, and not treat any handshake failure as a potential Simultaneous Open. -To determine the roles in the second handshake attempt, endpoints calculate the SHA-256 hash of the handshake messages that were sent and received (including any error message(s) that the handshake protocol might have sent) during the failed handshake attempt. -The peer that sent the messages resulting in the numerically smaller hash value acts a client in the second handshake attempt, the peer that sent the messages resulting in the numerically larger hash value acts as a server. +To determine the roles in the second handshake attempt, endpoints compare the SHA-256 hashes of their peer IDs. The peer with the numerically smaller hash value acts as a client in the second handshake attempt, the peer with the numerically larger hash value acts as a server. Since secio assign roles during the handshake, it is not possible to detect a Simultaneous Open in this case. Therefore, secio MUST NOT be used with Multiselect 2.0. From b13bec0f69d5a1bdc17d4bbf7ed5a69e2070e871 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 27 Nov 2019 22:41:41 +0700 Subject: [PATCH 06/13] apply Raul's editorial suggestions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Raúl Kripalani --- connections/multiselect2.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/connections/multiselect2.md b/connections/multiselect2.md index 70df1fb1b..e81fe2bc1 100644 --- a/connections/multiselect2.md +++ b/connections/multiselect2.md @@ -14,7 +14,9 @@ By using protobufs for all control messages, Multiselect 2.0 provides an easy pa ### Secure Channel Selection -Conversely to multistream-select 1.0, secure channel protocols are not dynamically negotiated in multiselect 2.0. Instead, they are announced upfront in the peer multiaddrs. It is up to the implementers to decide whether each secure channel is exposed over a different port, or if a single port handles all secure channels, and a demultiplexing strategy is used to identify which protocol is being used. +Conversely to multistream-select 1.0, secure channel protocols are not dynamically negotiated in-band. Instead, they are announced upfront in the peer multiaddrs (). This way, implementations can jump straight into a cryptographic handshake, thus curtailing the possibility of packet-inspection-based censorship and dynamic downgrade attacks. + +It is up to the implementers to decide whether each secure channel is exposed over a different port, or if a single port handles all secure channels, and a demultiplexing strategy is used to identify which protocol is being used. **TODO**: Do we need to describe the format here? I guess we don't, but we will probably need another document for that change, and we can link to it from here. @@ -53,7 +55,7 @@ Handshake protocols (or implementations of handshake protocols) that don't suppo When using 0-RTT session resumption as offered by TLS 1.3 and Noise, the endpoints MUST remember the negotiated stream multiplexer used on the original connection. This ensures that the client can send application data in the first flight when resuming a connection. -## Protocol Speficiation +## Protocol Specification All messages are Protobuf messages using the `proto3` syntax. Every message is wrapped by the `Multiselect` message: From f7120a3c7102cc5ee4781d42bfa63ddce73cec1d Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Thu, 28 Nov 2019 08:53:48 +0700 Subject: [PATCH 07/13] apply @jacobheun's suggestions Co-Authored-By: Jacob Heun --- connections/multiselect2.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/connections/multiselect2.md b/connections/multiselect2.md index e81fe2bc1..d70de4a1e 100644 --- a/connections/multiselect2.md +++ b/connections/multiselect2.md @@ -5,10 +5,10 @@ Multiselect 2.0 replaces the Multistream protocol. Compared to its predecessor, it offers: 1. Downgrade protection for the security protocol negotiation. -2. Zero-rountrip stream multiplexer negotiation for handshake protocols that take advantage of early data mechanisms (one-roundtrip negotation for protocols / implementations that don't). +2. Zero-roundtrip stream multiplexer negotiation for handshake protocols that take advantage of early data mechanisms (one-roundtrip negotiation for protocols / implementations that don't). 3. Compression for the protocol identifiers of frequently used protocols. -By using protobufs for all control messages, Multiselect 2.0 provides an easy path for future protocol upgrades. The protobuf format guarantees that unknown field in a message will be skipped, thus future version of the protocol can add new fields that signal support for new protocol features. +By using protobufs for all control messages, Multiselect 2.0 provides an easy path for future protocol upgrades. The protobuf format guarantees that unknown fields in a message will be skipped, thus future versions of the protocol can add new fields that signal support for new protocol features. ## High-Level Overview @@ -34,7 +34,7 @@ Since secio assign roles during the handshake, it is not possible to detect a Si ### Stream Multiplexer Selection -This section only applies if Multiselect 2 is run over a transport that is not natively multipexed. Transports that provide stream multiplexing on the transport layer (e.g. QUIC) don't need to do anything described in this section. +This section only applies if Multiselect 2 is run over a transport that is not natively multiplexed. Transports that provide stream multiplexing on the transport layer (e.g. QUIC) don't need to do anything described in this section. Some handshake protocols (TLS 1.3, Noise) support sending of *Early Data*. @@ -87,12 +87,12 @@ message Offer { } ``` -The `Use` message is sent in response to the `Offer`. And endpoint MUST treat the receipt of a `Use` message before having sent a `Offer` message on the stream as a connection error. -If none of the protocol(s) listed in the `Offer` message are acceptable, and endpoint resets both the send- and the receive-side of the stream. +The `Use` message is sent in response to the `Offer`. An endpoint MUST treat the receipt of a `Use` message before having sent an `Offer` message on the stream as a connection error. +If none of the protocol(s) listed in the `Offer` message are acceptable, an endpoint MUST reset both the send- and the receive-side of the stream. -If an endpoint receives an `Offer` message that only offers a single protocol, it accepts this protocol by sending an empty `Use` message (i.e. a message that doesn't list any `protocol`), or a `Use` message that assigns a protocol id (see below). Sending an empty `Use` message in response to a`Offer` message that offers multiple protocols is not permitted, and MUST be treated as a connection error by an endpoint. +If an endpoint receives an `Offer` message that only offers a single protocol, it accepts this protocol by sending an empty `Use` message (i.e. a message that doesn't list any `protocol`), or a `Use` message that assigns a protocol id (see below). Sending an empty `Use` message in response to an `Offer` message that offers multiple protocols is not permitted, and MUST be treated as a connection error by an endpoint. -If an endpoint receives a `Offer` message that offers multiple protocols, it chooses an application protocol that it would like to speak on this stream. It informs the peer about its choice by sending its selection in the `protocol` field of the `Use` message. +If an endpoint receives an `Offer` message that offers multiple protocols, it chooses an application protocol that it would like to speak on this stream. It informs the peer about its choice by sending its selection in the `protocol` field of the `Use` message. When choosing a protocol, an endpoint can allow its peer to save bytes on the wire for future use of the same protocol by assigning a numeric identifier for the protocol by sending an `id`. The identifier is valid for the lifetime of the connection. The identifier must be unique for the protocol, an endpoint MUST NOT use the same identifier for different protocols. From f53a644e64a8867f92db44c044d3e91cbde2783f Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 2 Dec 2019 10:58:59 +0700 Subject: [PATCH 08/13] move the protobuf definitions to a separate section --- connections/multiselect2.md | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/connections/multiselect2.md b/connections/multiselect2.md index d70de4a1e..ef7342dc6 100644 --- a/connections/multiselect2.md +++ b/connections/multiselect2.md @@ -57,6 +57,8 @@ When using 0-RTT session resumption as offered by TLS 1.3 and Noise, the endpoin ## Protocol Specification +### Wire Encoding + All messages are Protobuf messages using the `proto3` syntax. Every message is wrapped by the `Multiselect` message: ```protobuf @@ -69,10 +71,7 @@ message Multiselect { } ``` -The `Offer` message is used to initiate a conversation on a new stream. It contains either a single or multiple protocols that the endpoint would like to use on the stream. -A `Protocol` is the application protocol spoken on top of an ordered byte stream. The `name` of a protocol is the protocol identifier, e.g. `/ipfs/ping/1.0.0`. The `id` is a numeric abbreviation for this protocol (see below for details how `id`s are assigned). -If the endpoint only selects a single protocol, it MAY start sending application data right after the protobuf message. Since it has not received confirmation if the peer actually supports the protocol, any such data might be lost in that case. -If the endpoint selects multiple protocols, it MUST wait for the peer's choice of the application protocol (see description of the `Use` message) before sending application. +This document defines two messages. The first one is the `Offer` message: ```protobuf # Select a list of protocols. @@ -87,14 +86,7 @@ message Offer { } ``` -The `Use` message is sent in response to the `Offer`. An endpoint MUST treat the receipt of a `Use` message before having sent an `Offer` message on the stream as a connection error. -If none of the protocol(s) listed in the `Offer` message are acceptable, an endpoint MUST reset both the send- and the receive-side of the stream. - -If an endpoint receives an `Offer` message that only offers a single protocol, it accepts this protocol by sending an empty `Use` message (i.e. a message that doesn't list any `protocol`), or a `Use` message that assigns a protocol id (see below). Sending an empty `Use` message in response to an `Offer` message that offers multiple protocols is not permitted, and MUST be treated as a connection error by an endpoint. - -If an endpoint receives an `Offer` message that offers multiple protocols, it chooses an application protocol that it would like to speak on this stream. It informs the peer about its choice by sending its selection in the `protocol` field of the `Use` message. - -When choosing a protocol, an endpoint can allow its peer to save bytes on the wire for future use of the same protocol by assigning a numeric identifier for the protocol by sending an `id`. The identifier is valid for the lifetime of the connection. The identifier must be unique for the protocol, an endpoint MUST NOT use the same identifier for different protocols. +And the second one is the `Use` message: ```protobuf # Declare that a protocol is used on this stream. @@ -108,3 +100,21 @@ message Use { Protocol protocol = 1; } ``` + +### Protocol Description + +The `Offer` message is used to initiate a conversation on a new stream. It contains either a single or multiple protocols that the endpoint would like to use on the stream. +A `Protocol` is the application protocol spoken on top of an ordered byte stream. The `name` of a protocol is the protocol identifier, e.g. `/ipfs/ping/1.0.0`. The `id` is a numeric abbreviation for this protocol (see below for details how `id`s are assigned). +If the endpoint only selects a single protocol, it MAY start sending application data right after the protobuf message. Since it has not received confirmation if the peer actually supports the protocol, any such data might be lost in that case. +If the endpoint selects multiple protocols, it MUST wait for the peer's choice of the application protocol (see description of the `Use` message) before sending application. + +The `Use` message is sent in response to the `Offer`. An endpoint MUST treat the receipt of a `Use` message before having sent an `Offer` message on the stream as a connection error. +If none of the protocol(s) listed in the `Offer` message are acceptable, an endpoint MUST reset both the send- and the receive-side of the stream. + +If an endpoint receives an `Offer` message that only offers a single protocol, it accepts this protocol by sending an empty `Use` message (i.e. a message that doesn't list any `protocol`), or a `Use` message that assigns a protocol id (see below). Sending an empty `Use` message in response to an `Offer` message that offers multiple protocols is not permitted, and MUST be treated as a connection error by an endpoint. + +If an endpoint receives an `Offer` message that offers multiple protocols, it chooses an application protocol that it would like to speak on this stream. It informs the peer about its choice by sending its selection in the `protocol` field of the `Use` message. + +When choosing a protocol, an endpoint can allow its peer to save bytes on the wire for future use of the same protocol by assigning a numeric identifier for the protocol by sending an `id`. The identifier is valid for the lifetime of the connection. The identifier must be unique for the protocol, an endpoint MUST NOT use the same identifier for different protocols. + + From 1a5bfe3e9aeaaa941823be41a49bd9b1f4e5aeff Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 2 Dec 2019 11:08:29 +0700 Subject: [PATCH 09/13] editorial tweaks to the protocol description --- connections/multiselect2.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/connections/multiselect2.md b/connections/multiselect2.md index ef7342dc6..6ed6b2081 100644 --- a/connections/multiselect2.md +++ b/connections/multiselect2.md @@ -103,10 +103,14 @@ message Use { ### Protocol Description -The `Offer` message is used to initiate a conversation on a new stream. It contains either a single or multiple protocols that the endpoint would like to use on the stream. +An endpoint uses the `Offer` message to initiate a conversation on a new stream. The `Offer` message can be used in two distinct scenarios: +1. The endpoint knows exactly which protocol it wants to use. It then lists this protocol in the `Offer` message. +2. The endpoint wants to use any of a set of protocols, and lets the peer decide which one. It then lists the set of protocols in the `Offer` message. + A `Protocol` is the application protocol spoken on top of an ordered byte stream. The `name` of a protocol is the protocol identifier, e.g. `/ipfs/ping/1.0.0`. The `id` is a numeric abbreviation for this protocol (see below for details how `id`s are assigned). -If the endpoint only selects a single protocol, it MAY start sending application data right after the protobuf message. Since it has not received confirmation if the peer actually supports the protocol, any such data might be lost in that case. -If the endpoint selects multiple protocols, it MUST wait for the peer's choice of the application protocol (see description of the `Use` message) before sending application. +If the endpoint only selects a single protocol, it MAY start sending application data right after the protobuf message. Since it has not received confirmation if the peer actually supports the protocol, any such data might be lost in that case. If the endpoint selects multiple protocols, it MUST wait for the peer's choice of the application protocol (see description of the `Use` message) before sending application. + +Listing a set of protocols is useful for stream multiplexer selection. A server that supports multiple stream multiplexers will send its list of multiplexers in Early Data (or right after completion of the handshake, see above). The `Use` message is sent in response to the `Offer`. An endpoint MUST treat the receipt of a `Use` message before having sent an `Offer` message on the stream as a connection error. If none of the protocol(s) listed in the `Offer` message are acceptable, an endpoint MUST reset both the send- and the receive-side of the stream. From 572f533b18aa10170e96d7b67f1fc589caa16d1e Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 2 Dec 2019 11:28:48 +0700 Subject: [PATCH 10/13] select stream multiplexers by list intersection --- connections/multiselect2.md | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/connections/multiselect2.md b/connections/multiselect2.md index 6ed6b2081..1ea9b5d6e 100644 --- a/connections/multiselect2.md +++ b/connections/multiselect2.md @@ -38,11 +38,14 @@ This section only applies if Multiselect 2 is run over a transport that is not n Some handshake protocols (TLS 1.3, Noise) support sending of *Early Data*. -In Multiselect 2 the server makes use of Early Data by sending a list of stream multiplexers. This ensures that the client can choose a stream multiplexer as soon as the handshake completes (or fail the connection if it doesn't support any stream multiplexer offered by the server). +In Multiselect 2 endpoints make use of Early Data to speed up stream multiplexcer selection. As soon as an endpoints reaches a state during the handshake where it can send encrypted application data, it sends a list of supported stream multiplexers. The list SHOULD be ordered be ordered by descending preference. -When using TLS 1.3, the server can send Early Data after it receives the ClientHello. Early Data is encrypted, but at this point of the handshake the client's identity is not yet verified. +When using TLS 1.3, the server can send Early Data after it receives the ClientHello. Early Data is encrypted, but at this point of the handshake the client's identity is not yet verified. While Noise in principle allows sending of unencrypted data, endpoints MUST NOT use this to send their list of stream multiplexers. An endpoint MAY send it as soon it is possible to send encrypted data, even if the peers' identity is not verified at that point. +The stream multiplexer that is used in the connection is determined by intersection the lists sent by both endpoints, as follows: First all stream multiplexers that aren't supported by both endpoints are removed from the clients' list of stream multiplexers. The stream multiplexer chosen is then the first element of this list. +If there is no overlap between the two lists, it is not possible to communicate with the peer, and an endpoint MUST close the connection. + Note that this negotiation scheme allows peers to negotiate a "monoplexed" connection, i.e. a connection that doesn't use any stream multiplexer. Endpoints can offer support for monoplexed connections by offering the `/monoplex` stream multiplexer. **TODO**: Do we need to define a way to send an error code / error string? Or do we have something like that in libp2p already? @@ -65,13 +68,23 @@ All messages are Protobuf messages using the `proto3` syntax. Every message is w # Wraps every message message Multiselect { oneof message { - Offer offer = 1; - Use use = 2; + OfferMultiplexer offerMultiplexer = 1; + Offer offer = 2; + Use use = 3; } } ``` -This document defines two messages. The first one is the `Offer` message: +This document defines three messages. The first one is the `OfferMultiplexer` message: + +```protobuf +# Offer a list of stream multiplexers. +message OfferMultiplexer { + repeated string name = 1; +} +``` + +The second one is the `Offer` message: ```protobuf # Select a list of protocols. @@ -86,7 +99,7 @@ message Offer { } ``` -And the second one is the `Use` message: +And the third one is the `Use` message: ```protobuf # Declare that a protocol is used on this stream. @@ -103,6 +116,9 @@ message Use { ### Protocol Description +The `OfferMultiplexer` message is used to select a stream multiplexer to use on a connection. Each endpoint MUST send this message exactly once as the first message on a transport that does not support native stream multiplexing. This message MUST NOT be sent on transports that support native stream multiplexing (e.g. QUIC), and it MUST NOT be sent at any later moment during the connection. +Once an endpoint has both sent and received the `OfferMultiplexer` message, it determines the stream multiplexer to use on the connection as described in {{stream-multiplexer-selection}}. From this moment, it now has a multiplexed connection that can be used to exchange application data. + An endpoint uses the `Offer` message to initiate a conversation on a new stream. The `Offer` message can be used in two distinct scenarios: 1. The endpoint knows exactly which protocol it wants to use. It then lists this protocol in the `Offer` message. 2. The endpoint wants to use any of a set of protocols, and lets the peer decide which one. It then lists the set of protocols in the `Offer` message. @@ -110,8 +126,6 @@ An endpoint uses the `Offer` message to initiate a conversation on a new stream. A `Protocol` is the application protocol spoken on top of an ordered byte stream. The `name` of a protocol is the protocol identifier, e.g. `/ipfs/ping/1.0.0`. The `id` is a numeric abbreviation for this protocol (see below for details how `id`s are assigned). If the endpoint only selects a single protocol, it MAY start sending application data right after the protobuf message. Since it has not received confirmation if the peer actually supports the protocol, any such data might be lost in that case. If the endpoint selects multiple protocols, it MUST wait for the peer's choice of the application protocol (see description of the `Use` message) before sending application. -Listing a set of protocols is useful for stream multiplexer selection. A server that supports multiple stream multiplexers will send its list of multiplexers in Early Data (or right after completion of the handshake, see above). - The `Use` message is sent in response to the `Offer`. An endpoint MUST treat the receipt of a `Use` message before having sent an `Offer` message on the stream as a connection error. If none of the protocol(s) listed in the `Offer` message are acceptable, an endpoint MUST reset both the send- and the receive-side of the stream. From 86030ed0beda664a2d9652e25a067e244ba4ab68 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 2 Dec 2019 11:42:27 +0700 Subject: [PATCH 11/13] remove the option to send multiple protocols in Offer --- connections/multiselect2.md | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/connections/multiselect2.md b/connections/multiselect2.md index 1ea9b5d6e..b9336143d 100644 --- a/connections/multiselect2.md +++ b/connections/multiselect2.md @@ -95,7 +95,7 @@ message Offer { uint64 id = 2; } } - repeated Protocol protocols = 1; + Protocol protocols = 1; } ``` @@ -106,11 +106,7 @@ And the third one is the `Use` message: # By using an id (instead of a name), an endpoint can provide the peer # an abbreviation to use for future uses of the same protocol. message Use { - message Protocol { - uint64 id = 1; - string name = 2; - } - Protocol protocol = 1; + uint64 id; } ``` @@ -119,19 +115,13 @@ message Use { The `OfferMultiplexer` message is used to select a stream multiplexer to use on a connection. Each endpoint MUST send this message exactly once as the first message on a transport that does not support native stream multiplexing. This message MUST NOT be sent on transports that support native stream multiplexing (e.g. QUIC), and it MUST NOT be sent at any later moment during the connection. Once an endpoint has both sent and received the `OfferMultiplexer` message, it determines the stream multiplexer to use on the connection as described in {{stream-multiplexer-selection}}. From this moment, it now has a multiplexed connection that can be used to exchange application data. -An endpoint uses the `Offer` message to initiate a conversation on a new stream. The `Offer` message can be used in two distinct scenarios: -1. The endpoint knows exactly which protocol it wants to use. It then lists this protocol in the `Offer` message. -2. The endpoint wants to use any of a set of protocols, and lets the peer decide which one. It then lists the set of protocols in the `Offer` message. - -A `Protocol` is the application protocol spoken on top of an ordered byte stream. The `name` of a protocol is the protocol identifier, e.g. `/ipfs/ping/1.0.0`. The `id` is a numeric abbreviation for this protocol (see below for details how `id`s are assigned). -If the endpoint only selects a single protocol, it MAY start sending application data right after the protobuf message. Since it has not received confirmation if the peer actually supports the protocol, any such data might be lost in that case. If the endpoint selects multiple protocols, it MUST wait for the peer's choice of the application protocol (see description of the `Use` message) before sending application. +An endpoint uses the `Offer` message to initiate a conversation on a new stream. The `Offer` names the protocol that an endpoint wants to use on the stream. A `Protocol` is the application protocol spoken on top of an ordered byte stream. The `name` of a protocol is the protocol identifier, e.g. `/ipfs/ping/1.0.0`. The `id` is a numeric abbreviation for this protocol (see below for details how `id`s are assigned). +An endpoint MAY start sending application data right after the protobuf message. Since it has not received confirmation if the peer actually supports the protocol, any such data might be lost in that case. The `Use` message is sent in response to the `Offer`. An endpoint MUST treat the receipt of a `Use` message before having sent an `Offer` message on the stream as a connection error. -If none of the protocol(s) listed in the `Offer` message are acceptable, an endpoint MUST reset both the send- and the receive-side of the stream. - -If an endpoint receives an `Offer` message that only offers a single protocol, it accepts this protocol by sending an empty `Use` message (i.e. a message that doesn't list any `protocol`), or a `Use` message that assigns a protocol id (see below). Sending an empty `Use` message in response to an `Offer` message that offers multiple protocols is not permitted, and MUST be treated as a connection error by an endpoint. +If the protocol offered in the `Offer` message is not acceptable, an endpoint MUST reset both the send- and the receive-side of the stream. -If an endpoint receives an `Offer` message that offers multiple protocols, it chooses an application protocol that it would like to speak on this stream. It informs the peer about its choice by sending its selection in the `protocol` field of the `Use` message. +An endpoint accepts the protocol offered in the `Offer` message by sending an empty `Use` message (i.e. a message that doesn't list any `protocol`), or a `Use` message that assigns a protocol id (see below). When choosing a protocol, an endpoint can allow its peer to save bytes on the wire for future use of the same protocol by assigning a numeric identifier for the protocol by sending an `id`. The identifier is valid for the lifetime of the connection. The identifier must be unique for the protocol, an endpoint MUST NOT use the same identifier for different protocols. From 0f4b930886066cd8fc1bcf0d9b5c4e6fd8790feb Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 2 Dec 2019 22:20:11 +0700 Subject: [PATCH 12/13] Revert "remove the option to send multiple protocols in Offer" This reverts commit 86030ed0beda664a2d9652e25a067e244ba4ab68. --- connections/multiselect2.md | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/connections/multiselect2.md b/connections/multiselect2.md index b9336143d..1ea9b5d6e 100644 --- a/connections/multiselect2.md +++ b/connections/multiselect2.md @@ -95,7 +95,7 @@ message Offer { uint64 id = 2; } } - Protocol protocols = 1; + repeated Protocol protocols = 1; } ``` @@ -106,7 +106,11 @@ And the third one is the `Use` message: # By using an id (instead of a name), an endpoint can provide the peer # an abbreviation to use for future uses of the same protocol. message Use { - uint64 id; + message Protocol { + uint64 id = 1; + string name = 2; + } + Protocol protocol = 1; } ``` @@ -115,13 +119,19 @@ message Use { The `OfferMultiplexer` message is used to select a stream multiplexer to use on a connection. Each endpoint MUST send this message exactly once as the first message on a transport that does not support native stream multiplexing. This message MUST NOT be sent on transports that support native stream multiplexing (e.g. QUIC), and it MUST NOT be sent at any later moment during the connection. Once an endpoint has both sent and received the `OfferMultiplexer` message, it determines the stream multiplexer to use on the connection as described in {{stream-multiplexer-selection}}. From this moment, it now has a multiplexed connection that can be used to exchange application data. -An endpoint uses the `Offer` message to initiate a conversation on a new stream. The `Offer` names the protocol that an endpoint wants to use on the stream. A `Protocol` is the application protocol spoken on top of an ordered byte stream. The `name` of a protocol is the protocol identifier, e.g. `/ipfs/ping/1.0.0`. The `id` is a numeric abbreviation for this protocol (see below for details how `id`s are assigned). -An endpoint MAY start sending application data right after the protobuf message. Since it has not received confirmation if the peer actually supports the protocol, any such data might be lost in that case. +An endpoint uses the `Offer` message to initiate a conversation on a new stream. The `Offer` message can be used in two distinct scenarios: +1. The endpoint knows exactly which protocol it wants to use. It then lists this protocol in the `Offer` message. +2. The endpoint wants to use any of a set of protocols, and lets the peer decide which one. It then lists the set of protocols in the `Offer` message. + +A `Protocol` is the application protocol spoken on top of an ordered byte stream. The `name` of a protocol is the protocol identifier, e.g. `/ipfs/ping/1.0.0`. The `id` is a numeric abbreviation for this protocol (see below for details how `id`s are assigned). +If the endpoint only selects a single protocol, it MAY start sending application data right after the protobuf message. Since it has not received confirmation if the peer actually supports the protocol, any such data might be lost in that case. If the endpoint selects multiple protocols, it MUST wait for the peer's choice of the application protocol (see description of the `Use` message) before sending application. The `Use` message is sent in response to the `Offer`. An endpoint MUST treat the receipt of a `Use` message before having sent an `Offer` message on the stream as a connection error. -If the protocol offered in the `Offer` message is not acceptable, an endpoint MUST reset both the send- and the receive-side of the stream. +If none of the protocol(s) listed in the `Offer` message are acceptable, an endpoint MUST reset both the send- and the receive-side of the stream. + +If an endpoint receives an `Offer` message that only offers a single protocol, it accepts this protocol by sending an empty `Use` message (i.e. a message that doesn't list any `protocol`), or a `Use` message that assigns a protocol id (see below). Sending an empty `Use` message in response to an `Offer` message that offers multiple protocols is not permitted, and MUST be treated as a connection error by an endpoint. -An endpoint accepts the protocol offered in the `Offer` message by sending an empty `Use` message (i.e. a message that doesn't list any `protocol`), or a `Use` message that assigns a protocol id (see below). +If an endpoint receives an `Offer` message that offers multiple protocols, it chooses an application protocol that it would like to speak on this stream. It informs the peer about its choice by sending its selection in the `protocol` field of the `Use` message. When choosing a protocol, an endpoint can allow its peer to save bytes on the wire for future use of the same protocol by assigning a numeric identifier for the protocol by sending an `id`. The identifier is valid for the lifetime of the connection. The identifier must be unique for the protocol, an endpoint MUST NOT use the same identifier for different protocols. From 2c08388d682cf56175b1ff37a457bf760c1df59b Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 11 Dec 2019 19:56:53 +0400 Subject: [PATCH 13/13] clarify that the client's muxer preference takes precedence --- connections/multiselect2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connections/multiselect2.md b/connections/multiselect2.md index 1ea9b5d6e..f3a9913c1 100644 --- a/connections/multiselect2.md +++ b/connections/multiselect2.md @@ -38,7 +38,7 @@ This section only applies if Multiselect 2 is run over a transport that is not n Some handshake protocols (TLS 1.3, Noise) support sending of *Early Data*. -In Multiselect 2 endpoints make use of Early Data to speed up stream multiplexcer selection. As soon as an endpoints reaches a state during the handshake where it can send encrypted application data, it sends a list of supported stream multiplexers. The list SHOULD be ordered be ordered by descending preference. +In Multiselect 2 endpoints make use of Early Data to speed up stream multiplexcer selection. As soon as an endpoints reaches a state during the handshake where it can send encrypted application data, it sends a list of supported stream multiplexers. The first entry of the client's list of stream multiplexers is selected, thus the client SHOULD send its list ordered by preference. When using TLS 1.3, the server can send Early Data after it receives the ClientHello. Early Data is encrypted, but at this point of the handshake the client's identity is not yet verified. While Noise in principle allows sending of unencrypted data, endpoints MUST NOT use this to send their list of stream multiplexers. An endpoint MAY send it as soon it is possible to send encrypted data, even if the peers' identity is not verified at that point.