2025-03-11
编程
00
请注意,本文编写于 47 天前,最后修改于 47 天前,其中某些信息可能已经过时。

目录

主要特点
OSI的位置
握手过程
数据帧格式
应用场景

WebSocket协议是一种在单个TCP连接上进行全双工通信的协议。

它使得客户端和服务器之间的数据交换变得更加简单,允许服务器主动向客户端推送数据。连接建立后,客户端和服务器可以随时发送数据给对方,而不需要轮询请求。

主要特点

  • 全双工通信:一旦WebSocket连接建立,就可以双向通信,不像HTTP那样需要请求/响应模式。
  • 较低的开销:与HTTP相比,WebSocket的协议头更小,减少了传输的数据量。
  • 支持跨域通信:WebSocket自然支持跨域,无需像AJAX那样处理复杂的CORS问题。
  • WebSocket协议是基于TCP(传输控制协议)的:尽管它使用HTTP进行初始握手来建立连接,并且通过HTTP端口(通常是80或443)进行通信,但一旦握手完成,WebSocket就完全脱离了HTTP协议,直接在TCP层之上运行自己的协议栈,它是基于tcp协议的

OSI的位置

WebSocket协议在OSI七层模型中的位置可以理解为跨越了多个层次,但主要归属于传输层和应用层之间。

  • 传输层(Layer 4)依赖:WebSocket实际上依赖于TCP协议来保证可靠的数据传输。因此,在这个意义上,它利用了传输层的服务。

  • 应用层(Layer 7)实现:然而,WebSocket本身是一种应用层协议,设计用于在客户端和服务器之间提供全双工通信。它定义了如何在已经建立的TCP连接上进行高效的数据交换,特别是在需要实时双向通信的应用场景中,如在线聊天、游戏等。

握手过程

WebSocket连接是从HTTP请求开始的,这个请求包括一些特定的头部信息,Upgrade: websocketConnection: Upgrade),用来告诉服务器客户端希望升级到WebSocket协议。

  1. 客户端发送请求:客户端向服务器发送一个带有Upgrade: websocket头部的HTTP请求。

    http
    GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13 Origin: http://example.com
  2. 服务器响应:如果服务器同意升级,则返回一个状态码为101的响应,并包含相应的确认头部。

    http
    HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

这里的Sec-WebSocket-Accept是通过对客户端提供的Sec-WebSocket-Key进行特定算法处理后生成的,确保了握手的安全性。

数据帧格式

一旦握手成功,通信就切换到了WebSocket协议。WebSocket的数据传输使用一种紧凑的二进制帧格式:

  • FIN位:指示这是消息的最后一帧。
  • Opcode:定义帧类型,如文本(0x1)、二进制(0x2)或关闭连接(0x8)等。
  • Mask位:指示是否对数据进行了掩码操作(所有客户端到服务器的消息必须被掩码)。
  • Payload length:表示负载数据的长度。
  • Masking-key:如果Mask位设置,则存在此字段用于解码实际数据。
  • Payload data:实际要传输的数据。

应用场景

WebSocket因其高效性和低延迟特性,非常适合于以下场景:

  • 实时聊天应用:即时消息传递。
  • 在线游戏:需要快速反应的游戏逻辑。
  • 金融交易平台:股票价格实时更新。
  • 协作工具:文档同时编辑功能。

WebSocket提供了一种有效的方法来实现实时双向通信,提升了用户体验并减少了不必要的网络开销。