随着时代发展,Web 的用途更具多样性,对 HTTP 的性能要求也越来越高。HTTP 功能上的不足可通过创建一套新的协议来弥补,但目前基于 HTTP 的 Web 浏览器的使用早已遍布全球,不可能完全抛弃 HTTP。因此,有些新协议的规则是基于 HTTP 的,并在此基础上添加来新的功能。
> HTTP 2.0 已经把 SPDY 标准化,所以新版浏览普遍适用 HTTP 2.0 而不支持 SPDY
部分 HTTP 标准造成的性能瓶颈
- 一条连接上只可发送一个请求
- 请求只能从客户端开始。客户端不可以接收除响应以外的指令
- 请求/响应首部未经压缩就发送。首部信息越多延迟越大
- 发送冗长的首部。每次互相发送相同的首部造成很多性能浪费
- 可任意选择数据压缩格式。非强制压缩发送。
Ajax 的解决方法
Ajax 是利用 JavaScript 和 DOM 操作,以达到局部 Web 页面替换加载的异步通信手段。优点在于它只更新一部分页面,响应中传输的数据量相对较少。Ajax 的核心技术是名为 XMLHttpRequest 的API,通过 JavaScript 脚本语言的调用就能和服务器进行 HTTP 通信。
Comet 的解决方法
Comet 通过延迟应答,模拟实现服务器端向客户端推送(Server Push)的方式,一旦服务器端有内容更新,则立即给客户端返回响应。
Comet 方法虽然可以做到实时更新,但它需要保留响应,导致一次连接的持续时间变长。为来维持连接势必需要消耗更多的资源。
使用浏览器进行全双工通信的 WebSocket
利用 Ajax 和 Comet 技术可以提升 Web 的浏览速度。但通信依旧基于 HTTP 协议,无法彻底解决性能瓶颈问题。WebSocket 网络技术就是为来解决这些问题而实现的一套新协议及 API。它已经变成来独立的协议标准。
WebSocket 协议
一旦 Web 服务器与客户端之间建立起 WebSocket 协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送 JSON、XML、HTML 或图片等任意格式的数据。而且它是建立在 HTTP 基础上的协议,因此连接的发起方依旧是客户端,而一旦双方建立 WebSocket 通信连接,不论是服务器还是客户端,任意一方都可直接向对方发送报文。
推送功能
即支持由服务器向客户端推送数据的推送功能。服务器可直接发送数据,而不必等待客户端的请求。
减少通信量
原则上,WebSocket 建立的连接都是长连接,它会一致保持连接状态。为来实现 WebSocket 通信,在 HTTP 连接建立之后,还需要完成一次“握手”
握手·请求:利用 HTTP 的 Upgrade 首部字段建立 WebSocket 通信
GET /chat HTTP/1.1
Host: xxx.xx.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xxxxxxxxxx // 记录握手过程中的键值
Origin: http://xxx.com
Sec-WebSocket-Protocol: chat,superchat // 记录使用的子协议
Sec-WebSocket-Version: 13
握手·响应:对于之前的请求,响应状态码 101 Switching Protocols
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: xxxxxx // 记录握手请求中的 Sec-WebSocket-Key 的字段值 Sec-WebSocket-Protocol: chat,superchat // 记录使用的子协议
WebSocket 成功握手建立连接后,通过时不再使用 HTTP 的数据帧,而采用 WebSocket 独立的数据帧。HTTP 协议仅用在建立连接的过程中。
- WebSocket API
Javascript 可调用“The WebSocket API”内提供的 WebSocket 程序接口,以实现 WebScoket 协议下全双工通信
HTTP/2.0
HTTP/2.0 的目标是改善用户在使用 Web 时的速度体验。它围绕着主要的 7 项技术进行讨论。
压缩 | SPDY、Friendly |
---|---|
多路复用 | SPDY |
TLS义务化 | Speed + Mobility |
协商 | Speed + Mobility,Friendly |
客户端拉曳/服务器推送 | Speed + Mobility |
流量控制 | SPDY |
WebSocket | Speed + Mobility |
- 多路复用流:通过单一的 TCP 连接,可以无限制处理多个 HTTP 请求。所有请求的处理都在一条 TCP 连接上完成,提高 TCP 的处理效率
- 流量控制(赋予请求优先级):在发送多个请求时,解决因宽带低而导致响应变慢的问题
- 压缩 HTTP 首部:压缩 HTTP 请求和响应的首部,减少通信产生的数据包数量和发送的字节数