文章目录
- 1. 背景
- 2. SPDY 之前
- 3. SPDY 项目目标
- 4. SPDY 功能特点
- 4.1 SPDY基本功能
- 4.2 SPDY高级功能
1. 背景
TCP
是通用的、可靠的传输协议,提供保证交付、重复抑制、按顺序交付、流量控制、拥塞避免和其他传输特性。
HTTP
是提供基本请求/响应语义的应用层协议。
不幸的是,HTTP并不是特别为延迟设计的。比如我们要访问一个网站,当我们浏览器输入网址例如 www.baidu.com
回车之后,浏览器需要请求多个资源,然后再渲染展示。
HTTP要求每个资源就要创建一个HTTP请求,即使使用HTTP管道,仍然需要按照FIFO队列来执行,服务器延迟又阻止了TCP通道的请求重用。最终只能让浏览器通过使用多个连接来解决这个问题。最开始浏览器默认每个域2个连接,后来扩展到6个连接。
在HTTP中,只有客户端可以发起请求,即使服务器知道客户端需要某个资源,它也没有机制通知客户端,必须等待从客户端接收到资源的请求。
此外,HTTP header大小逐渐变大, HTTP header 大小从200字节到2KB不等,随着应用程序使用更多的cookie和代理扩展功能,700-800字节的header大小越来越常见。减少header可以直接改善发送请求的序列化延迟,同时例如 User-Agent \ Host \ Accept 等静态头部其实并不需要在同一通道上反复发送。
此外TCP 的head of line blocking问题,TCP要求数据接收必须是有序的,中间的一次失败就会阻塞后面所有的数据包接收。
基于以上问题,Google开发SPDY协议,旨在通过减少网络延迟来提高Web页面的加载速度。它是一种基于TCP
的应用层协议,旨在优化HTTP协议的性能。
SPDY的主要特点包括:
- 多路复用:允许在一个SPDY连接内有无限个并行请求,这样可以共享一个TCP会话进行多个HTTP请求,从而减少消息交互往返的时间和延迟。
- 请求优先级:可以设置优先级,选择性地传输更重要的资源,如CSS和JavaScript,然后是其他资源。
- HTTP头部压缩:删除不必要的头信息,通过压缩减少数据传输所带来的等待时间和带宽。
- 服务器推送技术:服务器可以主动向客户端发送数据,这种预加载可以使用户一直保持一个快速的网络。
SPDY协议不是用于替代HTTP的协议,而是对HTTP协议的增强。它通过实现多路复用、请求优先级、头部压缩和服务器推送等功能,提高了网页加载速度,同时也减少了延迟。
随着时间的推移,SPDY协议已经成为了HTTP/2的基础,并在多个浏览器和服务器上得到了广泛支持。
2. SPDY 之前
在SPDY协议之前,还有其他协议来解决网络延迟,只是他们大多处在传输层或会话层:
- Stream Control Transmission Protocol(SCTP) 用于替代TCP的传输层协议,提供多路复用流和流意识的拥塞控制。
- HTTP over SCTP:一种让HTTP在SCTP上运行的协议
- Structured Stream Transport (SST),一种创建“结构化流”的协议,是一种清凉、独立的用于在普通传输层上运行的协议。可以替代TCP或者运行在UDP上。
- MUX/SMUX,结余传输层和应用层之间的协议,它提供了流的多路复用。
这些都提供了解决一些互联网延迟问题的方法,但由于HTTP中的问题(压缩、优先级等)仍然需要解决,这与底层的传输层协议无关。从实际上讲,改变传输层是非常难以部署的。
3. SPDY 项目目标
SPDY项目定义并实现了一个应用层协议,用于大幅度减少网络的延迟。SPDY的High Level 目标包括:
- 目标是减少50%的页面加载时间。
- 最小化部署复杂性。SPDY使用TCP作为底层传输层,因此不需要对现有网络基础设施进行任何更改。
- 避免需要网站作者对内容进行任何更改。支持SPDY所需的唯一更改是在客户端用户代理和Web服务器应用程序中。
4,. 聚集志同道合的团体,期望与开源社区和行业专家合作开发这一新协议。
一些具体的技术目标包括:
- 允许许多并发的HTTP请求在单个TCP会话中运行。
- 通过压缩头部和消除不必要的头部来减少HTTP当前使用的带宽。
- 定义一个易于实现且对服务器高效的协议。我们希望通过减少边缘情况和定义易于解析的消息格式来降低HTTP的复杂性。
- 使SSL成为底层传输协议,以获得更好的安全性和与现有网络基础设施的兼容性。尽管SSL确实引入了延迟后果,但相信网络的长期未来取决于安全的网络连接。此外,使用SSL是必要的,以确保跨现有代理的通信不被破坏,尽可能地使服务器能够启动与客户端的通信并向客户端推送数据。
4. SPDY 功能特点
SPDY 在SSL上添加了一层应用会话层,从而允许多个并发且交织的流在单个TCP上运行,HTTP的标准Get和Post消息保持不变,但是SDPY定义了一个新的编码方式并通过电缆传输这些数据。
流是双向的,既可以被客户端初始化,也可由服务端初始化。
4.1 SPDY基本功能
多路复用流
SDPY 允许无线数量的并发流在单个TCP连接上运行,TCP效率大大提升,需要建立的网络连接减少,也减少需要发送的包的数量。
请求优先级
虽然无限数量的并发流解决了序列化问题,但它们引入了另一个问题:如果通道上的带宽受限,客户端可能会阻止请求,以免塞满通道。
为了克服这个问题,SPDY实现了请求优先级:客户端可以从服务器请求任意数量的资源,并为每个请求分配优先级。
这样可以防止在高优先级请求待处理时,通道被非关键资源所塞满。
HTTP头部压缩
SPDY压缩请求和响应的HTTP头部,导致发送的包较少,传输的字节数也减少。
4.2 SPDY高级功能
SPDY提供了一个高级的功能,即服务器启动的流。
服务器启动的流可以用来向客户端发送内容,而不需要客户端请求。
可以由网页开发者通过以下两种方式配置:
- 服务器推送
它允许服务器通过X-Associated-Content标头向客户端推送数据。
这个标头告知客户端,服务器正在向客户端推送资源,而客户端还没有请求它。
对于首次下载页面(例如,用户第一次访问网站时),这可以极大地提升用户体验。
- 服务器提示
相反于自动向客户端推送资源,当服务器知道客户端将需要这些资源时,服务器使用X-Subresources标头向客户端建议它应该请求特定资源。
然而,服务器仍然会等待客户端的请求才发送内容。
在慢链接上,这个选项可以减少客户端发现需要资源所需的时间几百毫秒,并且可能更适合非首次页面加载。