本文主要介绍了HTTP2相对于HTTP1.1的一些改进和新特性。
1、HTTP1.1的不足
HTTP协议采用“request-response”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议)。对于一个复杂的页面,一般都会有多个资源需要获取。如果是每个资源都单独建立一个TCP连接去获取,每次都需要进行三次握手建立连接来通信,这是十分耗费资源的。
随后出现了Keep-Alive
,Keep-Alive
解决的核心问题是一定时间内,同一域名多次请求数据,只建立一次HTTP请求,其他请求可复用每一次建立的连接通道,以达到提高请求效率的问题。这里面所说的一定时间一般是可以自行配置的。当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
在HTTP1.1
中是默认开启了Keep-Alive
,虽然解决了多次连接的问题,但是依然有两个比较严重的问题:
- 串行传输:在单通道传输的前提下,假设要传输10个文件,那么只能依次逐个传输,传输完第一个再传输第二个,以此类推;
- 连接数问题:HTTP/1.1 虽然默认开启
keep-alive
可以复用一部分连接,但域名分片等情况下仍然需要建立多个connection,耗费资源,给服务器带来性能压力。
作为 HTTP/1.x 的连接,请求是序列化的,哪怕本来是无序的,在没有足够庞大可用的带宽时,也无从优化。一个解决方案是,浏览器为每个域名建立多个连接,以实现并发请求。曾经默认的连接数量为 2 到 3 个,现在比较常用的并发连接数已经增加到 6 条。如果尝试大于这个数字,就有触发服务器 DoS 保护的风险。如果服务器端想要更快速的响应网站或应用程序的应答,它可以迫使客户端建立更多的连接。例如,不要在同一个域名下获取所有资源,假设有个域名是
www.example.com
,我们可以把它拆分成好几个域名:www1.example.com
、www2.example.com
、www3.example.com
。所有这些域名都指向同一台服务器,浏览器会同时为每个域名建立 6 条连接(在我们这个例子中,连接数会达到 18 条)。这一技术被称作域名分片。
**HTTP1.1中的数据传输是基于文本来进行传输的,这就需要保证在传输的过程中必须是按照文本原有的顺序进行传输。*