WebSocket 是什么?和 HTTP 有什么区别?
WebSocket 是 HTML5 引入的全双工通信协议,客户端和服务端可以同时收发数据,连接建立后持续保持,直到任一方主动关闭。它通过一次 HTTP 握手升级协议,之后不再走 HTTP 请求-响应模型,而是以帧为单位双向传输,帧头仅 2-14 字节,远小于 HTTP 每次请求携带的头部开销。适用于聊天、实时行情、多人游戏、协同编辑、监控推送等需要低延迟双向通信的场景。
追问
WebSocket 握手过程是怎样的?
客户端发起一个普通 HTTP 请求,携带 Upgrade: websocket 和 Connection: Upgrade 头,并附上 Sec-WebSocket-Key。服务端同意后返回 101 状态码,带上 Sec-WebSocket-Accept(由客户端 Key 经 SHA-1 计算得出)。此后 TCP 连接升级为 WebSocket 连接,不再走 HTTP 协议。
HTTP 长轮询能替代 WebSocket 吗?
不能。长轮询是客户端发请求后服务端持有连接直到有数据才返回,本质仍是请求-响应模式。每次返回数据后客户端必须重新发起新请求,延迟高、开销大、无法服务端主动推送。WebSocket 连接建立后服务端随时可推数据,无需客户端轮询。
WebSocket 数据帧结构是什么?
帧由以下字段组成:FIN(1位,是否最后一帧)、RSV1-3(保留)、Opcode(4位,帧类型:0x1文本、0x2二进制、0x8关闭、0x9 ping、0xA pong)、MASK(1位,是否掩码)、Payload Length(7位或扩展)、Masking-key(0或4字节)、Payload Data。客户端发送帧MASK必须为1,服务器为0。
什么场景下应该选 HTTP 而非 WebSocket?
请求频率低、以客户端拉取为主的场景用 HTTP 更合适。WebSocket 需要维护长连接,占用服务端资源,且断线重连、心跳保活都需要额外处理。如果只是偶尔查个数据、提交个表单,HTTP 更简单可靠。