QUIC 规范

简介

    QUIC (Quick UDP Internet Connection) 是在UDP之上实现的一种新的多路复用的并且是安全的,是为了优化HTTP/2而重新设计的语法。QUIC 是建立在几十年的传输和安全的经验上,并且是用硬件实现了一个很优秀的多功能传输。QUIC 提供了与HTTP/2相当的多路传输和流量控制,与TLS相当的安全,与TCP 相当的连接语义、可靠性以及拥塞控制。

    QUIC 的整个操作都是在用户态下的,当前作为chromium浏览器的一部分呈现给用户,以便于快速开发与试验。作为一个基于UDP的用户态传输协议,QUIC 可以彻底改变在当前协议中部署的重重困难,这些包括受限于老旧的客户端或者中间设备以及缓慢的操作系统升级及其开发周期。

    QUIC 的一个重要目标是通过快速实验的方式发现一个更好的传输结构。所以,我们希望发现并提取出可以移植到tcp+tls 中的修改,因为tcp+tls倾向于需要更长的迭代周期。

    本文描述的是QUIC协议的概要设计和标准化之前的详细说明。


包类型和格式

Quic 分为特殊包和普通包。特殊包又分为两种,版本协商数据包和复位包;普通包包含数据帧。所有的数据包都应该小于等于MTU,从而避免IP分片。网络路径中的MTU发现是自动执行的,当前的QUIC实现,在IPv6中使用1350字节,在IPv4中使用1370字节,并且这些大小是不包括IP头和UDP头的。

 

公共头

所有的传输中的QUIC数据包都有一个公共的头,大小是1字节到51字节。公共头的格式如下:

 

--- src

     0        1       2        3        4            8

+--------+--------+--------+--------+--------+---    ---+

| Public |   Connection ID (64)    ...                 | ->

|Flags(8)|     (optional)                             |

+--------+--------+--------+--------+--------+---    ---+

 

     9       10      11        12  

+--------+--------+--------+--------+

|      QUICVersion (32)            | ->

       (optional)                |                          

+--------+--------+--------+--------+

 

 

    13       14      15        16      17      18       19       20

+--------+--------+--------+--------+--------+--------+--------+--------+

|                        Diversification Nonce                          | ->

|                              (optional)                               |

+--------+--------+--------+--------+--------+--------+--------+--------+

 

    21       22      23        24      25      26       27       28

+--------+--------+--------+--------+--------+--------+--------+--------+

|                  Diversification Nonce Continued                     | ->

|                              (optional)                               |

+--------+--------+--------+--------+--------+--------+--------+--------+

 

    29       30      31        32      33      34       35       36

+--------+--------+--------+--------+--------+--------+--------+--------+

|                  Diversification Nonce Continued                     | ->

|                              (optional)                               |

+--------+--------+--------+--------+--------+--------+--------+--------+

 

    37       38      39        40      41      42       43       44

+--------+--------+--------+--------+--------+--------+--------+--------+

|                  Diversification Nonce Continued                     | ->

|                              (optional)                               |

+--------+--------+--------+--------+--------+--------+--------+--------+

 

 

    45      46      47        48       49      50

+--------+--------+--------+--------+--------+--------+

|          Packet Number (8, 16, 32, or 48)         |

|                 (variable length)                  |

+--------+--------+--------+--------+--------+--------+

 

---

 

有效负载包含各种类型相关的头部数据,具体如下:

公共头的各个字段描述如下:

●   Public Flags:

○   0x01 = PUBLIC_FLAG_VERSION.该标志的含义取决于他是服务端发送的还是客户端发送的。当是客户端发送的时候,该标志位的意思公共头里面包含这一个QUIC版本号。这个标志位必须设定直到客户端收到来自服务端的对指定版本“欢迎词”。

服务端通过发送一个没有设定该标志位,来表明同意使用某一个版本。

当服务端设定这个标志时,表示这是一个版本协商数据包。

○   0x02 = PUBLIC_FLAG_RESET.该标志表示是一个复位包。

○   0x04 =表示存在一个32字节的“多样随机值”

○   0x08 =表示有一个8字节的会话ID,这个标志位必须设定直到重新协商版本号

○   0x30 =这两位表示包序号的有效字节数。这支队数据帧包有效。对于复位包、版本协商包,该两位并没有作用,且必须设置为0。具体含义如下:

■   0x30表示包序号由6字节表示

■   0x20表示包序号由4字节表示

■   0x10表示数据包由2字节表示

■   0x00表示数据包由1字节表示

○   0x40 =保留位

○   0x80 =没有使用,且必须设置成0

●   Connection ID: 是一个由客户端随机生成的64位无符号整数,用于标识会话。因为QUIC会话是为了在客户端移动而引起的四元组变化时继续保持连接。对于传输的任何一端,如果四元组能有效的标识一个会话,那么connection id 可以省略。

●      QUIC Version: 是一个32位的QUIC协议版本号,对客户端服务端都不透明。只有在Public Flags中包含FLAG_VERSION标志时才存在。


    


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值