Subject: Proposal to make Version Negotiation more like Retry to punt VN to QUICv2

From: David Schinazi <[email-masked]>
Date: Mon, 7 Jan 2019 13:37:18 -0800

Hi folks,

We've been talking about Version Negotiation (VN) for a while, as the
current design isn't perfect yet. In particular, it is vulnerable to subtle
deadlocks and downgrades and requires a full RTT.

I have a proposal for the WG that would effectively punt this issue,
allowing us to focus on other QUICv1 deliverables until we actually need VN
and have deployment experience.

I'm working with the following assumptions:
- when we'll have clients and servers supporting both QUICv1 and QUICv2, we
will not be willing to pay a full RTT to negotiate which version to use
- when we standardize QUICv1, we will not know what QUICv2 will look like,
so cannot design compatible VN in v1 and be sure it will work with v2
- compatible VN can rely on transport parameters, so it will be possible to
standardize it later as an extension to QUICv1

The proposal is to make VN packets a fatal error that effectively kills the
first connection, and have them transmit a new connection ID to allow
clients to create a new connection that will hit the same server (or not,
based on server preference). In terms of wire format, this makes VN more
like Retry by making the server send a new connection ID to the client.

Here's a PR of the proposal:
https://github.com/quicwg/base-drafts/pull/2313

(Note that this was mostly inspired by EKR's proposals.)

Thanks,
David