HTTP的基本优化
影响一个http网络请求的因素主要有两个:带宽、延迟。
带宽:如果说我们还停留在拨号上网的阶段,带宽可能会成为一个比较严重影响请求的问题,但是现在网络基础建设已经使得带宽得到极大的提升,我们不再会担心由带宽而影响网速,那么就只剩下延迟了。 延迟
- 浏览器阻塞(HOL blocking):浏览器会因为一些原因阻塞请求。浏览器对于同一个域名,同时只能有4个连接(浏览器内核不同可能会有所差异),超过浏览器最大连接数限制,后续请求就会被阻塞。
- DNS查询(DNS Lookup):浏览器需要知道目标服务器的IP才能建立连接。将域名解析为IP的这个系统就是DNS。可以利用DNS缓存来减少时间的目的。
- 建立连接(Initial connection):HTTP是基于TCP协议的,浏览器最快也要在第三次握手时才能捎带HTTP请求报文,达到真正的建立连接,但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。
HTTP 1.0
HTTP1.0最早在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上。
特点:
1.0 的HTTP版本,是一种无状态、无连接的应用层协议。HTTP 1.0 规定浏览器和服务器保持短暂的连接。
浏览器每次请求都需要与服务器建立一个TCP连接,服务器处理完以后立即断开TCP连接(无连接),服务器不跟踪每个客户端,也不记录过去的请求(无状态)。
这种无状态可以借助cookie/session机制来做身份认证和状态记录。
存在的问题:
- 无法复用连接,每次发送请求,都需要进行一次TCP连接,而TCP的连接释放过程又是比较费事的。这种无连接的特性会使得网络的利用率变低。
- 队头阻塞(head of line blocking),由于HTTP1.0规定下一个请求必须在前一个请求响应到达之前才能发送,假设前一个请求响应一直不到达,那么下一个请求就不发送,后面的请求就阻塞了。
- 不支持断点续传,也就是说,每次都会传送全部的页面和数据。
HTTP 1.1
HTTP1.1在1999年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为广泛的HTTP协议。
特点:
-
缓存处理:在HTTP1.0主要使用header里的If-Modified-Since,Expires作为缓存的判断标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。 -
带宽优化及网络连接的使用:HTTP1.0中,存在一些浪费带宽的现象。 例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。 -
错误通知的管理:在HTTP1.1 中新增了24个错误状态响应码。 如:409(Conflict)表示请求的资源与资源的当前状态发生冲突 410(Gone)表示服务器上的某个资源被永久性的删除。 -
Host头处理:在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。 但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。 HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。 -
长连接:HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟. 在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
SPDY
其实 SPDY 并不是新的一种协议,而是在 HTTP 之前做了一层会话层。
SPDY(读作“SPeeDY”)是Google开发的基于TCP的会话层 [1] 协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。 SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。 新协议的功能包括数据流的多路复用、请求优先级以及HTTP报头压缩。谷歌表示,引入SPDY协议后,在实验室测试中页面加载速度比原先快64%。
原理:
- 在SSL层上增加一个SPDY会话层,以在一个TCP连接中实现并发流。
- 通常的HTTP GET和POST格式仍然是一样的;然而SPDY为编码和传输数据设计了一个新的帧格式。
- 流是双向的,可以在客户端和服务器端启动。
- SPDY旨在通过基本(始终启用)和高级(可选启用)功能实现更低的延迟。
具体技术目标:
- 单个TCP连接支持并发的HTTP请求。
- 压缩报头和去掉不必要的头部来减少当前HTTP使用的带宽。
- 定义一个容易实现,在服务器端高效率的协议。通过减少边缘情况、定义易解析的消息格式来减少HTTP的复杂性。
- 强制使用SSL,让SSL协议在现存的网络设施下有更好的安全性和兼容性。
- 允许服务器在需要时发起对客户端的连接并推送数据。
特征:
- 复用流:SPDY允许在一个连接上无限制并发流。因为请求在一个通道上,TCP效率更高:更少的网络连接,发出更少更密集的数据包。
- 请求优先级:虽然无限的并发流解决了序列化的问题,但他们引入了另一个问题:如果带宽通道受限制,
客户端可能会因防止堵塞通道而阻止请求。为了克服这个问题,SPDY实行请求优先级:客户端从服务器端请求它希望的项目数量,并为每个请求分配一个优先级。这可以防止在网络通道被非关键资源堵塞时,高优先级的请求被挂起。 - HTTP报头压缩:SPDY压缩请求和响应HTTP报头,从而减少传输的数据包数量和字节数。
- 基于HTTPS的加密协议传输,大大提高了传输数据的可靠性。
HTTP 2.0
时间来到 2015 年,HTTP/2.0 问世。
HTTP2.0可以说是SPDY的升级版(其实原本也是基于SPDY设计的)。但是,HTTP2.0 跟 SPDY 仍有不同的地方,如下:
- HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
- HTTP2.0 消息头的压缩算法采用 HPACK http://http2.github.io/http2-spec/compression.html,而非 SPDY 采用的DEFLATE http://zh.wikipedia.org/wiki/DEFLATE
特点:
1 新的二进制格式
- HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多。
- 二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
2 多路复用
- 即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
- HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。
3 头部数据压缩
- 在HTTP1.X中,头部元数据都是以纯文本的形式发送的,通常会给每个请求增加500-8000字节的负荷。比如cookie,默认情况下,浏览器会在每次请求的时候,把cookie附在header上面发给服务器。
- HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header_files表,既避免重复header的传输,又减少了需要传输的大小。
- 高效的压缩算法可以很大的压缩header,减少发送包的数量从而降低延迟。
4 服务器推送
- 服务端推送是一种在客户端请求之前发送数据的机制。服务端推送能把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求,建立连接等操作,所以静态资源通过服务端推送的方式可以极大地提升速度。
- 网页使用了许多资源:HTML、样式表、脚本、图片等等。在HTTP1.1中这些资源每一个都必须明确地请求。这是一个很慢的过程。浏览器从获取HTML开始,然后在它解析和评估页面的时候,增量地获取更多的资源。因为服务器必须等待浏览器做每一个请求,网络经常是空闲的和未充分使用的。
- 为了改善延迟,HTTP2.0引入了server push,它允许服务端推送资源给浏览器,在浏览器明确地请求之前,免得客户端再次创建连接发送请求到服务器端获取。这样客户端可以直接从本地加载这些资源,不用再通过网络。
HTTP 3.0
基于Google的QUIC,HTTP3 背后的主要思想是放弃 TCP,转而使用基于 UDP 的 QUIC 协议。
|