WebSocket协议解析与Java实践

文章目录

  • 一、HTTP协议与HTTPS协议
    • 1.HTTP协议的用处
    • 2.HTTP协议的特点
    • 3.HTTP协议的工作流程
    • 4.HTTPS协议的用处
    • 5.HTTPS协议的特点
    • 6.HTTPS协议的工作流程
  • 二、WebSocket协议出现的原因
      • 1. 传统的HTTP请求-响应模型
      • 2. 轮询(Polling)
      • 3. 长轮询(Long Polling)
      • 4. Server-Sent Events (SSE)
      • 5. WebSocket
  • 三、WebSocket协议解析
    • 1.特点
    • 2.建立连接和数据通信
      • 第一步: 客户端发起HTTP请求
      • 第二步: 服务器响应
      • 第三步: 握手完成
      • 第四步: 数据传输
      • 掩码操作示例
      • 第五步: 连接关闭

一、HTTP协议与HTTPS协议

1.HTTP协议的用处

HTTP (Hypertext Transfer Protocol, 超文本传输协议) 是一种用于从网络服务器传输超文本到本地浏览器的传输协议。它确保了高效且准确的信息传输,并定义了在数据通信过程中客户端与服务器之间的交互行为。

  • Web浏览: 当用户在浏览器地址栏输入网址或点击链接时,客户端向服务器发送一个HTTP请求以获取资源。服务器响应这些请求并返回HTML页面,浏览器再将这些页面渲染成可视化的网页。
  • 数据交换: HTTP支持多种数据类型的传输,包括但不限于图像、视频、文本和其他多媒体内容。这使得Web应用程序能够提供丰富的用户体验。

2.HTTP协议的特点

  • 无状态协议: HTTP是一种无状态协议,意味着每次连接只处理一个请求,服务器不会保留关于客户端的任何状态信息。这种设计简化了服务器的实现,但也可能导致一些需要维护状态的应用程序需要使用cookies或session来跟踪用户会话。
  • 灵活: HTTP允许传输任意类型的数据对象,并且可以通过不同的MIME类型来标识数据格式。
  • 简单快速: HTTP请求方法简洁明了,服务器通常能够迅速响应这些请求。
  • 基于文本: 所有命令和消息都是纯文本形式,易于调试和理解。

3.HTTP协议的工作流程

  • HTTP协议是基于TCP/IP模型的应用层协议:

在这里插入图片描述

一个典型的HTTP请求由以下几个部分组成:

  • 请求行: 包含请求的方法(GET、POST等)、请求的URL和使用的HTTP版本。
  • 请求头: 包含客户端信息、认证信息以及其他用于控制请求行为的元数据。
  • 空行: 分隔请求头和请求体。
  • 请求体: 可选部分,包含了请求的数据,例如表单提交的数据。

HTTP响应同样也包含以下几个部分:

  • 状态行: 包含HTTP版本、状态码及描述该状态码的文字说明。
  • 响应头: 包含服务器信息、认证信息及其他控制响应行为的元数据。
  • 空行: 分隔响应头和响应体。
  • 响应体: 包含了服务器响应的数据,如HTML文档或其他类型的文件。

  • 用户从在浏览器输入url请求资源,到获得资源并渲染在页面上的完整流程:
  1. URL 解析和域名解析

    • 用户在浏览器地址栏输入URL。
    • 浏览器解析URL,提取协议、主机名、端口(如未指定则使用默认端口)、路径和查询字符串。
    • 浏览器进行域名系统(DNS)查找,将域名转换为对应的IP地址。
  2. 建立TCP连接

    • 浏览器与服务器建立TCP连接,这涉及到三次握手过程。
  3. 发起HTTP请求

    • 若URL使用HTTP协议,浏览器会直接发送HTTP请求。
    • 若URL使用HTTPS协议,浏览器会先与服务器建立安全连接,包括SSL/TLS握手,然后加密的HTTP请求通过该安全连接传输。
  4. 服务器处理请求

    • 服务器接收到请求后,根据请求的资源类型和路径等信息处理请求。
    • 如果请求的是静态资源(如HTML、CSS、JavaScript文件),服务器会直接从文件系统中读取并返回。
    • 如果请求的是动态资源,服务器可能需要运行相关的应用程序或脚本来生成响应内容。
  5. 返回HTTP响应

    • 服务器将请求的资源或生成的页面作为HTTP响应返回给客户端。
    • HTTP响应包含状态码、响应头和响应体。
  6. 浏览器处理响应

    • 浏览器解析响应,根据状态码确认是否成功获取资源。
    • 对于HTML文档,浏览器开始解析HTML并构建DOM(文档对象模型)。
    • 遇到链接到外部资源(如CSS、JavaScript、图片等)的标签,浏览器会再次发起请求下载这些资源。
  7. 渲染页面

    • 浏览器根据DOM和CSSOM(CSS对象模型)渲染页面,这是渲染引擎的工作。
    • JavaScript文件被执行,可能会对页面内容和结构进行动态修改。
  8. 显示结果

    • 浏览器在解析完HTML、CSS和执行完JavaScript后,将最终的页面呈现给用户。
  9. 关闭连接

    • 一旦页面渲染完毕,浏览器通常会关闭与服务器的TCP连接,但在持久连接(keep-alive)的情况下,此连接可能会保持打开状态以供后续请求使用。

