On 4/9/2021 6:36 AM, Mirja Kuehlewind wrote:

Hi Christian, hi all,

reviving this thread. First of all thanks for implementing both options
and writing the blog post!

After re-reading you post and reviewing the drafts, however, I have to say that 
I’m more convinced now that multiple packet number spaces might be the better 
approach forward. I actually always thought of the packet number as a per-path 
property where the wire image for each path should be as much independent as 
possible. So that seem architecturally more clean to me.
There are pros and cons with the "path property" approach. The main issue is that the definition of a path is not as obvious as it appears at first sight. We may think of a path as defined by the pair of sender and receiver addresses and ports, but this gets unclear if NATs are present. We end up with either a narrower definition using connection identifiers as in draft-liu, or avoiding the problem altogether by making packet numbers global. There are issues with both approaches, notably:

* Support for 0-length connection identifiers in draft-liu

* Need to maintain a path object with wider scope than the connection identifier in draft-liu, e.g. remembering congestion control, PMTU and RTT through a connection-ID renewal

* Size of acknowledgement frames if using a global number approach

The good news is that we are making progress on these issues, using a bit more sophistication. Ideas include:

* Identifying paths through using the corresponding source ID if the DCID is zero length. This enables control per path such as "don't use this path anymore" even if the peer uses zero-length DCID.

* If a peer uses zero length CID, use global path numbers when sending to that peer -- essentially a fusion of draft-liu and global numbers approach

* Manage the size of ACK frames by limiting the number of times a given ACK range is repeated in ACKs. This is a very simple implementation recommendation that mitigates the growth of ACK frames when global numbers are used, including in the zero-length CID case.


However, I’m really not convinced by your argument about implementation complexity below. First of all when we talk about implementation
complexity, we should not only consider lines of code or number of tests or 
something like that but I think it is more important to assess the potential 
for implementation error. That is harder to assess but I think having a clean 
design and reduce the number of interdependencies is a factor.

Further, implementation complexity should never be considered as a the sole metric. You actually convinced me in your blog post that what you call efficiency might be even more important because there are two aspects here: number of bits on the wire (for ACK frames that might have a lot of
wholes) and amount of bits in local memory.

My personal concern is the impact on code quality. If we end up with code branches that are rarely used, these branches will not be as well tested as the "main path", and  bugs in these branches may surface later. The inverse correlation between complexity and security is well known.

With this conclusion I see draft-liu-multipath-quic as a really good starting point for future work (however, that so far my personal assessment). In both cases I support the approach to design a multipath extension that minimizes the changes needed from the base protocol. So reusing the connection ID and connection ID update mechanism is I think definitely the
right approach to take.

I am certainly willing to use draft-liu as a starting point. I would not be a co-author of that draft if I did not believe that.

I also think that any mechanism for address/path negotiation do not need to be part of the initial extension. In the most common scenario the client might just open a second path without further negotiation or coordination with the server when the interface/IP address of that new path come
available. However, even if any negotiation is needed, this can be done on the 
application layer or added by another extension later on.

We agree.

For draft-liu-multipath-quic I would even recommend to even move the part about scheduling and QoS support into the separate draft. I think QoS signal can definitely be a separate extension because that might even be useful without multiple paths (e.g. as input for congestion control). And
for scheduling, I recommend to just specify some per-stream scheduling as the default behavior for now, but leave more complex schemes for future work (or research; scheduling doesn’t need standardization as it can be changed sender-side only).

My co-authors have been doing an excellent work investigating scheduling issues in a multipath environment. The question that we want to answer is essentially, when is a multipath setup worse than a single path configuration, and how can we mitigate that? The main answer is that multipath does degrade performance if packets are scheduled on a lossy path and later need to be repeated on another path, creating additional delays. I would rather wait the next draft release for explaining mitigations, because it is a bit long for email. But describing such mitigations absolutely belongs in the multipath draft.


So as soon as we could converge on the packet number question, I think we have 
a good starting to move on!

Again thanks for your work and for the drafts!

Mirja

You are welcome.

-- Christian Huitema



From: QUIC <[email protected]> on behalf of Christian Huitema 
<[email protected]>
Date: Sunday, 14. February 2021 at 23:23
To: IETF QUIC WG <[email protected]>
Subject: Options for QUIC Multipath


I authored two drafts proposing two different solutions for Multipath QUIC: QUIC 
Multipath Negotiation Option 
(https://datatracker.ietf.org/doc/draft-huitema-quic-mpath-option/); and, in 
collaboration with colleagues at Ali Baba, Multipath Extension for QUIC 
(https://datatracker.ietf.org/doc/draft-liu-multipath-quic/). Apart from some details 
that could easily be aligned, the main difference is that the “negotiation option” 
maintains the property of QUIC 
Transport<https://datatracker.ietf.org/doc/draft-ietf-quic-transport/> to have 
a single packet number space for all application packets while the “multipath 
extension for QUIC” specifies that there will be a specific packet number space for 
each path. I have now implemented both options in Picoquic. This blog describes what 
I learned: 
https://huitema.wordpress.com/2021/02/14/how-many-packet-number-spaces-for-quic-multipath/.

To summarize, I believe now that both options work. The simple option requires some 
additional work for managing acknowledgement, but the multiple number space option adds a 
lot more complexity (41 new code branches compared to only 6), and will require a lot 
more testing because it also change the processing of the "single path" 
scenarios. The multiple number space option also prevents the use of zero-length 
connection IDs, and thus causes additional overhead in some important deployment 
scenarios. So, yes, both options work, but the simpler option provides simpler code and 
also less overhead.

In any case, I hope that this exercise will inform our efforts to standardize 
multipath support in QUIC.

-- Christian Huitema



Reply via email to