WebSocket的那些事(1-概念篇)

简介: WebSocket的那些事(1-概念篇)

一、什么是Websocket


根据 RFC 6455 标准,Websocket协议提供了一种标准化的方式在客户端和服务端之间通过TCP连接建立全双工、双向通信渠道。它是一种不同于HTTP的TCP协议,但是被设计为在HTTP基础上运行。


Websocket交互始于HTTP请求,该请求会通过HTTP Upgrade请求头去升级请求,进而切换到Websocket协议。请求报文如下:

GET /spring-websocket-portfolio/portfolio HTTP/1.1
Host: localhost:8080
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==
Sec-WebSocket-Protocol: v10.stomp, v11.stomp
Sec-WebSocket-Version: 13
Origin: http://localhost:8080


我们可以看到在该请求报文中有两个特殊的请求头,一个是Upgrade请求头,代表升级为websocket协议。还有一个是Connection请求头,代表升级连接。


正常的HTTP响应报文如果正常返回,响应码是200,请求升级为websocket协议的响应报文如下:


HTTP/1.1 101 Switching Protocols 
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=
Sec-WebSocket-Protocol: v10.stomp


我们可以看到该响应报文中状态行返回的响应码是101,后面还附带了Switching Protocols切换协议关键字。


在成功握手后,底层HTTP升级请求TCP套接字会在客户端和服务端之间保持开放,从而继续发送和接收消息。

备注:关于Websockets如何工作的完整文档可以参考 RFC 6455


二、WebSocket部分header介绍

我们可以看到请求和响应报文中有一些特殊的websocket头部信息,这里简单的介绍一下:

  • Sec-WebSocket-Key:用于客户端与服务端初次握手唯一标识,Base64编码字符串。


  • Sec-WebSocket-Accept:初次握手服务端返回的唯一标识,也是Base64编码字符串,用来证明来自客户端的握手请求已经收到了,该响应头的值为:SHA-1(“Sec-WebSocket-Key” + “GUID”),然后再经过Base64编码。


备注:这里的GUID为固定值 258EAFA5-E914-47DA-95CA-C5AB0DC85B11。


Sec-WebSocket-Protocol:WebSocket子协议,比如可以是STOMP协议。

Sec-WebSocket-Version:WebSocket协议版本号,值必须为13。


三、HTTP VS WebSocket


虽然WebSocket被设计成和HTTP协议兼容,但是两种协议有不同的架构和应用编程模型。


在HTTP和REST中,应用被模型化为许多URL,客户端和应用交互需要访问这些URL,服务端对请求进行路由并交给合适的处理器,处理器会基于HTTP URL、方法和头部进行处理。


WebSocket和HTTP相反,通常只有一个URL用于初始链接,后面所有应用消息都会在相同的TCP连接上传输,这是一种完全不同的异步、事件驱动的消息。


WebSocket也是一种低级的传输协议,不像HTTP,它并没有规定消息内容的语义,也就意味着客户端和服务端之间如果没有对消息语义达成一致,是没办法路由和处理消息的。


WebSocket客户端和服务端之间可以协商使用更高级消息协议,比如STOMP,可以通过HTTP握手请求的请求头Sec-WebSocket-Protocol指定。


四、什么时候使用WebSockets


WebSockets可以让Web页面动态化和可交互,然而,在很多场景下,AJAX和HTTP Streaming或者长轮询也能提供简单、有效的解决方案。


例如,新闻、邮件和社会实事需要动态更新,每几分钟更新一次就好。而协作类、游戏和金融类APP需要更加的实时。


延时也不是决定性因素,如果消息体量比较小,HTTP Streaming或者长轮询也能解决,而像低延时、高频次和大消息体量的场景,WebSocket更适合。


五、关于SockJS和STOMP


SockJS 和 STOMP 都是用于 Web 应用程序与消息代理进行通信的技术,但它们解决的问题不同。


SockJS 是一个 JavaScript 库,它提供了一种在 Web 浏览器和 Web 服务器之间建立 WebSocket 连接的跨浏览器解决方案。


SockJS 旨在解决 WebSocket 不受支持或无法使用的情况下,使用轮询和其他技术建立实时双向通信的问题。SockJS 库支持多种传输方式,包括 WebSocket、XHR 流、XHR 短轮询等,从而保证了最大的兼容性和可靠性。


