QUIC的全称是 Quick UDP Internet Connections protocol,由 Google 设计提出,目前由 IETF 工作组推动进展,其设计的目标是替代 TCP 成为 HTTP/3 的数据传输层协议。熹乐科技在物联网(IoT)和边缘计算(Edge Computing)场景也一直在打造底层基于 QUIC 通讯协议的边缘计算微服务框架YoMo,长时间关注 QUIC 协议的发展,本文章简单介绍了 QUIC 协议的特点和术语。
在线社区:discord/quic
维护者:YoMo
QUIC 是一种多路复用和安全的通用传输协议,它提供:
- 流(stream)多路复用
- 流(stream)和连接(connection)级别的流量控制
- 建立低延迟连接(1-RTT 或者 0-RTT)
- 连接迁移(Connection migration)和弹性 NAT 重绑定
- 经过身份验证和加密的头部(header) 和有效载荷(payload)
QUIC 建立了客户端(client)和服务端(server)之间有状态的交互连接。连接的主要目的是通过应用协议支持结构化的数据交换。
应用协议通过 QUIC 连接的流(streams)交换信息,流(stream)是有序序列的字节(bytes)。可以创建两种类型的流:双向流(bidirectional streams),允许客户端和服务端互相发送数据。单向流(unidirectional streams),允许单个端点(endpoint)发送数据。一个基于信用的方案(credit-based scheme)用于限制流的创建并限制可发送的数据量。
QUIC 连接中的流(streams)是互相独立的,如果某个流(stream)出现丢包,不会影响连接中的其他正常传输的流。这样可以避免 TCP 协议中的队头阻塞(Head-of-Line blocking)。
QUIC 握手(handshake)合并了加密和传输参数的协商,只需要 1-RTT 即可可以完成握手,提升了建立连接到交换应用程序数据的速度。第二次连接时,可以通过第一次连接时获取到的预共享密钥(pre-shared secret)立即发送数据(0-RTT)。
QUIC 连接并不是严格地绑定到一个单一的网络路径(IP:Port)。连接迁移(Connection migration)使用连接 ID 来允许连接转移到新的网络路径。比如手机网络从蜂窝网络(cellular)切换到 WIFI 时,IP地址改变了,QUIC 可以通过连接迁移(connection migration)来避免连接中断。
QUIC 使用帧(frames)进行端到端的通信。一个或多个帧(frame)被组装成一个 QUIC 包(packet)。QUIC对所有数据包进行身份验证,并尽可能加密,增加了端到端传输的安全性。QUIC 数据包用 UDP 数据报(datagrams)进行传输,而不是创建一个全新的传输层协议,这是因为现有的网络设备和系统支持 TCP 和 UDP 协议,其中 TCP 有队头阻塞等缺点,所以 UDP 成为 QUIC 协议的选择,这可以更快的在现有系统和网络中部署。QUIC 是在用户空间(user space)中,相比 TCP(kernel space,操作系统内核)可以更快的迭代更新。
连接建立之后,可以通过多个选项关闭连接:应用程序可以管理正常(graceful)关闭、端点(endpoints)可以协商超时时间、错误可以导致立即断开连接、无状态(stateless机制提供了在一个端点失去状态后终止连接的功能。
QUIC 协议常见的术语:
数据包(Packet):QUIC 协议中一个完整可处理的单元,可以封装在 UDP 数据报(datagram)中。多个 QUIC 数据包(packets)可以封装在一个 UDP 数据报(datagram)中。
帧(Frame):QUIC 数据包(packet)的有效载荷(payload)。
端点(Endpoint):在 QUIC 连接中生成、接收和处理 QUIC 数据包(packets)。QUIC 中只有两种端点(endpoints):客户端(client)和服务端(server)。
客户端(Client): 创建 QUIC 连接的端点。
服务端(Server): 接收 QUIC 连接的端点。
地址(Address):未经限定使用时,表示网络路径一端的 IP 版本、IP 地址和 UDP 端口号的元组。
连接 ID(Connection ID): 用于标识端点 QUIC 连接的一种标识符。每个端点(endpoint)为其对端(peer)选择一个或多个连接 ID,将其包含在发送到该端点的数据包(packets)中。这个值对 peer 不透明。
流(Stream):QUIC 连接中有序字节的单向(unidirectional)或双向(bidirectional)通道。一个 QUIC 连接可以同时携带多个流。
应用程序(Application):使用 QUIC 发送或者接收数据的实体。
参考资料
- https://link.zhihu.com/?target=https%3A//quicwg.org/base-drafts/draft-ietf-quic-transport.htmlic-transport.html
- HTTP/3 Deep Dive | Ably Realtime
YoMo 是一套开源的实时边缘计算网关、开发框架和微服务平台,通讯层基于 QUIC 协议,更好的释放了 5G 等下一代低时延网络的价值。为流式处理(Streaming Computing)设计的编解码器 Y3 能大幅提升计算服务的吞吐量;基于插件的开发模式,5分钟即可上线您的物联网实时边缘计算处理系统。YoMo 目前已在工业互联网领域被部署应用。
官网: https://yomo.run