为什么建立TCP连接后还需要使用boost::beast::websocket::stream类
关于boost::beast::websocket::stream作用的解答
核心原因:协议分层的职责不同
你调用connect的tcp::socket只负责传输层TCP协议的逻辑,它的能力只有:建立TCP连接、收发裸字节流、保证字节可靠有序到达,完全不知道上层WebSocket协议的规则。
而WebSocket是运行在TCP之上的应用层协议,有一整套独立于TCP的标准要求,这些逻辑tcp socket根本没有内置:
- 必须先通过HTTP请求完成升级握手,也就是你代码里
ws.handshake做的工作:发送带Upgrade: websocket头的HTTP请求,收到服务端101切换协议响应之后,才算WebSocket连接正式可用 - 所有传输的数据有固定帧格式,包含帧类型(数据帧/控制帧)、掩码标记、载荷长度、校验等字段,还支持数据分片传输
- 内置控制帧处理逻辑:ping/pong心跳、连接关闭帧协商、错误状态码定义等
为什么boost要设计成包装器的形式
websocket::stream本质是一个协议编解码包装器,本身不实现底层传输能力,只负责WebSocket协议的封装和解析,这种设计的灵活性极高:
- 普通ws场景,你可以包装TCP流使用
- 加密wss场景,你可以包装SSL流
boost::asio::ssl::stream<tcp::socket>使用
不需要为不同的底层传输单独实现一套WebSocket逻辑。
不用websocket::stream可行吗
可行,但你需要自己在raw tcp socket上手动实现所有WebSocket协议逻辑:
- 组装HTTP升级握手请求,解析服务端返回的握手响应
- 发送数据时按照标准给载荷加帧头、加客户端要求的掩码
- 接收数据时解析帧头、处理分片、解掩码、拼接完整载荷
- 处理ping/pong心跳、关闭帧协商、各种异常错误逻辑
这些逻辑websocket::stream都已经做了成熟的封装,你直接调用write/read就能直接收发业务载荷,不需要关心底层协议的细节。
内容的提问来源于stack exchange,提问作者aldo
相关产品推荐
相关产品推荐

