网页加速速度快慢的影响可以从数据中看出:
网页加载超过4秒,25%人会放弃;手机网页超过10秒,50%用户会放弃,60%人不再返回;Google搜索结果慢0.4秒,一天搜索量减少800万次;40%移动购物者会放弃加载时间超过3秒的网站;亚马逊每天销售额约6700万美元,网页延迟1秒可导致全年损失16亿美元。
谷歌针对网页加载速度的问题,对HTTP协议进行改进,提出了一种SPDY的协议,下面简要说说这种协议。
概要:
作为以 "Let's make the web faster"为起点的一部分,我们试验一种替代的协议来降低网页的延迟。这些试验的其中一个就是SPDY,SPDY是一种应用层协议用来在网页上传输内容,它主要用来降低延时。除了制定该协议,google 还开发了一种支持SPDY的chrome浏览器以及开源的web server。在实验室测试中,我们比较了SPDY和HTTP的性能,而且观测到在网页加载时间上,SPDY相比HTTP能够降低64%。我们希望能够有更多的开源社区来贡献想法,提供反馈以及测试结果,从而让下一代应用协议使得网页更快。
背景:网络协议与网络延时
现在,HTTP和TCP是web的两种协议。TCP是一般的,可靠的传输层协议,能够提供可靠的传输,避免出错,按顺序传输,流量控制,冲突避免以及其他的传输特性。而HTTP是一种应用层协议,提供记本的连接、响应语法。我们可能有机会在传输层提高延时性能,但是我们最开始的调查还是关注在应用层,即HTTP。
不幸的是,HTTP并不是为了时延而设计的。进一步说,现在的网页传输与10年前的网页有着典型的不同,因而需要改进在开发HTTP协议时没有提前注意到的地方。下面是HTTP协议可以优化的地方:
1.每个连接多需要请求;因为HTTP只能一次取得一个资源(HTTP采用了流水线,但仍然是采用FIFO队列),服务器延时500ms来阻止其他请求重用TCP信道。浏览器使用了多连接来解决这个问题。直到2008年,大部分浏览器才最终从每个域名2个连接发展到每个域名6个连接。
2.额外的初始客户请求;在HTTP协议中,只有客户端能初始化一个请求。尽管服务器知道客户端需要资源,但是它没有机制来通知客户端,而且必须等待客户端发来资源请求。
3.未压缩的请求以及响应头部。现在请求头部的大小从200bytes到2kb不等。当应用使用更多的cookies以及用户代理扩展特性时,典型的头部大小是700-800bytes。对于ADSL或者modems连接,上行的带宽相对较低,因此延时比较明显。在头部减少数据能够在发送请求时直接提高串行化的延时。
4.冗余的头部。有一些头部在同一个信道的请求中多次发送。然而,例如用户代理、主机以及接收的头部一般是固定的,而且不需要重复发送。
5.优化数据压塑。HTTP使用了数据优化压缩编码。内容总是以一种压缩的形式来发送。
过往的方法:
SPDY不是唯一的让HTTP更快的研究。这里有其他的方案来解决网络延时,大部分都是在传输层或者会话层。
1.流控制传输协议(tream Control Transmission Protocol (SCTP))——一种用来取代TCP的传输层协议,能够提供多数据流以及流感知冲突控制。
2.HTTP over SCTP——在SCTP的基础上运行HTTP协议。在高延时网络中比较HTTP over SCTP和HTTP over TCP(Comparison of HTTP Over SCTP and TCP in High Delay Networks)中描述了传输协议的性能对比研究。
3.结构化的流传输(Structured Stream Transport (SST))——采用结构化的流的协议:在一种普通的传输协议上加载轻量、独立的流。它取代了TCP或者是运行在UDP协议的上层。
4.MUX和SMUX——中间层协议(即在应用层和传输层之间的协议)能够提供多种流服务。这种协议与HTTP/1.1使用的时间差不多。
上面的方法能够解决一些网页延时问题,但不能解决所有的。不管HTTP使用的是什么传输层协议,HTTP存在的内在问题(压缩、优先次序等)应该得到解决。在任何情况下,在实际的情形中,改变传输层是比较困难的。因此,我们相信在应用层解决这些缺陷是比较容易的。这样尽可能较小的改变现有的基础设施,以及能够获得显著的性能改善。
SPDY的目标:
SPDY的目标是定义和实现一种能够降低延时而服务于网页的应用层协议。SPDY的主要目标是:
1.在网页加载时间上降低50%的时间。我们的预期结果基本上接近这个目标。
2.尽可能减少铺设复杂度。SPDY使用TCP协议作为其传输层协议,因此不需要对现有的基础设施进行任何改变。
3.避免改变网站作者的内容。支持SPDY需要的唯一的改变是客户使用代理以及网络服务器应用。
4.吸引有志向相同的组织,一起来开发协议解决延时问题。我们希望与开源社区和工业组织一起来开发这种新的协议。
一些具体的技术目的有:
1.在单个TCP会话上允许更多的并行HTTP请求;
2.通过压缩HTTP头部以及减少不必要的头部信息来减少带宽;
3.定义一种容易实现以及服务器有效的协议。我们希望通过砍掉边界情况来降低HTTP的复杂性,以及定义容易解析的消息格式;
4.为了在现有的网络基础设施上提供更安全和兼容性,让SSL作为底层传输协议。尽管SSL引入了时延,我们相信未来的网页更加依赖于安全的网络连接。除此之外,确保现有的代理间的通信不会断裂,使用SSL是必须的。
SPDY设计及其特点
SPDY在允许多并行的SSL上添加了会话层,在单个TCP连接上添加交叉流。而且一般的HTTP 的GET和POST消息格式仍然一样。然而,SPDY给有线的数据传输和编码指定了一种新的框架格式。
流数据是双向的,例如在客户端和服务器都能够初始化。
SPDY的目的是通过基本和高级的特征来获得低时延。
基本特征:
1.多路复用流:SPDY允许在单个TCP连接上使用没有限制的并行流。因为在单个信道上,请求是交叉的,TCP的效率更高:更少的网络连接以及更少但高密度的数据包;
2.请求优先级:尽管非限制的平行流解决了串行问题,但SPDY引入了另外一种方法:如果信道的带宽受限,客户端可能因为防止阻塞信道而阻断请求。为了克服这种问题,SPDY实现了请求优先级:客户端能够向服务器请求它想要的多种条目,以及给每个请求分配优先级。当一种较高优先级的请求未解决时,能够有效防止了网络信道在非重要资源发送冲突。
3.HTTP头部压缩:SPDY对HTTP请求以及响应的头部进行压缩,实现更少的数据包以及更少的比特传输。
高级特征:
除了上面的基本特征外,SPDY提供一些高级特征,服务器端发起的流。它能够在客户端没有请求发送内容的时候发送内容给客户端(Server-initiated streams can be used to deliver content to the client without the client needing to ask for it.)。web开发者可以有下面两种方式来设置:
1.服务器推送:SPDY通过X-Associated-Content header使得服务器将数据传输给客户端。X-Associated-Content header在客户端没有请求数据时,通知客户端服务器有数据发送给客户端。对于页面发起的下载(例如用户第一次访问站点),这能显著提高用户体验。
2.服务器暗示:与自动推送资源给客户端不一样,在服务器提前知道客户端需要某个资源的情况下,,服务器使用X-Subresources header 来建议客户端是否请求该资源。然而,服务器在客户端发送请求之前仍然等待发送内容。
对于技术细节,可以参考SPDY draft protocol specification.
预期目标:
表1.全球前25个网站的平均网页加载时间
表2.全球前25个网站在丢包率的基础上的平均网页加载时间
表3.全球前25个网站的平均网页加载时间(RTT)