什么是持久连接?
http1.1之前,每次http请求都需要三次握手建立TCP连接、发送请求、断开连接这个过程。http1.1引入了持久连接,在一个TCP连接上可以进行多个http请求,只要浏览器或者服务器没有明确提出断开,TCP连接就会一直保持。
域名分片技术
http1.1中规定一个域名最多建立6个TCP持久连接,为了加速页面资源的下载速度,可以将页面资源存放在多个不同域名下,开启多个TCP连接并行下载资源
http1.1存在哪些问题?
http1.1的最大问题是带宽占用不足,主要有以下原因:
- TCP慢启动:为了减少网络拥堵,TCP在建立连接开始传送数据时并不会立刻就达到最大速度,而是先以一个很小的速度传输,随后速度不断增加,直到达到一个稳定速度。现在网络中关键资源通常都不太大,但是因为慢启动导致关键资源的下载被耽误,导致首屏渲染时间被延长
- TCP通道抢占带宽:多个TCP连接开启后会互相争抢带宽,而有些TCP通道上传输的是关键资源,但是TCP内部无法协商,导致关键资源下载速度不理想
- http1.1的队头阻塞:http1.1中,在一个TCP管道中同一时刻只能处理一个http请求,如何一个请求没有响应,那么后续的请求都会被阻塞。虽然google提出过管线化技术,浏览器可以批量将请求发给服务器,但是服务器依然要按照先后顺序响应,所以依然存在阻塞问题
http2和http1.1主要区别
http2的多路复用
所谓的多路复用,是指一个tcp管道同一时刻可以同时传输多个http请求(流)。虽然http1.1通过持久连接可以在一个tcp管道中传输多个http请求,但是同一时刻只能传输一个请求。实现多路复用主要是依靠在http应用层和传输层之间增加一个二进制分帧层,所有请求在被发送之前都要被转换为一个个带有id编号的的帧,再通过协议栈将这些帧发送出去。接收端接收到这些帧以后,会根据id将同一个流的帧按照顺序组装成完整的数据交给应用层。
为什么http1.1不能实现多路复用
因为http1.1是基于文本传输的,如果采用多路复用,由于没有流的概念,接收端无法确认数据属于哪个请求。