整个过程涉及网络通信、协议解析、安全加密、数据处理和页面渲染等多个环节,每个环节都对网页加载性能有重要影响。

在这里插入图片描述

4.HTTPS协议的用处

HTTPS (Hypertext Transfer Protocol Secure) 是HTTP的安全版本,它在HTTP的基础上加入了SSL/TLS层,主要用于需要高度安全性的网站,比如银行、电子商务网站等,以确保用户的信息安全。

  • 加密通信: 使用SSL/TLS协议对数据进行加密,以防止数据在传输过程中被截获或监听。
  • 身份验证: 通过数字证书验证服务器的身份,确保用户访问的是合法的网站,从而防止中间人攻击。
  • 数据完整性: 保证数据在传输过程中的完整性和未被篡改。

5.HTTPS协议的特点

  • 安全性: 通过加密技术来保护传输的数据,防止数据被窃取或篡改。
  • 认证: 通过数字证书来验证通信双方的身份,确保其真实性。
  • 可靠性: 提供数据的完整性校验,确保接收到的信息是完整无误的。

6.HTTPS协议的工作流程

HTTPS在HTTP的基础上通过SSL或TLS进行加密处理。

在这里插入图片描述

SSL/TLS协议在传输数据之前,会先在客户端和服务器之间建立一条加密通道。

  • HTTPS通过以下步骤确保安全通信:
  1. 客户端发起TCP连接请求;
  2. 服务器响应TCP连接;
  3. 客户端和服务器进行SSL/TLS握手:
    • 客户端向服务器发送“Client Hello”消息,其中包含客户端支持的SSL/TLS版本和加密套件列表。
    • 服务器选择一个加密套件,并发送“Server Hello”消息,确认所选的加密套件,并附带自己的数字证书。
    • 客户端验证服务器的数字证书,并生成一个随机数作为会话密钥,然后使用服务器公钥加密此会话密钥后发送给服务器。
    • 服务器解密会话密钥,并确认密钥已接收。
  4. 握手成功后,加密的HTTP数据传输开始;
  5. 通讯完成后,断开连接。

总之,HTTP和HTTPS构成了互联网通信的基础,而随着网络安全意识的提高,HTTPS正逐步取代传统的HTTP成为主流的网络通信协议,为用户提供更安全的网络环境。

二、WebSocket协议出现的原因

