一、HTTP的基本优化
影响一个 HTTP 网络请求的因素主要有两个:带宽和延迟。
带宽:如果说我们还停留在拨号上网的阶段,带宽可能会成为一个比较严重影响请求的问题,但是现在网络基础建设已经使得带宽得到极大的提升,我们不再会担心由带宽而影响网速,那么就只剩下延迟了。
-
延迟:
-
浏览器阻塞(HOL blocking):浏览器会因为一些原因阻塞请求。浏览器对于同一个域名,同时只能有 4 个连接(这个根据浏览器内核不同可能会有所差异),超过浏览器最大连接数限制,后续请求就会被阻塞。
-
DNS 查询(DNS Lookup):浏览器需要知道目标服务器的 IP 才能建立连接。将域名解析为 IP 的这个系统就是 DNS。这个通常可以利用DNS缓存结果来达到减少这个时间的目的。
-
建立连接(Initial connection):HTTP 是基于 TCP 协议的,浏览器最快也要在第三次握手时才能捎带 HTTP 请求报文,达到真正的建立连接,但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。
所以http1.1是长连接,能在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟
-
二、HTTP1.0和HTTP1.1的一些区别
- 长连接
- Host头处理:
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。 但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。 HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
- 节约带宽:
HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能。 HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
-
缓存处理:
在HTTP1.0中主要使用Last-Modified和If-Modified-Since,Expires来做为缓存判断的标准。 HTTP1.1则引入了更多的缓存控制策略例如ETag和If-None-Match,Cache-Control等更多可供选择的缓存头来控制缓存策略。 原因:如果本地打开缓存文件,即使没有对文件进行修改,但还是会造成 Last-Modified 被修改, 服务端不能命中缓存导致发送相同的资源, 所以可以直接根据文件内容是否修改来决定缓存策略,故在 HTTP / 1.1 出现了 ETag 和If-None-Match
三、 HTTP 1.1、HTTP2.0主要区别
- 多路复用
HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。 当然HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。
-
数据压缩
HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。
-
服务器推送
当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端, 免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。 服务器端推送的这些资源其实存在客户端的某处地方(浏览器缓存),客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。
四、
- 带宽:所以1.1节约带宽,只要要求的一部分;2.0进行数据压缩
- 浏览器堵塞:所以2.0有了多路复用,能并发处理多个请求
- 建立连接:所以1.1有长连接,一个连接能发多次请求
- 缓存:1.1协商缓存更准确;2.0的服务端推送也是利用缓存
- host头:这是因为存在虚拟机,要不然会报错