| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> UDP可靠性传输-QUIC -> 正文阅读 |
|
[网络协议]UDP可靠性传输-QUIC |
一、QUIC协议QUIC ,即 快速UDP网络连接 ( Quick UDP Internet Connections ), 是由 Google 提出的实验性网络传输协议 ,位于 OSI 模型传输层。 QUIC 旨在解决 TCP 协议的缺陷,并最终替代 TCP 协议, 以减少数据传输,降低连接建立延 迟时间,加快网页传输速度。 标准文档地址:https://quicwg.org/base-drafts/rfc9000.html 1. QUIC框图1.1 为什么QUIC在应用层实现
1.2 QUIC协议术语QUIC连接:CLient和Server之间的通信关心,Client发起连接,Server接收连接 流(Stream):一个QUIC连接内,单向或者双向的有序字节流。一个QUIC连 接可以同时包含多个Stream 帧(Frame):QUIC连接内的最小通信单元。一个QUIC数据包(packet)中的 数据部分包含一个或多个帧 1.3 QUIC和TCP对比2. QUIC报文格式2.1 QUIC数据包格式
2.2 QUIC Stream帧数据帧有很多类型:Stream、ACK、Padding、Window_Update、Blocked 等,这里重点介 绍下用于传输应用数据的 Stream 帧。 Frame Type:帧类型,占用1个字节
Stream ID:流 ID,用于标识数据包所属的流。后面的流量控制和多路复用会涉及到。 Offset:偏移量,表示该数据包在整个数据中的偏移量,用于数据排序。 Data Length: 数据长度,占用 2 个字节,表示实际应用数据的长度. Data: 实际的应用数据 3. QUIC的特点
3.1 连接建立低延时3.1.1 典型TCP+TLS连接
注意到,三次握手中的 ACK 包与 handshake 合并在一起发送。 这是 TCP 实现中使用的 延迟确认 技术, 旨在减少协议开销,改善网络性能。 客户端和服务器之间要进行多轮协议交互,才能建立 TLS 连接,延迟相当严重。 平时访问 https 网站明显比 http 网站慢,三次握手和 TLS 握手难辞其咎。 3.1.2 首次连接对比
3.1.2 再次连接对比
3.2 多路复用在一个网页里面总是会有多个数据要传输,总是希望多个数据能够同时传输,以此 来提高用户的体验。 3.2.1 HTTP1.1每个TCP连接同时只能处理一个请求—响应,为了提高响应速度,需要 同时创建多个连接,但是多个连接管理比较复杂。 3.2.2 HTTP2
3.2.3 QUIC(HTTP3)
3.3 无队头阻塞HTTP/2会出现队头阻塞问题,而在基于QUIC的HTTP/3中则很好地解决这一问题。
3.4 灵活的拥塞控制和机制TCP 的拥塞控制实际上包含了四个算法:慢启动,拥塞避免,快速重传,快速恢复。
QUIC协议可以自己设置或实现拥塞控制协议。 QUIC 协议当前默认使用了 TCP 协议的 Cubic 拥塞控制算法。 这个机制还是可插拔的,能够非常灵活地生效,变更和停止,可以根据场景来切换不同的方法。 QUIC协议在用户空间实现,应用程序不需要停机和升级就能实现拥塞控制 的变更,在服务端只需要修改一下配置,reload 一下,完全不需要停止服务 就能实现拥塞控制的切换。甚至可以为每一个请求都设置一种拥塞控制算法。 而TCP在内核态,其拥塞控制难以进行修改和升级。 3.5 连接迁移连接迁移:当客户端切换网络时,和服务器的连接并不会断开,仍然可以正常通信。 对于 TCP 协议而言,这是不可能做到的。因为 TCP 的连接基于 4 元组:源 IP、源端口、 目的 IP、目的端口,只要其中 1 个发生变化,就需要重新建立连接。 但 QUIC 的连接是 基于 64 位的 Connection ID,网络切换并不会影响 Connection ID 的变化,连接在逻辑上 仍然是通的。IP地址或者端口号发生变化时,只要ID不变,依然能够维持原有连接,上层业务逻辑感 知不到变化,不会中断。 客户端的Connection ID是唯一的。 3.6 数据包头和包内数据的身份认证和加密相比于TCP,QUIC的安全性是内置的,也就是说是必须的。 在恶意环境下性能与TLS类似,友好环境下优于TLS,因为TLS使用一个会话密钥, 如果这个密钥被截获的话就不能保证之前数据的安全性。 而QUIC使用两个密钥——初始密钥和会话密钥,并且QUIC提供密码保护,TLS不提供。 除此之外,QUIC的包头经过身份认证,包内数据是加密的。这样如果QUIC数据 被恶意修改的话接收端是可以发现的,降低了安全风险。 而且数据加密之后,可以通过像防火墙或者nat这些中间件。 两个密钥的生成可参考:https://blog.csdn.net/chuanglan/article/details/85106706 3.7 FEC前向纠错FEC是Forward Error Correction前向错误纠正的意思,就是通过多发一些冗余的包, 当有些包丢失时,可以通过冗余的包恢复出来,而不用重传。这个算法在多媒 体网关拥塞控制有重要的地位。QUIC的FEC是使用的XOR的方式,即发N + 1个包, 多发一个冗余的包,在正常数据的N个包里面任意一个包丢了,可以通过这个冗 余的包恢复出来,使用异或可以做到切换网络操持连接。 3.8 可靠性传输QUIC 是基于 UDP 协议的,而 UDP 是不可靠传输协议,那 QUIC 是如何实现可靠传输的呢? 可靠性传输有2个重要特点:
3.8.1 有序性设计QUIC每个Stream帧中都有offset字段和StreamID字段,这使得乱序接收的数据能够有序排列。 3.8.2 完整性设计发送端通过包号(PKN)和确认应答(SACK)确认发送数据完整性。
尽管QUIC会重传数据包,但是新的数据包的PKN的继续递增的,即之前发送的数据包(PKN=2)和重传的 数据包(PKN=4),虽然数据一样,但包号不同。这也解决了TCP中,原始包和重传包的序列号一样带来的重传歧义问题。 由于TCP原始包和重传包的序列号是一样的,客户端不知道服 务器返回的 ACK 包到底是原始包的,还是重传包的。但 QUIC 的原始包和重传包的序列号是不同的,也就可以判 断 ACK 包的归属。 4. QUIC开源库
4.1 ngtcp2
|
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:28:49- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |