基于HTTP的功能追加协议
HTTP的瓶颈
使用HTTP
协议探知服务器上是否有内容更新,就必须频繁地从客户端到服务器端进行确认。如果服务器上没有内容更新,那么就会产生徒劳的通信。
若想在现有Web
实现所需的功能,以下这些HTTP
标准就会成为瓶颈:
- 一条连接上只可发送一个请求(前面讲到,持久化可保持
TCP
连接状态,但仍完成一次请求/响应后才能进- 行下一次请求/响应,而管线化方式可让一个TCP
连接并行发送多个请求。) - 请求只能从客户端开始。客户端不可以接收除响应以外的指令
- 请求/响应首部未经压缩就发送。首部信息越多延迟越大
- 发送冗长的首部。每次互相发送相同的首部造成的浪费较多
- 可任意选择数据压缩格式。非强制压缩发送
Ajax的解决方法
Ajax
(Asynchronous JavaScript and XML,异步JavaScript
和XML
技术)是一种有效利用JavaScript
和DOM
的操作,以达到局部Web
页面替换加载的异步通信。
Comet的解决办法
通常,服务器接收到请求,在处理完毕后就立即返回响应,但为了实现推送功能,Comet
会先将响应置于挂起状态,当服务器端有内容更新时,再返回该响应。
内容上虽然可以做到实时更新,但为了保留响应,一次连接的持续时间也变长了。期间,为了维持连接会消耗更多的资源。另外,Comet
仍未解决HTTP
协议的本身存在的问题。
SPDY
Google
在2010年发布了 SPDY,
其开发目标旨在解决HTTP
的性能瓶颈,缩短Web页
面的加载时间。 SPDY
没有完全改写HTTP
协议,而是在TCP/IP
的应用层与运输层之间通过新加会话层的形式运作。
同时,考虑到安全性问题,SPDY
规定通信中使用SSL
。
SPDY
以会话层的形式加入,控制对数据的流动,但还是采用HTTP建立通信连接。因此,可照常使用HTTP
的GET
和POST
等方法、Cookie
以及HTTP
报文等。
使用 SPDY
后,HTTP
协议额外获得以下功能。
- 多路复用流:通过单一的
TCP
连接,可以无限制处理多个HTTP
请求。所有请求的处理都在一条TCP
连接上完成,因此TCP
的处理效率得到提高。 - 赋予请求优先级:
SPDY
不仅可以无限制地并发处理请求,还可以给请求逐个分配优先级顺序。这样主要是为了在发送多个请求时,解决因带宽低而导致响应变慢的问题。 - 压缩
HTTP
首部:压缩HTTP
请求和响应的首部。 - 推送功能:支持服务器主动向客户端推送数据的功能。
- 服务器提示功能:服务器可以主动提示客户端请求所需的资源。由于在客户端发现资源之前就可以获知资源的存在,因此在资源已缓存等情况下,可以避免发送不必要的请求。
使用浏览器进行全双工通信的 WebSocket
什么是全双工通信?
简单的说:
单工通信就是只能从A到B,如[广播]
半双工通信是A到B,B到A都行,但不能同时进行.如[对讲机]
全双工通信是A到B,B到A都行,可以同同时进行.如[电话]
利用Ajax
和Comet
技术进行通信可以提升Web
的浏览速度。但问题在于通信若使用HTTP
协议,就无法彻底解决瓶颈问题。
WebSocket
技术主要是为了解决Ajax
和Comet
里XMLHttpRequst
附带的缺陷所引起的问题。
一旦Web
服务器与客户端之间建立起WebSocket
协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON
、XML
、HTML
或图片等任意格式的数据。
WebSocket
的主要特点:
- 推送功能:支持由服务器向客户端推送数据。(解决服务器的被动性)
- 减少通信量:和
HTTP
相比,不但每次连接时的总开销减少,而且由于WebSocket
的首部信息很小,通信量也相应较少。
为了实现WebSocket
通信,在HTTP
连接建立之后,需要完成一次“握手”的步骤。
- 握手·请求:为了实现
WebSocket
通信,需要用到HTTP
的Upgrade
首部字段,告知服务器通信协议发生改变,以达到握手的目的。 - 握手·响应:对于之前的请求,返回状态码
101 Switching Protocols
的响应。
成功握手确立WebSocket
连接后,通信时不再使用HTTP
的数据帧,而采用WebSocket
独立的数据帧。
由于是建立在HTTP
基础上的协议,因此连接的发起方仍是客户端,而一旦确立WebSocket
通信连接,不论服务器端还是客户端,任意一方都可直接向对方发送报文。
握手请求:
GET /chat HTTP/1.1
Host: server.example.com
//告诉服务器我使用的是websocket连接
Upgrade: websocket
Connection: Upgrade
//验证请求,浏览器生成
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
服务器返回:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat