QUIC 协议简介
QUIC 协议是 Google 制定的一个网络传输协议。它参考了 TCP+TLS+HTTP2 的优点,但是基于的底层协议是 UDP,旨在解决的问题是进一步降低延迟和网络拥塞。众所周知 TCP 有三次握手,开销不小;而 UDP 不用握手。QUIC 协议引入了一轮握手,客户端建立连接时发送 CHLO 包,服务器返回 REJ 包(包含了客户端的 token 和服务端的证书)。客户端的后续数据可带上服务器返回的验证信息。QUIC 的拥塞控制可插拔,它规定即使是重发的 packet 也需要带上新的序列号,这避免了服务端搞不清楚是直达的还是重发的。重发的 ACK 还有延迟信息方便计算。TCP 的特性导致了一包不达,后续就堵塞;QUIC 由于基于 UDP,丢包只影响对应的那个流,不会出现 HOL (head-of-line blocking)问题。丢包的解决可以通过 FEC 包来构建一个阵列信息,这种方法具体做法是将几个包聚合算出一个纠错包,当服务端发现丢包了可以根据纠错包和其他正常的包反解出来,完成前向纠错;另外 HTTP2 的 header 压缩外加一些逻辑也能解决。此外 QUIC 协议的连接使用客户端生成的随机64位ID做标识,跟TCP的(source-ip, source-port, dest-ip, dest-port) 不一样,好处是 ip 变更连接还能保持,只要还带着那个老id。