WebSocket协议解析与Java实践

一、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连接。
  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TracyCoder123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值