Apache客户端断开后自行发起GET请求 应返回101还是400状态码?
问题结论
你这种场景绝对不应该返回101状态码,返回400状态码是更符合规范的处理方式,具体原因如下:
- 101状态码的定义是
Switching Protocols,只能用于服务器同意客户端的协议切换请求的场景。你收到的请求携带的是已经失效的会话ID,本身就不满足WebSocket连接建立的前提,根本不存在协议切换的基础,返回101完全不符合HTTP语义,自然会出现数据包丢失的问题——因为TCP连接对应的会话已经失效,底层传输链路没有对应的会话上下文承接后续的数据包。 - 针对已失效/不存在的socket.io会话ID的websocket连接请求,socket.io官方默认的处理逻辑就是返回400 Bad Request,响应头会携带会话ID未知的错误信息,客户端收到后会自动发起新的握手请求建立新的会话,不会影响正常的功能使用。
- 你当前返回200的处理也是不符合规范的,200是普通HTTP请求的成功响应,无法完成WebSocket协议切换,客户端会认为连接建立失败,反而可能增加不必要的重试逻辑。
额外优化建议:可以在Apache的配置里增加规则,提前拦截携带无效会话ID的
transport=websocket请求直接返回400,不需要转发到Node.js服务,能进一步降低后端服务的处理压力。
内容的提问来源于stack exchange,提问作者Ankit
相关产品推荐
相关产品推荐

