HTTP协议的瓶颈
为了让用户及时看到最新的消息,服务端一有更新就需要直接反馈到客户端,若想实现,那么HTTP标准则会成为瓶颈!
HTTP协议的瓶颈
- 一次连接只能发送一条请求。
- 请求只能从客户端发出,服务端不可以接受响应以外的指令。
- 请求/响应未经过压缩就直接发送,头部信息越多延迟越大。
- 发送冗长的头部,每次相同的头部造成的浪费较多。
- 可任意选择压缩格式。不强制压缩。
Ajax的解决办法
Ajax只请求部分内容,响应中传输的数据会因此减少,但是实时的获取内容依旧会产生大量的请求,所以Ajax实质上并没有解决HTTP协议的瓶颈问题。
Comet的解决办法
Comet发送请求之后会先将响应挂起,等服务端有更新之后在返回响应。这是一种通过延迟应答来实现服务端向客户端推送内容的策略(`server push`)。
但是客户端为了维持连接会消耗更多的资源,所以Comet也没有解决HTTP协议的瓶颈问题。
使用浏览器进行双工通信的WebSocket
WebSocket技术是为了解决
Ajax
和Comet
里XMLHttpRequest
隐患带来的问题而产生的。
WebSocket 协议
一旦服务端与服务端建立起`WebSocket`协议的通信,之后一切的通信都依靠这个专用的协议进行。
通信过程中可以发送JSON、XML、HTML或图片等任意格式的数据
WebSocket 功能
- 推送
服务端可以主动推送数据给客户端 - 减少通信量
只要建立起WebSocket通信,便一直保持连接减少了不必要的开销。另外头部相对于HTTP头部来说小很多。
为了实现WebSocket通信,在HTTP建立连接之后需要进行一次握手(HandShaking
)。
握手-请求
- 需要在
Upgrade
头部字段中声明WebSocket
告知服务器协议发生变化。 Sec-WebSocket-Key
记录着握手过程中必不可少的键值。Sec-WebSocket-Protocol
记录使用的子协议。
子协议按WebSocket
协议标准在连接分开使用时,定义哪些连接的名称。
握手-响应
- 对于之前的响应返回101(
Switching Protocol
)响应。 Sec-WebSocket-Accpet
是由请求头中的Sec-WebSocket-key
字段的值生成的。