一、UDP
UDP (User Datagram Protocol) 是一种无连接的网络传输协议,它不保证数据传输的可靠性和顺序,但具有高效、低延迟和灵活的特点。UDP常用于实时通信应用程序,例如音频、视频和在线游戏等。由于UDP将数据包发送到目标地址,而不需要建立连接,因此它比TCP更加简单、轻量级和快速。但是,由于它不提供数据完整性检查和重传机制,因此在一些应用场景下可能会出现数据丢失或错误的问题。
二、可靠传输
可靠传输是指在网络通信中,数据能够被正确的发送、接收、处理和存储,而不会出现丢失、失序、重复等错误。可靠传输需要通过各种技术手段来增强数据传输的稳定性和准确性,如数据校验、确认应答、超时重传、流量控制和拥塞控制等。可靠传输能够保证数据的完整性和可用性,从而确保网络通信的质量和可靠性。
三、QUIC
1. QUIC是什么
QUIC ,即快速UDP网络连接 ( Quick UDP Internet Connections ),诞生于2012年, 是由Google 提出的实验性网络传输协议 ,位于 OSI 模型传输层。 QUIC 旨在解决TCP 协议的缺陷,并最终替代 TCP 协议, 以减少数据传输,降低连接建立延迟时间,加快网页传输速度。
2. QUIC为什么在应用层实现
- 快速迭代:QUIC 是一个比较新的协议,由于在应用层实现,使得开发人员能够更加灵活地进行协议的修改和更新,从而快速迭代协议。
- 避免依赖操作系统:QUIC 作为一个应用层协议可以不依赖于底层操作系统的支持,这意味着它可以被运行在任何平台上,包括各种移动设备和嵌入式设备。
- 可定制性强:应用层实现使得 QUIC 协议可以根据特定需求进行调整和优化,例如在某些网络环境下,可以通过减小数据包大小来降低丢包率。
- 易于部署:由于 QUIC 是一种应用层协议,因此可以通过简单的软件更新来部署。这比传统的传输层协议(如 TCP)需要更多的配置和设置要容易得多,尤其是当涉及到防火墙和 NAT 网络时。
3. QUIC和TCP的区别
特点 | QUIC | TCP |
连接建立方式 | 0-RTT和1-RTT连接 | 3次握手连接 |
可靠性 | 内置可靠性机制,减少丢包 | 依赖于上层协议的可靠性机制 |
流控制 | 基于流的传输控制 | 基于字节的传输控制 |
拥塞控制 | 基于UDP的拥塞控制 | 基于TCP的拥塞控制 |
头部大小 | 较大,可能导致网络过载 | 较小,但头部长度不可改变 |
加密 | 内置TLS 1.3加密 | 需要单独进行TLS加密 |
支持的应用层协议 | HTTP/3、QUIC原生协议等 | HTTP/1.x、HTTP/2等 |
注:0-RTT是指在第一次连接时同时发送数据;1-RTT是指完成连接后再发送数据。
4. QUIC报文格式
字段 | 长度 | 描述 |
头部 | 13字节 | 包含版本,标志和连接ID |
加密 | 可变 | 取决于加密级别 |
数据 | 可变 | 包含请求和响应数据 |
注:长度和描述仅为大致描述,具体取决于QUIC的实现。
5. QUIC的特点
- 连接建立低时延
- 多路复用
- 无队头阻塞
- 灵活的拥塞控制机制
- 连接迁移
- 数据包头和包内数据的身份认证和加密
- FEC前向纠错
- 可靠性传输
6. QUIC建立低时延连接
- 客户端发送一个QUIC版本协商包给服务器,其中包含了支持的QUIC版本号。
- 服务器选择一个版本号,并返回一个QUIC连接句柄(Connection Handle)和一个随机数(Server Nonce)。
- 客户端使用QUIC连接句柄和服务器随机数构建一个加密上下文,并生成一个客户端随机数(Client Nonce)。
- 客户端使用加密上下文和客户端随机数对数据进行加密,并将加密后的密钥信息发送给服务器。
- 服务器使用QUIC连接句柄、服务器随机数和客户端随机数构建一个加密上下文,并使用客户端发送的密钥信息解密数据。
- 服务器使用加密上下文和服务器随机数对数据进行加密,并将加密后的密钥信息发送给客户端。
- 客户端使用QUIC连接句柄、客户端随机数和服务器随机数构建一个加密上下文,并使用服务器发送的密钥信息解密数据。
- QUIC连接建立完成后,客户端和服务器可以开始通过QUIC协议进行通信。由于QUIC使用了一些技术手段来减少网络延迟,因此可以建立低时延连接。
需要注意的是,QUIC建立低时延连接的过程中使用了加密技术来保证数据安全。因此,在建立连接之前,客户端和服务器必须相互认证,并且交换密钥信息。这样才能保证数据在传输过程中得到保护。
7. QUIC的缺点
- 不完全兼容TLS:虽然QUIC使用了加密,但它没有采用传统的TLS协议,这意味着它不能和现有的TLS协议进行完全兼容。
- 对设备资源消耗较大:QUIC需要在客户端和服务器端都运行一个额外的协议栈,这使得它在一些资源有限的设备上可能会造成性能问题。
- 网络部署困难:因为QUIC是一个相对新的协议,它需要被部署在网络设备中。这意味着网络管理员需要升级他们的设备以支持QUIC。
- 仍处于发展阶段:由于QUIC还比较年轻,它在实际应用中仍然存在一些问题。例如,在移动网络环境下,QUIC的表现可能不如预期。
- 难以监测和调试:QUIC使用UDP协议进行通信,这意味着它比TCP更难以监测和调试。这可能给网络管理员带来一些挑战。