WebSocket技术的出现主要是为了解决传统HTTP协议在实现实时双向通信方面存在的不足,提高通信效率并简化应用开发。

  • 克服HTTP轮询的局限性:
    传统HTTP协议下的轮询机制要求浏览器定期向服务器发起HTTP请求以获取更新,这种方式不仅效率低下,而且消耗大量带宽资源。
    HTTP请求头部较长,而实际传输的有效数据往往较少,导致资源浪费严重。

  • 实现实时双向通信的需求:
    随着互联网应用的发展,对于即时消息、在线游戏等需要实时双向通信的应用场景越来越多。
    传统HTTP协议无法满足服务器主动向客户端推送数据的需求,限制了这类应用的实现。

  • 提高通信效率:
    WebSocket协议仅需一次握手即可建立持久连接,之后客户端与服务器之间可以直接进行高效的数据交换。
    这种全双工(full-duplex)的通信方式极大地提高了数据传输的速度和效率。

  • 简化开发复杂度:
    WebSocket作为一种新的协议,旨在简化实时通信应用的开发,避免了频繁的HTTP请求和响应带来的复杂性和性能瓶颈。

1. 传统的HTTP请求-响应模型

  • 特点:传统的Web应用主要基于HTTP协议,采用请求-响应模型。浏览器(客户端)发送请求到服务器,服务器处理请求后返回响应。
  • 限制:HTTP是单向通信,只能由客户端发起请求,服务器被动响应,无法主动推送数据给客户端。

2. 轮询(Polling)

  • 背景:随着Web应用的多样化,特别是对实时数据的需求增加,开发者开始寻求方法让服务器能够“推送”数据给客户端。
  • 方法:客户端定期(例如每几秒钟)向服务器发送HTTP请求查询是否有新数据。
  • 限制:轮询会增加服务器负载,同时由于HTTP请求头较大,造成带宽浪费。此外,频繁的请求也会影响用户体验。

3. 长轮询(Long Polling)

  • 改进:为了解决轮询带来的问题,长轮询技术应运而生。
  • 方法:客户端发起请求后,服务器在没有新数据时保持连接打开状态,直到有新数据时才返回响应。
  • 优点:相比普通轮询,减少了不必要的请求次数,提高了效率。
  • 限制:仍然基于HTTP协议,存在连接保持时间的限制,且服务器资源占用较多。

4. Server-Sent Events (SSE)

  • 介绍:SSE是一种简单的服务器推送技术,允许服务器向客户端发送事件更新。
  • 方法:服务器通过HTTP连接持续发送数据流到客户端,客户端监听这些事件并做出响应。
  • 适用场景:适用于只需要服务器向客户端推送数据的场景,如股票价格更新或新闻流。
  • 限制:仅支持单向通信,即服务器到客户端的通信。

5. WebSocket

  • 背景:随着Web应用对实时双向通信的需求日益增长,需要一种更加高效、低延迟的通信方式。
  • 特点
    • WebSocket协议是在HTML5中引入的,它提供了一种在客户端和服务器之间建立持久连接的方式。
    • 一旦连接建立,双方就可以自由地发送数据,实现了全双工通信。
    • WebSocket基于TCP/IP协议,使用HTTP进行握手,之后转换为二进制帧传输数据,大大减少了通信开销。
    • WebSocket连接一旦建立,就可以长期保持,减少了频繁建立和关闭连接的开销。

三、WebSocket协议解析

1.特点

WebSocket协议是一种在单个TCP连接上进行全双工通信的协议。它被设计用于替代HTTP协议中的轮询请求,以提供更高效的实时数据传输服务。以下是WebSocket协议的一些主要特点:

全双工通信

  • WebSocket允许服务器和客户端双向通信,即数据可以同时从客户端发送到服务器端,也可以从服务器端发送到客户端。

持久连接

  • 一旦WebSocket连接建立后,就会保持打开状态,直到其中一方关闭连接。这使得实时应用的延迟大大降低。

减少开销

  • 相比于HTTP轮询,WebSocket减少了每次消息交换所需的头部大小和其他开销,提高了数据传输效率。

高效的数据传输

  • WebSocket使用二进制帧格式传输数据,可以有效减少文本格式如JSON或XML带来的额外负载。

支持多种类型的数据

  • WebSocket不仅可以传输文本数据(UTF-8编码),还可以传输二进制数据(如图片、音频和视频等)。

心跳机制

  • WebSocket定义了心跳机制来检测连接是否仍然活动,以避免不必要的重连。