STOMP(Simple Text Oriented Messaging Protocol)是一种基于文本的简单消息协议,它提供了一种可互操作性的机制,用于跨语言和平台之间的实时消息传递。


STOMP 协议定义了一组命令和消息格式,用于在客户端和服务器之间进行消息传递,它与特定的消息代理无关,因此可以使用 STOMP 协议与多个消息代理进行通信。STOMP 支持订阅/发布模式和点对点模式,可以用于实现诸如聊天室、通知系统和实时数据更新等应用程序。


通常情况下,使用 SockJS和 STOMP结合使用可以获得最佳的性能和可靠性。


SockJS 提供了一种建立 WebSocket 连接的可靠跨浏览器解决方案,而 STOMP 提供了一种在 WebSocket 连接上实现实时消息传递的标准化协议。


在使用 SockJS 和 STOMP 的组合时,可以使用 SockJS 建立 WebSocket 连接,然后使用 STOMP 协议在 WebSocket 连接上进行消息传递,从而获得最佳的性能和可靠性。

相关文章
|
网络协议
一文了解websocket和socket(论点:概念、流程、区别)
一文了解websocket和socket(论点:概念、流程、区别)
|
监控 网络协议 安全
一文了解HTTP、HTTPS、TCP、UDP、Websocket(论点:概念、通信流程、异同点、应用领域)
一文了解HTTP、HTTPS、TCP、UDP、Websocket(论点:概念、通信流程、异同点、应用领域)
|
Web App开发 移动开发 网络协议
WebSocket简单使用(一) - 概念
原文 http://www.oseye.net/user/kevin/blog/78 关于WebSocket我打算分如下几篇博文来探探路: WebSocket简单使用(一) - 概念 WebSocket简单使用(二) - 客户端 WebSocket简单使用(三) - 服务器端 WebSocket简单使用(四) - 完整实例 WebSocket简单使用(五) - 模拟微信 连接键盘 功能 背景: 前几天老大突然发现微信有个链接键盘的功能,我仔细想了下或许是使用WebSocket来实现的,又加上最近HTML5的呼声愈来愈高,觉得有必要研究下HTML5了。
1392 0
|
5月前
|
前端开发 网络协议 JavaScript
在Spring Boot中实现基于WebSocket的实时通信
在Spring Boot中实现基于WebSocket的实时通信
|
2月前
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
474 1
|
2月前
|
前端开发 Java C++
RSocket vs WebSocket:Spring Boot 3.3 中的两大实时通信利器
本文介绍了在 Spring Boot 3.3 中使用 RSocket 和 WebSocket 实现实时通信的方法。RSocket 是一种高效的网络通信协议,支持多种通信模式,适用于微服务和流式数据传输。WebSocket 则是一种标准协议,支持全双工通信,适合实时数据更新场景。文章通过一个完整的示例,展示了如何配置项目、实现前后端交互和消息传递,并提供了详细的代码示例。通过这些技术,可以大幅提升系统的响应速度和处理效率。
|
4月前
|
开发框架 网络协议 Java
SpringBoot WebSocket大揭秘:实时通信、高效协作,一文让你彻底解锁!
【8月更文挑战第25天】本文介绍如何在SpringBoot项目中集成WebSocket以实现客户端与服务端的实时通信。首先概述了WebSocket的基本原理及其优势,接着详细阐述了集成步骤:添加依赖、配置WebSocket、定义WebSocket接口及进行测试。通过示例代码展示了整个过程,旨在帮助开发者更好地理解和应用这一技术。
395 1
|
4月前
|
小程序 Java API
springboot 微信小程序整合websocket,实现发送提醒消息
springboot 微信小程序整合websocket,实现发送提醒消息
|
4月前
|
JavaScript 前端开发 网络协议
WebSocket在Java Spring Boot+Vue框架中实现消息推送功能
在现代Web应用中,实时消息提醒是一项非常重要的功能,能够极大地提升用户体验。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为实现实时消息提醒提供了高效且低延迟的解决方案。本文将详细介绍如何在Java Spring Boot后端和Vue前端框架中利用WebSocket实现消息提醒功能。
211 0
|
6月前
|
前端开发 JavaScript 安全
集成WebSocket在Spring Boot中可以用于实现实时的双向通信
集成WebSocket在Spring Boot中可以用于实现实时的双向通信
105 4