WebSocket面试详解
第一部分:核心概念 1.1 什么是 WebSocket? WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它诞生于 HTML5,旨在解决浏览器与服务器之间低延迟、实时、双向通信的需求。 全双工 (Full-duplex):与 HTTP 的“请求-响应”模式不同,WebSocket 连接一旦建立,客户端和服务器双方可以随时主动向对方发送数据,无需等待对方的请求。 单个 TCP 连接:所有通信都在一个 TCP 连接上完成,减少了重复建立和关闭连接的开销。 协议标识符:WebSocket 的 URL 方案是 ws://(非加密)和 wss://(加密,运行在 TLS 之上)。 1.2 为什么需要 WebSocket?(解决了什么问题?) 在 WebSocket 出现之前,为了模拟实时通信,开发者通常采用以下技术,但它们都有明显的缺陷: 轮询 (Polling):客户端定时向服务器发送 HTTP 请求,询问是否有新数据。 缺点:大量无效请求,浪费带宽和服务器资源;数据延迟高,实时性差。 长轮询 (Long Polling):客户端发送一个请求,服务器“挂起”这个连接,直到有新数据时才返回响应。客户端处理完响应后,立即发送下一个请求。 缺点:仍然有连接开销;服务器长时间持有连接会消耗资源;实现相对复杂。 服务器发送事件 (Server-Sent Events, SSE):一种允许服务器向客户端单向推送数据的技术。 缺点:只能实现服务器到客户端的单向通信,客户端无法向服务器发送数据(除非通过另一个 HTTP 请求)。 WebSocket 解决的核心问题:提供了一种低开销、低延迟、真正意义上的双向实时通信方案,完美适用于即时通讯、在线游戏、实时数据更新(股票行情、体育比分)等场景。 1.3 WebSocket 与 HTTP 的关系和区别 特性 HTTP (HyperText Transfer Protocol) WebSocket 通信模式 半双工 (Half-duplex)。客户端发起请求,服务器响应,一次完整的事务结束。 全双工 (Full-duplex)。连接建立后,双方可随时互相发送数据。 连接状态 无状态 (Stateless)。每个请求都是独立的,服务器不保留之前请求的信息。 有状态 (Stateful)。连接在整个会话期间保持,服务器和客户端都维护连接状态。 协议开销 较高。每个请求都包含完整的 HTTP 头部,通常有几百字节甚至更多。 极低。握手之后,数据帧的头部非常小(通常 2-10 字节),开销很小。 连接建立 每次通信都需要建立 TCP 连接(或在 Keep-Alive 下复用,但仍是请求-响应模式)。 借用 HTTP 协议进行一次“握手”,之后升级为 WebSocket 协议,后续通信与 HTTP 无关。 应用场景 文档、图片、API 数据等一次性资源获取。 即时聊天、在线协作、实时数据推送、在线游戏等需要高实时性的场景。 协议标识 http://, https:// ws://, wss:// 1....