webSocket简单介绍

WebSocket协议提供了服务器主动推送信息的能力,实现了双向通信,降低了HTTP的通信开销。它依赖HTTP进行握手,然后通过TCP通道进行数据传输。WebSocket的特点包括易于服务器实现、良好的HTTP兼容性、高效的性能和数据格式。它通过特定的头部字段如Sec-WebSocket-Key进行安全性校验。此外,WebSocket还支持断线重连和心跳检测机制,确保连接的稳定性和活跃性。

首先介绍一下不使用webSocket的聊天室的结构,我们知道http协议是短连接协议,正常在使用中就是数据请求发给后台,后台响应并将数据发送给前台,这是一次交互。而在这种情况下想要实现正常的信息交互就必须要在后台设置监听事件,一直监听着有没有请求有没有发送新的数据,如果有在进行转发,如果我只是发送一句话就必须走完一套程序才可以,这样的开销是很大的。而对于webSocket而言它使一种长链接和服务器连接,理想情况下可以很服务器连接很长时间,这时和服务器的交互就会很便捷开销也会变小。

webSocket、http和TCP

从上面的图中可以看出,HTTP、WebSocket 等应用层协议,都是基于 TCP 协议来传输数据的。我们可以把这些高级协议理解成对 TCP 的封装。

既然大家都使用 TCP 协议,那么大家的连接和断开,都要遵循 TCP 协议中的三次握手和四次握手 ,只是在连接之后发送的内容不同,或者是断开的时间不同。

更详细内容可阅读:wireshark抓包图解 TCP三次握手/四次挥手详解

对于 WebSocket 来说,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。

WebSocket

WebSocket 协议在2008年诞生,2011年成为国际标准。现在所有浏览器都已经支持了WebSocket 的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话。

HTTP 有 1.1 和 1.0 之说,也就是所谓的 keep-alive ,把多个 HTTP 请求合并为一个,但是 Websocket 其实是一个新协议,跟 HTTP 协议基本没有关系,只是为了兼容现有浏览器,所以在握手阶段使用了 HTTP 。HTTP 与 WebSocket 可以说是有交集的关系,但谁都不包含谁。

WebSocket 的其他特点:

  • 建立在 TCP 协议之上,服务器端的实现比较容易。
  • 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
  • 数据格式比较轻量,性能开销小,通信高效。
  • 可以发送文本,也可以发送二进制数据。
  • 没有同源限制,客户端可以与任意服务器通信。
  • 协议标识符是ws(如果加密,则为wss),服务器网址就是 UR

协议升级

 

  1. Connection:Upgrade:表示要升级的协议
  2. Upgrade: websocket:表示要升级到websocket协议
  3. Sec-WebSocket-Version: 13:表示websocket的版本
  4. Sec-WebSocket-Key:UdTUf90CC561cQXn4n5XRg== :与Response Header中的响应首部Sec-WebSocket-Accept: u1IRUiDR0daix+vYHGJNSg==是配套的,提供基本的防护,比如恶意的连接或者无意的连接。

    其中Connection就是我们前边提到的,客户端发送给服务端的信号,服务端接受到信号之后,才会对HTTP协议进行升级。那么服务端怎样确认客户端发送过来的请求是否是合法的呢?在客户端每次发起协议升级请求的时候都会产生一个唯一码:Sec-WebSocket-Key。服务端拿到这个码后,通过一个算法进行校验,然后通过Sec-WebSocket-Accept响应给客户端,客户端再对Sec-WebSocket-Accept进行校验来完成验证

当然在webSocket的设计中除了前面几篇文章中提及到的建立连接挂闭连接等,还有一些其他的功能,例如提到网络连接就不的不提的断线重连,当然在webSocket中的断线重连也很简单,只需要在关闭方法和报错方式处调用即可。之后还有一个比较重要的功能,心跳检测。就像他的名字一样心脏跳动是活着的一个证明,它就是用来告诉服务器我还“活着”,当然这里指的是依旧建立这链接。具体的功能实现就是定时向服务器发送一个数据包,如果发送成功并且接收到服务器响应那么就说明链接依旧建立。

