WebSocket 是一种网络通信协议,旨在通过单个长连接提供全双工通信。这意味着客户端和服务器可以同时发送和接收数据,而不需要重新建立连接。WebSocket 的建立过程是通过 HTTP 请求/响应的方式启动的,但一旦连接建立,就会切换到 WebSocket 协议。
客户端请求:客户端通过 HTTP/HTTPS 发起请求,包含以下头部信息来表示希望升级到 WebSocket 协议:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
服务器响应:如果服务器支持 WebSocket 协议,会返回 101 Switching Protocols 状态码,并包含以下头部信息,确认协议升级:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Accept
是通过 Sec-WebSocket-Key
和一个固定字符串进行 SHA-1 哈希计算,并转为 Base64 编码得到的。WebSocket 使用一种帧(frame)结构来传输数据,每个帧都有一个固定的头部和可变的负载数据部分:
关闭帧:连接的任意一方都可以发送一个关闭帧来终止连接,帧中包含关闭状态码和可选的关闭原因。
socket.close(1000, "Normal Closure");
优雅关闭:另一方收到关闭帧后,应该回应一个关闭帧,并关闭连接。
WebSocket 适合需要实时双向通信的应用,如即时通讯工具和在线聊天平台。它可以在用户之间实时传输消息,而不需要长轮询或短轮询的开销。
在股票行情、体育比分、新闻推送等需要频繁更新数据的应用中,WebSocket 可以确保数据的实时性,用户可以立即看到最新的更新。
在线多人游戏需要快速的状态更新和实时互动,WebSocket 提供了低延迟和高效的数据传输,适合这类应用。
在线文档编辑、白板应用等协作工具需要实时同步多个用户的操作,WebSocket 可以提供低延迟的实时同步能力。
系统监控、事件报警等需要实时推送消息的场景,WebSocket 可以确保通知的及时性。
尽管 WebSocket 不是专门为流媒体设计的,但在某些低延迟音视频传输场景中,也可以使用 WebSocket。
物联网设备之间的数据传输和控制需要实时性,WebSocket 可以提供低延迟的通信方式。