quic 是什么
quic(Quick UDP Internet Connections) 是一个由谷歌开发的新互联网传输协议.
quic 解决了现代 web 应用遇到的传输层和应用层问题,而且需要很小或者零改动.quic 和 tcp+tls_http2 很像,但是在 udp 上实现.
quic 对比 tpc+tls+http2 的关键优点包括:
链接建立延时
改进拥塞控制
没有线头阻塞的多路复用
前向纠错
链接迁移
链接建立
相比于 tcp+tls 的 1-3 个 roundtrip,quic 在发送数据前需要 0 个 roundtrip.
quic 客户端第一次链接服务端,客户端必须进行 1 个 roundtrip 的握手以获取必要的信息来完成握手.客户端发送一个 CHLO,服务端发送一个带有 客户端进行下一步所需的信息的 REJ,包括源地址 token 和服务端的 certificates.下一次客户端发送 CHLO,他可以使用之前链接缓存的 certificates 来直接发送加密请求给服务端.
拥塞控制
quic 有可插拔的拥塞控制,相比 tcp 提供更丰富的信息用于拥塞控制算法.
一个更丰富信息的例子就是每个 packet,包括原始的和重传的,都携带一个新的序列号.这个允许 quic 发送者区分 ack 是针对重传的还是原始的,避免 tcp 重传歧义问题.quic ack 也显示携带 packet 接收和 ack 发送的延时,也携带了单调递增的序列号.这个允许了精确的 rtt 就按
最后,quic ack 帧支持 256 nack 范围,所以相比带有 sack 的 tcp,quic 的重新排序更具弹性,同样当重新排序或者丢失时候在网络上保持更多的数据.包括客户端你和服务端拥有哪个 packet 对面已经接受到了的更精确图片.
多路复用
构建于 tcp 上的 http2 的一个最大的问题就是线头阻塞.应用吧 tcp 链接视作字节流.当一个 tcp packet 丢失后,http2 链接上的流没有办法向前,直到 packet 重传了并且另一端接收了.
因为 quic 专为多路复用设计,丢失一个特定流的 packet 通常只影响这个特定流.
前向纠错
为了从丢失的 packets 中恢复而不用等待重传,quic 可以补充一组携带 fec packet 的 packets.很像 raid-4,fec packet 包含了在 fec 组中 packets 的奇偶校验.如果组中的一个 packet 丢失了,这个内容可以从 fec packet 和组中剩余的 packets 恢复.这个发送者可以决定是否发送 fec packets 来优化特定场景.
链接迁移
quic 链接是通过由客户端生成的 64 位的链接 id 来区分的.相比,tcp 链接通过 4 元祖来区分.这个意味着如果一个客户端改变 ip,任何活跃的 tcp 链接将不再有效.当 quic 客户端改变 ip,他仍可以使用旧的链接 id 而不需要大端任何发送中的请求.
网友评论