<think>好的,我现在需要回答用户关于WebSocket技术的基本概念和使用场景的问题。用户已经提供了一些引用内容,我需要结合这些引用以及之前的对话内容来构建回答。 首先,回顾用户的问题,他们想了解WebSocket的基本原理和应用场景。之前用户提到了JWT的相关内容,但当前问题转向了WebSocket,因此我需要专注于WebSocket部分,但可以适当参考之前的回答结构,比如分点说明、代码示例等。 根据用户提供的引用,引用[4]提到WebSocket是HTML5的全双工通信技术,基于TCP,复用HTTP握手通道。引用[1]和[2]讨论了WebSocket的原理和Java中的实现方式,比如ServerEndpointExporter和registerWebSocketHandlers的区别。引用[3]提到了WebSocket对象的方法如open(), send(), close()。 用户希望了解技术原理和应用场景,所以需要分两部分。首先解释WebSocket的工作原理,包括握手过程、数据传输机制,然后列出常见的应用场景,比如实时聊天、在线游戏等。同时,可能需要比较WebSocket与传统HTTP轮询或长轮询的优劣,如引用[1]中提到的HTTP的局限性和长轮询的问题。 需要注意的是,用户提供的引用可能存在错误或不一致,例如引用[3]中的open()方法实际上在WebSocket API中是创建实例后自动连接的,可能需要更正。另外,引用[2]中的两种Spring配置方式需要准确描述其区别,但用户的问题更关注原理和应用,所以可能不需要深入代码实现,但可以简要提及。 需要确保回答结构清晰,使用中文,行内公式正确(如果有的话),并添加相关的问题部分。同时,根据用户之前的回答示例,可能需要包含代码示例,比如一个简单WebSocket连接的前端JavaScript代码,以及后端的简要说明。 最后,验证信息准确性,比如WebSocket握手过程的具体细节,状态码101,数据帧的结构等,确保引用正确,并根据需要添加引用标记。</think>### WebSocket技术原理及应用场景介绍 #### 一、WebSocket 基本概念 WebSocket 是 HTML5 提供的一种**全双工通信协议**,允许客户端与服务器建立持久化连接,实现双向实时数据传输[^4]。与传统的 HTTP 请求-响应模式不同,WebSocket 连接一旦建立,双方可主动推送数据,避免了频繁轮询的开销。 #### 二、技术原理 1. **连接建立(握手阶段)** WebSocket 通过 HTTP/1.1 协议**复用握手通道**完成初始连接: - 客户端发送 HTTP 请求,包含 `Upgrade: websocket` 和 `Sec-WebSocket-Key` 头部。 - 服务器返回状态码 `101 Switching Protocols`,附带 `Sec-WebSocket-Accept` 验证响应[^4]。 握手完成后,协议切换为 WebSocket,后续通信基于二进制帧传输。 2. **数据传输机制** - **数据帧格式**:包含操作码(如文本/二进制)、掩码、负载长度等字段,支持分片传输。 - **心跳机制**:通过 `Ping/Pong` 帧检测连接活性,防止超时断开。 - 全双工特性:客户端和服务器可独立发送数据,无需等待对方响应。 3. **与传统 HTTP 轮询对比** | 特性 | WebSocket | HTTP 轮询/长轮询 | |--------------------|-------------------|--------------------------| | 连接方式 | 持久化单连接 | 多次短连接 | | 延迟 | 低(实时推送) | 高(依赖轮询间隔) | | 服务器资源消耗 | 低 | 高(频繁建立连接) | | 适用场景 | 实时交互 | 低频数据更新 | #### 三、核心代码实现示例 ##### 前端(JavaScript)建立连接 ```javascript // 创建WebSocket连接 const socket = new WebSocket('wss://example.com/ws'); // 监听连接打开事件 socket.onopen = () => { socket.send('Hello Server!'); // 发送数据 }; // 接收服务器消息 socket.onmessage = (event) => { console.log('收到消息:', event.data); }; // 处理连接关闭 socket.onclose = () => { console.log('连接已关闭'); }; ``` ##### 后端(Spring Boot 配置) ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyWebSocketHandler(), "/ws") .setAllowedOrigins("*"); // 允许跨域 } } // 自定义处理器 public class MyWebSocketHandler extends TextWebSocketHandler { @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) { String payload = message.getPayload(); session.sendMessage(new TextMessage("服务器回复: " + payload)); } } ``` #### 四、主要应用场景 1. **实时通信系统** - 在线聊天室、客服系统(如 Slack、Discord)[^4] - 协同编辑工具(如 Google Docs) 2. **金融与物联网领域** - 股票行情实时推送(价格变动秒级更新) - 智能设备状态监控(传感器数据流) 3. **游戏与多媒体** - 多人在线游戏(同步玩家动作) - 直播弹幕互动(实时评论展示) 4. **通知与预警系统** - 系统异常报警(如服务器宕机通知) - 物流状态更新(如快递位置追踪) #### 五、安全性注意事项 1. **加密传输**:必须使用 `wss://`(WebSocket over TLS)防止中间人攻击。 2. **鉴权机制**:连接建立时验证用户身份(如结合 JWT 令牌)[^1]。 3. **输入过滤**:防止 WebSocket 消息注入攻击(如 XSS)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值