随着时代发展,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 通信。

image.png

Comet 的解决方法

Comet 通过延迟应答,模拟实现服务器端向客户端推送(Server Push)的方式,一旦服务器端有内容更新,则立即给客户端返回响应。

Comet 方法虽然可以做到实时更新,但它需要保留响应,导致一次连接的持续时间变长。为来维持连接势必需要消耗更多的资源。

image.png

使用浏览器进行全双工通信的 WebSocket

利用 Ajax 和 Comet 技术可以提升 Web 的浏览速度。但通信依旧基于 HTTP 协议,无法彻底解决性能瓶颈问题。WebSocket 网络技术就是为来解决这些问题而实现的一套新协议及 API。它已经变成来独立的协议标准。

WebSocket 协议

一旦 Web 服务器与客户端之间建立起 WebSocket 协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送 JSON、XML、HTML 或图片等任意格式的数据。而且它是建立在 HTTP 基础上的协议,因此连接的发起方依旧是客户端,而一旦双方建立 WebSocket 通信连接,不论是服务器还是客户端,任意一方都可直接向对方发送报文。

推送功能

即支持由服务器向客户端推送数据的推送功能。服务器可直接发送数据,而不必等待客户端的请求。

减少通信量

原则上,WebSocket 建立的连接都是长连接,它会一致保持连接状态。为来实现 WebSocket 通信,在 HTTP 连接建立之后,还需要完成一次“握手”

  • 握手·请求:利用 HTTP 的 Upgrade 首部字段建立 WebSocket 通信

    1. GET /chat HTTP/1.1
    2. Host: xxx.xx.com
    3. Upgrade: websocket
    4. Connection: Upgrade
    5. Sec-WebSocket-Key: xxxxxxxxxx // 记录握手过程中的键值
    6. Origin: http://xxx.com
    7. Sec-WebSocket-Protocol: chat,superchat // 记录使用的子协议
    8. 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 协议仅用在建立连接的过程中。

image.png

  • 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 请求和响应的首部,减少通信产生的数据包数量和发送的字节数