天天看点

TCP 要"凉",UDP 要崛起

作者:小小怪下士的架构攻略

HTTP 3.0于 2022 年 6 月 6 日正式发布了,最近盼盼抽出一些时间专门看了下,总结了一下,分享给大家学习。

HTTP3.0何改造UDP?

在HTTP2.0中推出了许多重要的优化,如二进制分帧协议、多路复用、头部压缩、服务端推送等,大幅度的提高了HTTP的性能,将其推上了新的台阶。

但即使性能得到了优化,HTTP在某些地方还是不满足大家的预期,主要是TCP带来的影响。如:

  1. 建立连接的时间过长
  2. 队头阻塞
  3. 移动网络切换时无法保持连接
  4. 网络切换时需要重新建立连接
TCP 要"凉",UDP 要崛起

TCP影响性能的一些特点,那为什么最终选用了UDP呢?

  1. 基于TCP的设备、协议、应用特别多,带来的影响特别大,难以兼容。
  2. TCP协议栈是Linux内核中的重要部分,修改、升级、兼容的成本特别大。
  3. TCP协议复杂,改造难度高。

既然TCP走不通,此时谷歌就将目光放到了同样是传输层协议的UDP身上。

UDP的几个特点:

  1. UDP无连接(没有建立连接和结束连接的成本)
  2. UDP数据无序,且数据报之间没有关联(无队头阻塞问题)
  3. UDP协议简单(修改成本低)
  4. UDP的几个特点都完全满足我们的需求,而唯一的缺陷就是UDP无法像TCP一样具有可靠性。

因此谷歌决定中UDP的基础上改造出一个具备TCP优点的新协议——QUIC协议。

QUIC协议

QUIC ,即快速UDP网络连接 (Quick UDP Internet Connections ), 是由谷歌提出的实验性网络传输协议 ,位于OSI模型的传输层。

QUIC旨在解决TCP协议的缺陷,并最终替代TCP协议, 以减少数据传输,降低连接建立延迟时间,加快网页传输速度。

QUIC主要特点如下

TCP 要"凉",UDP 要崛起

QUIC数据格式

TCP 要"凉",UDP 要崛起

QUIC连接建立 回顾HTTPS的握手过程包含TCP握手和TLS握手

TCP 要"凉",UDP 要崛起

建立连接-QUIC

TCP 要"凉",UDP 要崛起

多路复用

首次提出:HTTP2

定义:单个TCP连接上可以同时发送多个HTTP请求。

目的:解决HTTP1.1中单个连接1次只能发送一个请求的性能瓶颈 1个请求对应1个流,通过Stream ID就可以判断该数据帧属于哪个请求。

假设有A和B两个请求,对应的Stream ID分别为1和2。

TCP 要"凉",UDP 要崛起

前向纠错

前向纠错是一种差错控制方式,它是指信号在被送入传输信道之前预先按一定的算法进行编码处理,加入带有信号本身特征的冗码,在接收端按照相应算法对接收到的信号进行解码,从而找出在传输过程中产生的错误码并将其纠正的技术。

当出现丢包时,TCP采用的是重传机制,而QUIC采用的是前向纠错机制。

  1. 对于TCP来说,如果发生丢包,则需要一个等待延时判断是否发生了丢包,然后再启动重传机制,这个过程会造成一定的阻塞,影响传输的时间。
  2. QUIC每发送一组数据就对这组数据进行异或运算,并将结果作为一个校验和包发送出去。如果前面这组数据中出现了丢包的情况,就可以通过校验和与其他包来还原出丢包的数据,避免了重传带来的损耗。

连接迁移

在当前的移动网络环境下,用户的网络随时都有可能发生切换,比如从移动网络切换到WIFI环境,此时我们的IP地址就会发生变化。

由于TCP协议使用五元组(源IP,源端口,目的IP,目的端口,传输层协议) 来唯一表示一条连接,因此之前的连接就不可能继续保持,就需要重新建立TCP连接。

为了解决这个问题,基于UDP实现的QUIC完全摒弃了五元组的概念,其通过生成一个64位的随机数作为连接的标识,即使当我们发生了IP地址的切换,这个标识也不会发生任何变化,我们就可以快速的恢复连接,大大的改善了移动端应用的体验。

总结

QUIC是如何提升网络加载速度的?

  1. 降低连接耗时:在客户端有缓存的情况下实现 0-RTT 建立连接
  2. 更灵活的拥塞控制:在用户态可以为每个请求配置不同的拥塞控制策略
  3. 无队头阻塞的多路复用:在用户态可以为每个请求配置不同的拥塞控制策略
  4. 连接迁移:网络切换不会中断数据传输
tcp