1. HTTP的基本优化方向
影响一个HTTP网络请求的因素主要有2个:带宽和延迟
- 带宽,如果我们还在拨号上网的时代,那么带宽是一个比较重要的制约因素。但是现在的网络建设使得带宽得到很大的提升,我们不会担心带宽而影响网速。
- 延迟
- 浏览器阻塞(HOL blocking):浏览器会因为一些原因阻塞请求。浏览器对于同一个域名,只能同时有4个连接(这个根据浏览器内核不同可能会有所差异),超过浏览器最大连接数限制,后续请求就会被阻塞
- DNS查询(DNS lookup):浏览器需要知道目标服务器的IP才能建立链接。将域名解析为IP的这个系统就是DNS。这个通常可以利用DNS缓存来达到减少时间的目的。
- 建立连接(Initial connection):HTTP是基于TCP来写一的,浏览器最快要再第三次握手时才能捎带HTTP请求报文,达到真正的建立连接,但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的情况下影响比较明显,而慢启动对文件类大请求影响较大
2. http1.0和http1.1的区别
主要区别体现在缓存处理:
1⃣️缓存处理。
在http1.0中主要使用header的if-modified-since/expires来做缓存的判断依据。
http1.1引入了更多的缓存策略控制策略。比如Entity tag,If-Unmodified-Since,If-match,If-None-Match等更多可供选择的缓存头来控制缓存。
2⃣️带宽优化及网络连接的使用。
HTTP1.0中存在一些浪费带宽的现象。例如客户端只需要某个对象中的一部分,服务器端却把整个对象送过来了,并且不能支持断点续传的功能。
HTTP1.1在请求头中引入了range头域,它允许只请求资源中的某一部分,即返回码是206(partial content)。方便开发者的自由选择、节省带宽。
3⃣️错误通知的管理。
在HTTP1.1中新增了24个错误状态响应码。如409(conflict)表示请求的资源与资源当前的状态发生冲突,401(gone)表示服务器上的资源被永久的删除。
4⃣️host头处理。
在HTTP1.0中认为每一个服务器都绑定一个ip地址,因此请求消息头中并没有传递主机名(hostname)。
但是随着虚拟主机技术的发展,在一台物理服务器上可以存在多台虚拟主机,并且他们共享一个ip地址。
HTTP1.1中请求和响应都支持host头域,且请求消息中如果没有host头域会报错(400bad request)
5⃣️长链接
HTTP1.1支持长链接和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立多个连接的消耗和延迟。在HTTP1.1中默认打开onnection:keep-alive,在一定程度上弥补了http1.0每次请求都要重新连接的缺陷。
3. HTTPS和HTTP的区别
- HTTPS需要到CA申请证书,免费证书很少,一般需要收费
- HTTP协议运行TCP之上,所有传输的内容都是明文的,HTTPS运行在SSL/TLS上,SSL/TLS运行在tcp上,所有传输的内容都是加密的。
- HTTP和HTTPS用的是完全不同的连接方式,端口也不同。前者是80,后者是443。
- HTTPS可以有效的防止运营商劫持,解决了防劫持的一大问题。
HTTPS与HTTP最大的差距就是,HTTPS是运行在SSL/TLS之上,而SSL/TLS运行在tcp上。
4. SPDY:HTTP1.x的优化
SPDY优化了HTTP1.x的请求延迟,解决了HTTP1.x的安全性
- 降低延迟
针对HTTP高延迟的问题,SPDY采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking问题,降低了延迟同时提高了带宽的利用率。 - 请求优先级
多路复用带来一个新的问题是,在连接共享的基础之上有可能导致关键请求被阻塞。SPDY允许给每个请求设置优先级,重要的请求就会优先得到响应。 - header压缩
HTTP1.x的header很多都是重复多余的。选择合适的压缩算法可以减少包的大小和数量。 - 基于HTTPS的加密协议传输
提高传输数据的可靠性 - 服务端推送(server push)
采用了SPDY的网页,例如网页中有一个style.css的请求,爱客户端收到style.css数据的同时,服务端会将style.js的文件推给客户端。当客户端收到再次尝试style.js的时候就可以直接读取缓存,不用再发送请求。
SPDY的构成图
SPDY的构成图
SPDY位于HTTP之下,TCP和SSL之上,这样就可以轻松兼容老版本的HTTP协议,同时可以使用已有的SSL功能
5. HTTP2.0性能惊人
HTTP2的性能比HTTP1.1好很多,这里是Akamai公司的一个官方演示
6. HTTP2.0: SPDY的升级版
HTTP2.0可以说是SPDY的升级版(原本也是基于SPDY设计的),但是两者还是有一些区别:
- HTTP2.0支持明文HTTP传输,而SPDY强制使用HTTPS(加密传输)
- HTTP2.0消息头的压缩算法才有HPACK, SPDY采用的是DEFLATE
7. HTTP2.0和HTTP1.X相比的新特性
- 解析格式不同,http2.0是采用二进制格式
HTTP1.X的解析是基于文本,基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮要考虑的场景必然很多。
HTTP2.0采用的是二进制格式,只认0和1的组合。实现方便且健壮 - 多路复用,即连接共享
HTTP2.0每一个request都是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的id将request再归属到不同的服务端请求里面、
-- header压缩
HTTP1.X的header里面带有大量的信息,每次请求都要重复发送。
HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,即避免了重复header的传输,又减少了需要传输的大小。 - 服务端推送(server push)
8. HTTP2.0的升级改造
- 前文说了HTTP2.0其实可以支持非HTTPS的,但是现在主流的浏览器像chrome、firefox表示还是只支持基于TLS部署的HTTP2.0协议,所以想升级成HTTP2.0还是先升级成HTTPS
- 当网站升级成HTTPS之后,升级成HTTP2.0就简单很多,如果使用nginx只要在配置文件中启用相应的协议即可。
- 使用了HTTP2.0之后原本的HTTP1.X不用担心。因为HTTP2.0完全兼容HTTP1.X的语义,对于不支持HTTP2.0的浏览器。nginx会自动向下兼容。
HTTP2.0的多路复用和HTTP1.X的长连接复用有什么区别
- HTTP/1.X一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接。
- HTTP1.1 pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞。
-
HTTP/2多个请求可能在同一个连接上并行执行。某个请求任务耗时严重,不会影响到其他连接的正常执行、
HTTP1.1和HTTP2.0
服务器推送是什么?
服务器推送能把客户端所需要的资源伴随index.html一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求,建立连接等操作,所以静态资源通过服务器推送的方式可以极大地提升速度。
为什么需要头部压缩
假定一个页面有100个资源需要加载,每一次请求都有1kb的消息头,则至少需要消耗100kb来获取这些请求头。HTTP2.0维护一个字典,差量更新HTTP头部,大大降低因头部传输产生的流量。
HTTP2.0多路复用
HTTP优化的性能并不在于高带宽,而是低延迟。TCP连接会随着时间进行自我调谐,起初会限制连接的最大速度,如果数据传输成功,会随着时间的推移提高传输的速度。这种调谐叫做TCP的慢启动。由于这种原因,让原本就具有突发性和短时性的HTTP连接变得十分低效。
HTTP/2让所有的数据流共用同一个连接,可以更有效地使用TCP连接,让高带宽也能真正的服务于HTTP的性能提升。
网友评论