基本概念
websocket是H5引入的,基于TCP传输协议,并复用HTTP的握手通道,为浏览器和服务端提供全双工通讯的应用层协议。
优点
- 支持双向通讯,实时性更强
- 更好的二进制支持
- 数据格式比较轻量,性能开销小,通信高效。
- 基于TCP传输协议,并复用HTTP的握手通道,服务端实现比较容易
HTTP 与 WebSocket 的区别
相同点
- 都是一样基于TCP的应用层协议,都是可靠性传输协议
不同点
WebSocket 是全双工通信协议
(其实物理链路层才用这个词),通信双方可以实时且同时发送和接收消息。而HTTP是单向的;WebSocket 需要依赖 HTTP 协议进行一次握手升级
。握手成功过后数据就直接从 TCP 通道传输,与 HTTP 无关;- WebSocket 数据格式比较轻量,它的数据包头部较小,而HTTP协议每次通信都需要携带完整的头部
WebSocket 无跨域问题
- WebSocket 没有了 Request 和 Response 的概念
- 应用场景不同,HTTP适用于简单场景,如网页浏览,表单提交等,WebSocket适用于需要持续连接,有频繁数据交换的场景,例如实时聊天、在线游戏、实时行情等。
WebSocket 握手协议 与 Http握手 的区别
WebSocket 的握手协议相比 HTTP原本的握手协议 ,多了两个头部字段:
Upgrade:webSocket
Connection:Upgrade
- Sec-WebSocket-Key
这两个字段告诉服务器这是一个要求升级到 WebSocket 的请求,另一个重要的头部字段是Sec-WebSocket-Key,这是一个 Base64 编码的随机值,用于之后的安全验证。
如果服务器同意升级连接到 WebSocket,它会返回一个 HTTP 101 Switching Protocols 的响应,表示协议正在被切换
。
在这个响应的头部信息中也会有一些特殊的字段。例如会有一个Sec-WebSocket-Accept,它是对客户端请求头中Sec-WebSocket-Key字段的一个回应,证明这个握手过程是双向认证的。
在 WebSocket 握手完成后,连接就转变为了一个全双工,持久的 WebSocket 连接,可以用于双向数据传输。
HTTP 握手和 WebSocket 握手最大的区别就是 WebSocket 握手包含了一次协议升级过程,握手完成后,连接由 HTTP 变成了 WebSocket,可以进行全双工的双向数据通信。
WebSocket的心跳检测
WebSocket 的心跳检测就是客户端和服务器端定期发送一些小数据包来确认对方是否还在线,是一种检测连接状态的机制
。
由于各种原因,WebSocket 连接可能会随时断开。但是只有当客户端尝试发送数据的时候,它才会意识到连接已经断开。为了避免这种情况,我们可以使用心跳检测来定期检查连接是否仍然正常。
通常,心跳检测是这样工作的:
- 客户端每隔一段时间(比如 5 秒、30 秒或 1 分钟)发送一个 "ping" 消息到服务器,让服务端知道自己在线
- 当服务器收到 "ping" 消息后,返回一个 "pong" 消息作为响应,告诉客户端自己可用,否则视为断开,
如果在一段时间内客户端没有收到 "pong" 消息,就知道连接可能已经断开,可以选择重连或者报错。
客户端 ping
=> 服务器服务器 pong
=> 客户端
需要注意的是,心跳检测并不能避免连接断开,但是它可以帮助我们更快地检测到连接断开,并及时做出响应。这对于需要保持长连接的应用(比如在线聊天、游戏等)非常重要,可以提供更好的用户体验。