-
Notifications
You must be signed in to change notification settings - Fork 0
Description
From https://tools.ietf.org/html/draft-iab-use-it-or-lose-it-00#section-2.1 :
[Simple version negotiation in the initial protocol] has proven to be insufficient in practice. Many protocols have
evidence of imperfect implementation of critical mechanisms of this
sort. Mechanisms that aren't used are the ones that fail most often.
The same paragraph from RFC 6709 acknowledges the existence of this
problem, but does not offer any remedy:
Looking through this, I wonder if we can make some comments on the versions negotiation mechanisms that have been successful. I think one property that stands out is that many of the most "successful" mechanisms really are relying on other, lower layers to declare versions, as opposed to having a protocol negotiate a version in-band.
For example:
- HTTP/1.1 vs HTTP/2 uses ALPN from TLS; as long as your TLS implementation works, you don't have to have a parser that tries to read 1.1 or 2.
- HTTP/2 to HTTP/3 use entirely different transport protocols, and also have ALPN
- IPv4 and IPv6 have different types in Ethernet headers rather than actually using the version number in practice
The cited instances like TLS version negotiation within the protocol itself had to abandon the original mechanism.
Looking at QUIC, it has version negotiation built-in, but that's yet to be fully played out in the wild. However, the strong definition it has for Invariants means that the Invariants themselves are like a mini-protocol layer that is just about flow identification and version negotiation, upon which the actual QUIC protocol is riding.