WebSocket 在握手成功后,会在客户端和服务器之间建立一条持久的全双工通信通道。与HTTP的半双工通信(同一时刻只能在一个方向上传送数据)不同,WebSocket的全双工特性允许数据同时在两个方向上传输,且双方都可以在任意时刻主动发送数据,无需等待对方请求。这种特性使得WebSocket非常适合需要频繁双向数据交换的场景,如在线聊天、多人协作编辑、实时游戏等。
WebSocket 使用专门的帧协议来封装传输数据,帧头结构非常紧凑。基本帧头仅占用2-14字节(取决于载荷长度和是否使用掩码),远小于HTTP请求和响应头。在客户端发送到服务器的数据中,必须使用掩码(Masking Key)对载荷进行异或加密,以防止缓存代理中毒攻击;服务器发送到客户端的数据则不需要掩码。帧头中的操作码(Opcode)字段标识了帧的类型(文本、二进制、控制帧等),使得通信协议具有较强的扩展性。
浏览器和服务器端的WebSocket API都采用事件驱动设计,使得双向实时通信的实现非常直观。在浏览器端,开发者可以监听onopen(连接建立)、onmessage(收到消息)、onerror(发生错误)、onclose(连接关闭)等事件,并通过send()方法主动发送数据。在服务器端,相应的WebSocket库也提供类似的事件接口。这种事件驱动模型与JavaScript的异步特性天然契合,使得构建实时交互应用变得简单高效。