如果服务器端想要更快速的响应网站或应用程序的应答,它可以突破浏览器对单一域名的最大连接数限制。例如,不要在同一个域名下获取所有资源,假设有个域名是 www.example.com
,我们可以把它拆分成好几个域名:www1.example.com、www2.example.com、www3.example.com
。所有这些域名都指向同一台服务器,浏览器会同时为每个域名建立 6 条连接
h2的重点概念: 流(stream):流是连接中的一个虚拟信道,可以承载双向的消息;每个流都有一个唯一的整数标识符(1、2…N)
消息(message):指逻辑上的 HTTP 消息,比如请求、响应等,由一或多个帧组成
帧(frame):HTTP/2 通信的最小单位,每个帧包含帧首部,至少也会标识出当前帧所属的流,承载着特定类型的数据,如 HTTP 首部、负荷等
HTTP/2解决了HTTP的队头阻塞问题,但是并没有解决TCP队头阻塞问题 HTTP/2因为没有顺序了,所以就不需要阻塞了,就有效的解决了HTTP对队头阻塞的问题。 TCP传输过程中会把数据拆分为一个个按照顺序排列的数据包,这些数据包通过网络传输到了接收端,接收端再按照顺序将这些数据包组合成原始数据,这样就完成了数据传输。但是如果其中的某一个数据包没有按照顺序到达,接收端会一直保持连接等待数据包返回,这时候就会阻塞后续请求。这就发生了TCP队头阻塞。HTTP/1.1的管道化持久连接也是使得同一个TCP链接可以被多个HTTP使用,但是HTTP/1.1中规定一个域名可以有6个TCP连接。而HTTP/2中,同一个域名只是用一个TCP连接。所以,在HTTP/2中,TCP队头阻塞造成的影响会更大,因为HTTP/2的多路复用技术使得多个请求其实是基于同一个TCP连接的,那如果某一个请求造成了TCP队头阻塞,那么多个请求都会受到影响。
HTTP通信时间总和 = TCP连接时间 + HTTP交易时间 = 1.5 RTT + 1 RTT = 2.5 RTT TCP三次握手的过程客户端和服务器之间需要交互三次,那么也就是说需要消耗1.5 RTT。另外,如果使用的是安全的HTTPS协议,就还需要使用TLS协议进行安全数据传输,这个过程又要消耗一个RTT(TLS不同版本的握手机制不同,这里按照最小的消耗来算)那么也就是说,一个纯HTTP/2的连接,需要消耗1.5个RTT,如果是一个HTTPS连接,就需要消耗3-4个RTT。
HTTP/3 基于 UDP 协议的 QUIC(Quick UDP Internet Connection) 协议.0RTT 建连 无延迟连接 QUIC通过使用类似 TCP 快速打开的技术,缓存当前会话的上下文,在下次恢复会话的时候,只需要将之前的缓存传递给服务端验证通过就可以进行传输了。0RTT 建连可以说是 QUIC 相比 HTTP/2 最大的性能优势. 由于建立在 UDP 的基础上,同时又实现了 0RTT 的安全握手,所以在大部分情况下,只需要 0 个 RTT 就能实现数据发送,在实现前向加密的基础上,并且 0RTT 的成功率相比 TLS 的会话记录单要高很多。
因为 TCP 是基于 IP 和端口去识别连接的,这种方式在多变的移动端网络环境下是很脆弱的。而 QUIC 是通过 ID 的方式去识别一个连接,不管你网络环境如何变化,只要 ID 不变,就能迅速重连上 QUIC 协议有一个非常独特的特性,称为前向纠错(Forward Error Correction,FEC),每个数据包除了它本身的内容之外,还包括了部分其它数据包的数据,因此少量的丢包可以通过其它包的冗余数据直接组装而无需重传。 前向纠错牺牲了每个数据包可以发送数据的上限,但是减少了因为丢包导致的数据重传次数。这会取得更好的效果,因为数据重传将会消耗更多的时间,包括确认数据包丢失、请求重传与等待新数据包等步骤。
快手的KCP,谷歌的QUIC,都是基于UDP的。B站 在Web 上大规模铺开了QUIC/HTTP3 , 使用UDP替代了TCP进行视频传输,期待更快的提高打开时间和降低卡顿。
《图解HTTP》
文档资料:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP
网络延迟又称为 RTT(Round Trip Time)
https://www.ianlewis.org/ 此网站使用了h2协议