websocket协议介绍
WebSocket 协议是一种在单个 TCP 连接上进行全双工通讯的协议。
WebSocket 使得客户端和服务器之间的数据交换变得更简单,允许服务器主动向客户端推送数据。它在 2011 年成为国际标准,现在被所有现代浏览器支持。WebSocket 设计用于取代传统的轮询技术,如长轮询,使得数据可以即时传输,减少延迟和网络负载。
传统的web程序都是属于“一问一答”的形式,即客户端给服务器发送了一个HTTP请求,服务器给客户端返回一个HTTP响应。这种情况下服务器属于被动的一方,如果客户端不主动发起请求,服务器就无法主动给客户端响应。
像网页即时聊天/游戏 这样的程序都是非常依赖“消息推送”的,即需要服务器主动推送消息到客户端。如果使用原生的HTTP协议,要想实现“消息推送”一般需要通过“轮询”(客户端定时向服务器发送请求来刷新)的方式实现,但轮询非常占用带宽(成本高)并且也不能及时获取到消息的响应(延迟高)
WebSocket原理
-
握手: 首先,客户端通过发送一个 HTTP 请求到服务器来初始化一个 WebSocket 连接。这个请求称为"握手"。不同于普通的 HTTP 请求,这个请求包含了一些特殊的头部,例如
Upgrade: websocket
和Connection: Upgrade
,指示服务器这是一个 WebSocket 连接的请求。 -
服务器响应: 如果服务器支持 WebSocket 协议,它会返回一个 HTTP 状态码 101(切换协议)的响应,表示同意建立 WebSocket 连接。之后,客户端和服务器之间的通信就从 HTTP 协议切换到 WebSocket 协议。
-
数据传输: 一旦握手成功,客户端和服务器就可以在这个单独的 TCP 连接上进行全双工通讯了。WebSocket 协议支持文本和二进制数据的传输。数据包被称为"消息",每个消息可以分成一个或多个"帧"进行传输。
-
保持连接: WebSocket 连接会保持活动状态,直到客户端或服务器决定关闭连接。这允许数据能够快速且实时地在双方之间传输,非常适合需要实时功能的应用,如在线游戏、聊天应用和实时交易系统。
特点
- 减少通信延迟: 相比于 HTTP 轮询,WebSocket 提供了更低的通信延迟。
- 减少网络负载: 在 WebSocket 连接中,服务器和客户端之间的消息头部比 HTTP 小得多,这减少了网络负载。
- 实时双向通信: WebSocket 使得服务器能够主动向客户端推送信息,而不需要客户端频繁地请求。
- 兼容性: WebSocket 设计为兼容 HTTP 协议,易于实现和部署。
使用场景
WebSocket 特别适用于需要快速、实时通讯的应用,如:
- 实时消息应用
- 在线游戏
- 实时通讯系统
- 金融交易平台(实时报价)
- 协同编辑应用
- 实时监控系统
WebSocket 协议的引入是现代 Web 开发的一个重要进步,为开发者提供了更多的可能性,使得创建实时、互动的 Web 应用成为可能。
接口
在项目中有使用到websocketpp库。它允许将WebSocket客户端和服务器功能集成到C++程序中。在最常见的配置中,全功能网络I/O由Asio网络库提供。
项目:[项目设计]基于websocket实现网络对战五子棋-CSDN博客
以下是一些相关的常用网站:
用户手册:WebSocket++: Main Page
github:GitHub - zaphoyd/websocketpp: C++ websocket client/server library
官网:WebSocket++ | Zaphoyd Studios