|HTTP/3 来了!

|HTTP/3 来了!

文章图片


HTTP/3比HTTP/2强在哪里?
首先 , 我们先来介绍一下HTTP/2 , HTTP/2通过二进制传输、多路复用、Header压缩、Server Push等特性大大地提升了HTTP/1.x的性能 , 但是由于HTTP/2是基于TCP协议实现的 , TCP本身特性导致其必然存在一定的瓶颈及缺陷 。
HTTP/2缺陷:①Head-Of-Line Blocking(队头阻塞):HTTP/2多个请求都是在一个TCP连接中进行的 , 如果TCP传输时出现丢包 , 那么整个TCP就要等待重传 , 这样就会导致该TCP连接中的所有请求被阻塞 。 举个例子 , 见下图:

从上图可以看到发送端一共发送了四包packet , 其中packet 3在网络层丢失了 , 即使packet4被接收方的内核接收到 , 但因为在内核中其数据并不是连续的 , 导致接收端的应用层无法读取 , 只有等到packet3重传后 , 应用层才可以从内核中读取数据 。
②TCP和TLS握手时延:
TCP协议需要通过三次握手来建立TCP连接确保通信的可靠性(1.5个RTT) ,
TLS_V1.2协议会在TCP协议之上通过四次握手建立TSL连接保证通信的安全性(2个RTT) , HTTP协议会在TCP与TLS上发送请求并接收响应(1个RTT) 。
这意味着假如我们想要访问美国的服务器 , RTT约为250ms时 , 那么此时HTTPS请求的耗时大概要为1s左右 , 这就比较高了 。
③连接迁移需要重新连接:
一个TCP连接是由源IP地址、源端口、目标IP地址以及目标端口来确定的 。 这表示如果端口或者IP地址发生变动 , 就需要重新让TCP和TLS进行连接 。 这不适于设备切换网络的场景 。
上面这三个问题其实都是TCP协议固有的问题 , 无论HTTP/2应用层怎样进行设计 , 都改变不了这些缺陷 , 要想解决其根本 , 就需要将传输层协议TCP更换为UDP , 而HTTP 3.0就是这样做的!
【|HTTP/3 来了!】
我们知道UDP是一种简单、不可靠的传输协议 。 当然HTTP 3.0也不仅仅只是将传输协议由TCP替换为UDP , 它还基于UDP在应用层实现一个叫做QUIC的协议 , 这个协议具有与TCP类似的连接管理、拥塞控制等特性 , 可以将UDP变得“可靠” 。
下面介绍QUIC协议的优点:①无队头阻塞:
QUIC使用的传输协议是UDP , 其不关心数据包的顺序或者数据包丢失 , 但是 QUIC会保证数据包的可靠性 , 每个数据包都会有一个唯一标识 , 当某个stream的一个数据包丢失 。 这个stream的其他数据包即使到达了HTTP , 也不会被读取 , 直到QUIC重传丢失的数据 。
与HTTP/2不同的是其他stream不会因此受到影响 。
②连接建立更快:
QUIC内部包含了TLS_V1.3 , 它在数据帧中会携带TLS里的信息 。 并且QUIC不需要像HTTP/2通过TCP+TLS握手 , 它的握手过程仅需要1RTT , 握手的目的在于确认双方的连接ID 。 因此QUIC仅需一个RTT就可以同时完成连接建立与加密密钥 。 甚至它在第二次连接时 , 应用数据包可以与QUIC握手信息一并发送 , 达到0-RTT的效果 。
③支持连接迁移:
QUIC协议没有用IP地址和端口来确定连接 , 而是通过连接ID来标记通信两端 , 即使设备的网络发生变化后 , 导致IP地址变化 , 只要仍保有上下文信息(例如连接ID、TLS信息) , 就可以无缝复用原连接 。
HTTP 3.0 利用QUIC作为底层支撑协议 , 其融合UDP协议的速度、性能与TCP的安全可靠 , 解决了HTTP/2中引入的一些缺点 , 优化了互联网的传输体验 。 相信在未来HTTP 3.0的时代将会到来!