安全性

  • WebSocket支持加密连接(wss://),可以通过TLS/SSL协议保护数据传输的安全性。

多路复用

  • 尽管WebSocket本身不直接支持多路复用,但可以在一个连接上通过不同的标识符来区分不同的会话或数据流。

跨平台兼容性

  • WebSocket协议在现代浏览器中得到广泛支持,并且可以在服务器端使用多种编程语言实现。

简单易用

  • WebSocket API简单直观,易于开发人员理解和使用。

2.建立连接和数据通信

WebSocket协议建立连接的过程是一个比较典型的握手过程,它基于HTTP协议来完成。以下是WebSocket连接建立的详细步骤:

第一步: 客户端发起HTTP请求

  1. 请求发起
    • 客户端通过HTTP发起一个特殊的GET请求到服务器,该请求包含特定的Upgrade头,表明希望升级到WebSocket协议。

    • 请求行示例:

      GET /chat HTTP/1.1
      Host: server.example.com
      Upgrade: websocket
      Connection: Upgrade
      Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
      Origin: http://example.com
      Sec-WebSocket-Version: 13
      
    • 其中Sec-WebSocket-Key是一个随机生成的Base64编码的值,用于后续的握手验证。

    • Sec-WebSocket-Version指定使用的WebSocket版本,目前标准版本为13。

第二步: 服务器响应

  1. 响应确认
    • 如果服务器同意升级到WebSocket协议,则返回一个HTTP状态码101 Switching Protocols的响应。

    • 响应示例:

      HTTP/1.1 101 Switching Protocols
      Upgrade: websocket
      Connection: Upgrade
      Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
      
    • Sec-WebSocket-Accept字段包含了客户端发送的Sec-WebSocket-Key经过处理后的结果。处理方式是将Sec-WebSocket-Key与一个固定的258EAFA5-E914-47DA-95CA-C5AB0DC85B11 GUID拼接,然后计算SHA-1哈希,最后再进行Base64编码。

第三步: 握手完成

  1. 握手完成
    • 当客户端收到服务器的响应,并验证了Sec-WebSocket-Accept字段正确无误后,就完成了握手过程。
    • 此时,连接已升级为WebSocket连接,可以开始进行双向通信。

第四步: 数据传输

  1. 数据帧格式
    • WebSocket使用帧来传输数据。每个帧由一个固定长度的头部和一个可变长度的有效载荷组成。
    • 头部包括帧类型(例如文本、二进制或控制帧)、掩码标志以及掩码键(仅当客户端向服务器发送数据时需要掩码)。
  • 掩码标志以及掩码键:
    在WebSocket协议中,掩码标志和掩码键是用来保护客户端到服务器的数据不被中间人窥探的安全措施。具体来说:

掩码标志 (Mask Bit)

  • 定义:掩码标志是一个位标志,用来指示WebSocket帧中的有效载荷数据是否已经被掩码(即加密)。这个标志位于WebSocket帧头部的第一个字节中,它是第7个比特位(从右向左计数)。

  • :如果掩码标志设置为1,则表示有效载荷数据已经被掩码;如果掩码标志设置为0,则表示数据未被掩码。在客户端向服务器发送数据时,掩码标志总是设置为1;而在服务器向客户端发送数据时,掩码标志总是设置为0。

掩码键 (Masking Key)

  • 定义:掩码键是一个4字节的随机值,用于对客户端发送给服务器的数据进行掩码处理。掩码键紧随掩码标志之后出现在WebSocket帧头部。

  • 使用方法:掩码键用于对有效载荷数据进行XOR操作。具体而言,每4个字节的数据使用掩码键的一个字节来进行XOR操作。例如,第一个字节的数据与掩码键的第一个字节进行XOR,第二个字节的数据与掩码键的第二个字节进行XOR,依此类推。当数据长度不是4的倍数时,最后一个掩码键字节会被重复使用直到数据结束。

掩码操作示例

假设掩码键为 0x12 0x34 0x56 0x78,并且要发送的有效载荷数据为 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07,那么掩码操作过程如下:

  • 第1字节:0x00 XOR 0x12 = 0x12
  • 第2字节:0x01 XOR 0x34 = 0x35
  • 第3字节:0x02 XOR 0x56 = 0x56
  • 第4字节:0x03 XOR 0x78 = 0x7b
  • 第5字节:0x04 XOR 0x12 = 0x16 (掩码键循环)
  • 第6字节:0x05 XOR 0x34 = 0x37
  • 第7字节:0x06 XOR 0x56 = 0x5e
  • 第8字节:0x07 XOR 0x78 = 0x7f

因此,掩码后的数据为 0x12 0x35 0x56 0x7b 0x16 0x37 0x5e 0x7f

当服务器接收到这个掩码后的数据时,它会使用相同的掩码键来反掩码(解密)这些数据,从而恢复出原始数据。

掩码机制确保了客户端到服务器的数据不会在传输过程中被轻易读取,增加了通信的安全性。

  1. 数据传输
    • 双方可以开始发送数据帧。文本数据通常使用UTF-8编码,而二进制数据则按原样传输。
    • 控制帧用于特殊目的,比如关闭连接(Close帧)、ping和pong(Ping帧和Pong帧)等。

第五步: 连接关闭

  1. 关闭连接
    • 任何一方都可以发送一个Close帧来请求关闭连接。
    • 接收方接收到Close帧后,可以选择发送自己的Close帧作为响应。
    • 最终,双方都发送完数据后,会关闭TCP连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/404221.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚幻5|AI巡逻宠物伴随及定点巡逻—初步篇

一.建立AI基本三件套 1.建立AI基本三件套 二.使用AI的基本设置 1.打开我们想要用的AI宠物的蓝图,选中自我Actor,右侧细节处找到AI,选中对应的AI控制器 三.打开AI控制器 写如下 四,AI行为树 1.新建一个任务,命名含巡逻二字即可…

一文读懂 服务器

一文读懂 服务器 马上就是毕业季了,做好的毕设不免上云服务器来演示一下,让自己答辩时加分。但相信很多小伙伴对服务器没有一个实体的概念,不明白什么是服务器,和平时使用的计算机又有什么区别。在网络上,经常看见的什…

PHP安全开发

安全开发 PHP 基础 增:insert into 表名(列名 1, 列名 2) value(‘列 1 值 1’, ‘列 2 值 2’); 删:delete from 表名 where 列名 ‘条件’; 改:update 表名 set 列名 数据 where 列名 ‘条件’; 查:select * from 表名 wher…

Java二十三种设计模式-责任链模式(17/23)

责任链模式:实现请求处理的灵活流转 引言 在这篇博客中,我们深入探讨了责任链模式的精髓,从其定义和用途到实现方法,再到使用场景、优缺点、与其他模式的比较,以及最佳实践和替代方案,旨在指导开发者如何…

C++:平衡二叉搜索树之红黑树

一、红黑树的概念 红黑树, 和AVL都是二叉搜索树, 红黑树通过在每个节点上增加一个储存位表示节点的颜色, 可以是RED或者BLACK, 通过任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树能够确保没有一条路径会比…

Selenium + Python 自动化测试12(unittest组织更多用例)

我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。 上一篇我们讨论了unittest中test suite 的构建,可以测试多条测试用例。 本篇文章我们接着讲。使用discover()方法构建更多的测试用例。 1、引入需要完成的任务 上…

【网络编程】基于UDP的TFTP文件传输

1)tftp协议概述 简单文件传输协议,适用于在网络上进行文件传输的一套标准协议,使用UDP传输 特点: 是应用层协议 基于UDP协议实现 数据传输模式 octet:二进制模式(常用) mail:已经不再…

