WebSocket与HTTP之间的关系
人们容易把WebSocket想象成取代HTTP的东西,但实际上它是以一个HTTP请求开始的,握手成功(状态码101)之后才切换协议。这意味着WebSocket服务器仍要正确处理最初的HTTP请求,而一些只理解普通HTTP的基础设施,比如老旧的代理服务器或限制严格的防火墙,有时会干扰这次升级。在反向代理(如Nginx)后面运行WebSocket服务时,需要显式配置对Upgrade头的转发,否则连接会在握手阶段失败。
为什么生产环境中的WebSocket应用需要额外的配套机制
基础的WebSocket连接会悄然断开,所以实际应用要加入心跳和自动重连。此外,和无状态的HTTP请求不同,每一条WebSocket连接都是长期存在且带状态的,这意味着把服务横向扩展到多台服务器时,需要额外的处理:常见做法是使用会话保持(sticky session),或者用共享的消息代理(如Redis等)在各台服务器之间转发消息,确保消息能送到持有对应连接的那台服务器。还需要限制单个连接的消息大小和频率,并对来源和身份进行校验。
安全上需要注意什么
WebSocket握手不受浏览器同源策略的约束,服务器必须自行检查Origin头,以防跨站WebSocket劫持(CSWSH):恶意网页借用户已登录的身份发起连接。身份验证通常在握手阶段或连接建立后的第一条消息完成,不要把长期有效的令牌直接放在URL里,因为它们可能被记入日志。所有来自客户端的消息都应当当作不可信输入处理。
常见问题
防火墙会阻止WebSocket连接吗?
可能会。一些管控严格的企业网络或公共Wi-Fi防火墙,会阻止80和443之外的端口,或者阻止协议升级请求。不过大多数WebSocket服务直接使用HTTPS通常使用的443端口,从而把这种风险降到最低。
WebSocket在移动网络环境下也能稳定运行吗?
在Wi-Fi与蜂窝网络之间切换、屏幕熄灭或应用转入后台时,连接都可能断开,所以实际应用通常内置自动重连和心跳逻辑,专门应对这类中断。
WebSocket一定比HTTP快吗?
不一定。它省去了每条消息重复的握手和头部开销,所以在频繁的小消息场景里延迟更低、更省资源。但对于偶尔一次的普通请求,HTTP更简单,也更容易缓存和扩展。
一个服务器能同时维持多少条WebSocket连接?
没有固定的数字,取决于服务器的内存、网络、使用的语言与框架以及消息频率。通常需要通过压力测试来确认,并在设计时考虑横向扩展。
前端用WebSocket时,最基本的代码长什么样?
浏览器端大致是三步:用new WebSocket加上wss地址创建连接,通过onmessage监听收到的消息,再用send发送消息。此外还应处理onclose和onerror事件,以便在断线时触发重连。
WebSocket能传输二进制数据吗?
可以。除了文本帧,协议还支持二进制帧,因此可以传输图片片段、音频或自定义的紧凑数据格式,这在游戏和音视频场景中很常见。