6月1日 02:20

WebSocket 是什么?和 HTTP 有什么区别?

WebSocket 是 HTML5 引入的全双工通信协议,客户端和服务端可以同时收发数据,连接建立后持续保持,直到任一方主动关闭。它通过一次 HTTP 握手升级协议,之后不再走 HTTP 请求-响应模型,而是以帧为单位双向传输,帧头仅 2-14 字节,远小于 HTTP 每次请求携带的头部开销。适用于聊天、实时行情、多人游戏、协同编辑、监控推送等需要低延迟双向通信的场景。

追问

WebSocket 握手过程是怎样的?

客户端发起一个普通 HTTP 请求,携带 Upgrade: websocketConnection: 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 更简单可靠。

标签:WebSocket