Linux进程间通信学习记录(IPC 机制、共享内存以及信号灯集)

0.System V IPC机制: ①.IPC对象包含:共享内存、消息队列和信号灯集。 ②.每个IPC对象有唯一的ID。 ③.IPC对象创建后一直存在,直到被显示地删除。 ④.每一个IPC对象有一个关联的KEY。(其他进程通过KEY访问对应的IPC对象&#xff…

Ubuntu安装Anaconda3

本文详细阐述了在 Ubuntu 系统中安装 Anaconda3 的完整流程。包括 Anaconda3 安装包的获取途径,具体安装过程中的每一个步骤及注意事项,还有安装后的环境变量设置和安装成功的验证方法。旨在为 Ubuntu 用户提供清晰、易懂且准确的 Anaconda3 安装指南&am…

Unity--AssetBundle AB包管理器

1.简介 AB包(AssetBundle)是Unity中用于资源管理的一种机制,它允许开发者将多个文件(如纹理、模型、音频等)打包成一个单独的文件,以便于在游戏运行时动态加载和卸载。 但是现在出现了最新的Addressable来…

docker部署drawio

1)介绍Drawio.io GitHub:GitHub - jgraph/drawio: draw.io is a JavaScript, client-side editor for general diagramming. Draw.io是一款开源的绘制流程图的工具,拥有大量免费素材和模板。程序本身支持中文在内的多国语言,创建…

