1. WebSocket 概念
WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议。意为:经过一次 TCP 握手就可以直接创建持久性连接,进而可实现服务端和客户端双向数据传输。Websocket 的协议标识是 ws 和 wss。
Websocket 的应用场景:
- 在线聊天
- 协作文档编辑
- 大型多人在线游戏
- 股票交易应用
- WebRTC
2. 为什么需要 WebSocket 协议
2.1 WebSocket 的出现主要是为了弥补 HTTP 半双工通信的缺陷。
在 Websocket 没有出现之前,为了让 HTTP 能够实现即时通信,前辈们也做了一些研究,常用的有三种方法:
1. HTTP 轮询
HTTP 轮询(polling):在固定的时间间隔,由浏览器向服务器发起 HTTP 请求,无论服务器中的数据有没有更新,都会给客户端作出响应。
但如果知道信息交付的精确间隔,那么轮询也是一个好的方案,但对于一些实时的数据是不能预测的,所有就会导致发出一些不必要的请求。
2. 长轮询
长轮询(long polling):客户端向服务端请求信息,并在设定的时间段内打开一个连接。服务器如果没有任何信息,会保持请求打开,直到有客户端可用的信息,或者直到指定的超时时间用完为止。
长轮询中客户端必须频繁地重连到服务器以读取服务端的信息,会增大服务端到压力。
3. 流化技术
客户端向服务端发起一个长连接请求,服务端收到请求后响应它并不断更新连接状态,以确保连接在客户端与服务端之间一直有效。服务端可以通过这个连接将数据主动推送到客户端。
但存在一个问题:每当服务器有需要交付给客户端的信息时,它就会更新响应,但是服务器从不发出完成 HTTP 响应,从而导致连接一直打开,在这种情况下,代理和防火墙可能会缓存一个响应,就会导致信息交付的延迟增加。
以上三种方法都实现了近乎实时的通信,但都涉及 HTTP 请求和响应,当然也包含了许多附加和不必要的延迟,此外,在每一种情况下,客户端必须主动给服务器发送消息,且客户端都必须等待请求返回,才能发出后续的请求,再一次增加了延迟。
2.2 Websocket 与 HTTP 有着良好的兼容性
默认端口是 80 和 443, 并且握手阶段采用 HTTP 协议,因此握手的时候不容易屏蔽,能通过各种的 HTTP 代理。
3. WebSocket 通信原理
以七牛 WebRTC Demo 为例: