一、WebScoket 的定义
WebScoket 是一种在单个 TCP 连接上进行全双工通信的协议。与 HTTP 不同,它以 ws:// 或 wss:// 开头(分别表示 WebScoket 和安全 WebScoket 连接)。一旦通信连接建立和连接打开后,消息交换将以双向模式进行,不必在浏览器(客户端)发送 request 之后服务器才能发送信息到浏览器,这时候服务器有主动权,可以随时发消息给浏览器(客户端),客户端和服务器之间的连接也会持续存在,直到其中任何一方(客户端或服务器)宕掉或主动关闭连接,双方才关闭连接。
二、为什么使用 WebScoket
因为 HTTP 协议做不到服务器主动向客户端推送信息,即不能实现双向对话的功能。之前使用 "轮询" 的方式:每隔一段时间就向服务器发送一个询问,了解服务器有没有新的信息。这种方式效率低又浪费资源。而 WebScoket 只要和服务器三次握手成功后就可以进行双向通信,使服务器避免打开多个 HTTP 连接进行工作,提高了工作效率和资源利用率。
WebScoket 特点:
- 建立在 TCP 协议之上,服务器端的实现比较容易
- 与 HTTP 协议有着良好的兼容性。默认端口也是 80 和 443,并且握手阶段采用 HTTP 协议,不容易屏蔽,能通过各种 HTTP 代理服务器
- 数据格式比较轻量,性能开销小,通信高效
- 可以发送文本,也可以发送二进制数据
- 没有同源限制,客户端可以与任意服务器通信
- 协议标识符是 ws 或 wss
三、WebScoket 的实现原理
首先还是由客户端发起 HTTP 请求,经过 3 次握手后,建立起 TCP 连接,HTTP 请求里存放了 WebScoket 支持的版本号等信息,如: Upgrade、Connect、WebScoket-Version 等,其中还有一个请求头 Sec-WebScoket-Key,这是客户端使用 base64 编码的 24 位随机字符序列,用于服务器标识当前连接的客户端,同时也要求服务器响应一个同样加密的 Sec-WebScoket-Accept 头作为应答,这个用于给客户端标识当前连接的服务器,只有当两者匹配,连接才算建立成功(服务器响应101状态码表示连接成功),最后借助于 TCP 传输信道进行全双工通信。
四、WebScoket 与 http 的相同点
- 都是基于 TCP 协议,都需要三次握手建立连接,都是可靠传输协议
- 都是应用层协议
五、WebScoket 与 http 的不同点
- WebScoket 是双向通信协议,模拟 Socket 协议,而 HTTP 是单向的
- WebScoket 需要浏览器(客户端)和服务器握手进行连接,而 HTTP 是浏览器向服务器发起的连接,服务器预先并不知道这个连接
六、WebScoket 的应用场景
如果我们需要通过网络传输的任何实时更新或连续数据流,如监视、通知、聊天等,就可以使用 WebScoket,如果我们获取旧数据,或者只想获取一次数据则应该使用 HTTP 协议。