【学习笔记】多元线性回归模型 —— Matlab

文章目录 前言一、多元线性回归多元线性回归模型线性模型 ( Y , X β , σ 2 I n ) (Y,X\beta,\sigma^2I_n) (Y,Xβ,σ2In​) 考虑的主要问题多元线性回归模型的参数估计多元线性回归模型和回归系数的检验 二、示例三、代码实现----Matlab1.多元回归的实现2.逐步回归的实现3.M…

图像增强技术简介

目录 一、概论 二、图像噪声 三、图像增强处理分类 一、概论 图像增强作为基本的图像处理技术,其目的是对图像进行加工,以得到对具体应用来说视觉效果更“好”更“有用”的图像。图像增强算法并不能增加原始图像的信息,而是通过某种技术手…

MVCC 详解

MVCC 简单理解 MVCC,全称 Multi-Version Concurrency Control,是多版本并发控制的意思。 在高并发情况下操作数据库可能会出现脏写、脏读、不可重复度、幻读这四个问题。通过 MVCC 可以实现在不加锁的前提下避免一些问题。 MVCC 的实现原理 多版本 …

相似度计算方法-编辑距离 (Edit Distance)

定义 编辑距离(Edit Distance),也称为Levenshtein距离,是一种衡量两个字符串相似度的方法。它定义为从一个字符串转换为另一个字符串所需的最少单字符编辑操作次数,这些操作包括插入、删除或替换一个字符。 计算方法 …

Openstack二层网络的构建和使用

Openstack二层网络的构建和使用 一、实验目的 (1)了解网络层级、子网、动态地址、网关代理等概念并进行应用。 (2)了解OpenStack项目以及相关组件。 (3)了解 Neutron 二层网络的构建和使用。 二、实验原…

tomcat Listener 内存马浅谈

本文来源无问社区,更多实战内容可前往查看http://www.wwlib.cn/index.php/artread/artid/3651.html Tomcat 介绍 Tomcat的主要功能 toncat作为一个web服务器,实现了两个核心的功能 http 服务器功能:进行socket 通信(基于TCP/I…

案例分享—国外深色UI界面设计赏析

在国外,深色界面设计(Dark Mode)已成为提升用户体验的重要趋势。它不仅有效减少屏幕亮度,保护用户视力,还能在夜晚或低光环境下提供更加舒适的浏览体验。设计师们普遍认识到,深色主题不仅提升了应用的视觉层…

Vue中下载内容为word文档

1.使用 html-docx-js:这是一个将 HTML 转换为 Word 文档的库。 2. 利用 Blob 和 FileSaver.js:创建并下载生成的 Word 文档。 在 Vue.js 中实现步骤如下: 1. npm 安装 html-docx-js 和 file-saver npm install html-docx-js npm install file-saver2.…

【vue教程】六. Vue 的状态管理

目录 往期列表本章涵盖知识点回顾Vuex 的基本概念什么是 Vuex?为什么需要 Vuex? Vuex 的核心概念stategettersmutationsactionsmodules Vuex 的安装和基本使用安装 Vuex创建 store在 Vue 应用中使用 store在组件中访问和修改状态 Vuex 的模块化模块化的好…