解答
- 支持双向通信,实时性更强
- 可以发送文本,也可以发送二进制数据
- 建立在TCP协议之上,服务端的实现比较容易
- 数据格式比较轻量,性能开销小,通信高效
- 没有同源限制,客户端可以与任意服务器通信
- 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL
- 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易被屏蔽,能通过各种 HTTP 代理服务器。
解析
WebSocket 的实现相对容易,主要有以下几个原因:
- 基于 TCP 协议: WebSocket 建立在 TCP 协议之上。TCP 是一种可靠的、面向连接的协议,提供了对数据可靠传输的支持。与基于 UDP 的协议相比,TCP 处理了很多连接管理、流控制等方面的复杂性,使得 WebSocket 在底层通信上更为稳定,无需开发者过多关注底层细节。
- 与 HTTP 协议的良好集成: WebSocket 的握手过程采用了标准的 HTTP 协议。在握手过程中,客户端和服务器之间通过 HTTP 协商升级到 WebSocket 协议,这就使得 WebSocket 在与现有的 Web 基础设施、网络代理等方面具有较好的兼容性。服务端实现 WebSocket 主要需要处理这个握手阶段,之后就可以在同一连接上进行 WebSocket 数据的交换。
- 持久连接: WebSocket 在连接建立后是持久性的,与传统的 HTTP 请求-响应模型不同,不需要频繁地建立和关闭连接。这降低了服务端实现的复杂性,不需要处理连接的频繁变化,只需要在连接建立后保持连接状态,以及处理来自客户端的消息。
- 成熟的库和框架支持: 有许多成熟的 WebSocket 库和框架,这些库和框架提供了抽象和封装,简化了 WebSocket 服务器的实现。开发者可以使用这些工具,减少了从零开始实现 WebSocket 服务器的难度。
数据格式比较轻量,性能开销小,通信高效,主要体现在:
- 数据格式轻量: WebSocket 协议中传输的数据包是经过精简的二进制或文本数据,相比于 HTTP 协议中的文本数据,WebSocket 的数据格式更加轻量。这是因为 WebSocket 在传输过程中不需要像 HTTP 那样使用大量的头部信息,而是采用更紧凑的格式。
- 性能开销小: WebSocket 建立在 TCP 协议之上,TCP 是一种高效、可靠的传输协议。相比于 HTTP 协议,WebSocket 不需要每次通信都重新建立连接,而是在握手成功后保持一个持久连接。这降低了连接建立和关闭的开销,减少了通信的延迟。
- 通信高效: 由于 WebSocket 具有全双工通信的特性,客户端和服务器可以在连接建立后同时发送和接收数据,而不需要等待对方的请求或响应。这种实时双向通信的能力使得 WebSocket 在需要高效实时通信的场景中非常有优势,例如在线聊天、实时协作、实时数据推送等。
与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易被屏蔽,能通过各种 HTTP 代理服务器:
- 默认端口是80和443,不容易被防火墙屏蔽。
- 握手阶段采用http协议,能通过各种http代理服务器和目标服务器进行通信,建立websocket连接后,直接通过已建立的websocket连接进行传输,不再通过http代理服务器。