[QUIC] 版本协商
QUIC 兼容的版本协商
QUIC的核心规范中没有定义一个完整的版本协商机制,只是提供了一个拒绝客户端使用的版本的方法。
这里我们定义一种新的机制来让服务器端和客户端进行版本协商。并且如果客户端选择的版本和最终协商出来的版本之间的第一组包结构是互相兼容的,这里的协商机制可以在原有 QUIC 流程上完成,不需要额外的客户端服务器端交互。
定义
-
第一组包 (first flight of packets): 是指由客户端创建和发送的用于初始化一个 QUIC 链接的那些 QUIC 包, 并且在此之前,客户端没有从服务器端收到过任何 QUIC 包.
-
客户端选择的版本(client’s Chosen Version): 在第一组包中使用的 QUIC 版本
-
原始版本(Original Version) : 是指客户端在发送它的第一个 QUIC 包使用的 QUIC 版本
-
协商版本(Negotiated Version): 在版本协商流程完成后, 当前链接上使用的版本信息。
-
可接受的版本(Acceptable Versions): 是指那些服务器支持的协议版本,如果客户端在它的第一组包中便使用其中的版本,那么该链接就可以直接用这个版本了,无需再协商。
-
提供的版本(Offered Versions): 是指那些如果客户端的版本号服务器端不支持时,我们附带在 Version Negotiation 包中的版本号。 这里的版本号通常和可接受的版本号是相同的.
版本协商机制
这里我们定义两种版本协商的方法:
- “不兼容的”(incompatible): 它需要客户端和服务器端进行一次额外的交互,但是适用于所有 QUIC 版本
- “兼容的”(compatible): 它不需要客户端和服务器端进行额外的交互,但是只适用于互相兼容的 QUIC 版本之间。
开始时, 客户端选择一个原始版本(Original Version), 然后创建和发送它的第一组 QUIC 包用于初始化 QUIC 链接过程。 这里第一组包都是用长头包(Long header packets), 这些包中包含相应的版本号,其中还有一个 Version Information