关于 WebSocket 来源于 HTTP-upgrade 请求的知识点

举报
汪子熙 发表于 2024/11/03 11:45:35 2024/11/03
【摘要】 WebSocket 是一种允许客户端和服务器之间双向通信的协议,与传统的 HTTP 请求-响应模式有显著不同。因此,我们将从以下几个方面逐步解释这个结论。 什么是 WebSocket 协议?WebSocket 是 HTML5 引入的一种协议,用于在客户端(通常是浏览器)和服务器之间建立持久的双向连接。通过这个连接,服务器和客户端可以在无需每次发送请求的情况下实时交换数据。这使得 WebSoc...

WebSocket 是一种允许客户端和服务器之间双向通信的协议,与传统的 HTTP 请求-响应模式有显著不同。因此,我们将从以下几个方面逐步解释这个结论。

什么是 WebSocket 协议?

WebSocket 是 HTML5 引入的一种协议,用于在客户端(通常是浏览器)和服务器之间建立持久的双向连接。通过这个连接,服务器和客户端可以在无需每次发送请求的情况下实时交换数据。这使得 WebSocket 非常适用于实时应用,如在线聊天、在线游戏、实时股票行情推送等场景。

相比传统的 HTTP 协议,WebSocket 有一些显著的优势:

  • 双向通信:HTTP 是请求-响应模式,客户端发起请求,服务器返回响应。而 WebSocket 允许客户端和服务器双方主动发送数据,形成实时的双向通信。
  • 低延迟:由于 WebSocket 建立连接后,可以保持连接状态,避免了 HTTP 的请求头部开销,数据传输更快,延迟更低。
  • 节省带宽:传统的 HTTP 每次请求都要发送完整的请求头,而 WebSocket 在建立连接后,传输数据不再需要额外的头信息,节省了带宽。

为了建立 WebSocket 连接,客户端会先发起一个 HTTP 请求,要求服务器将当前的 HTTP 连接升级(Upgrade)为 WebSocket 连接,这就是 HTTP-Upgrade 过程。

WebSocket 连接的建立流程

WebSocket 连接的建立是从一个 HTTP 请求开始的。为了更好地理解“WebSocket connection results from processing an HTTP-Upgrade request”,我们可以从以下几个步骤来分析 WebSocket 的工作机制。

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

在浏览器中,当我们使用 JavaScript 的 WebSocket 对象创建 WebSocket 连接时,浏览器会向服务器发送一个特殊的 HTTP 请求。这是一个标准的 HTTP GET 请求,但其中包含了特定的头部,表示它希望将该连接升级为 WebSocket 连接。

举个例子,假设客户端请求的是 ws://example.com/socket,那么实际发送的 HTTP 请求看起来可能是这样的:

GET /socket HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

这个请求有几个关键点:

  • Upgrade: websocket:这个头部表示客户端希望将该 HTTP 连接升级为 WebSocket 连接。
  • Connection: Upgrade:表明这个连接是可升级的,这是 HTTP/1.1 协议的一部分,意味着当前的 HTTP 连接可以转换为其他类型的协议。
  • Sec-WebSocket-Key:这是一个随机生成的 Base64 编码字符串,用于确保 WebSocket 握手的安全性。服务器需要根据这个 key 计算出一个响应值,以验证请求的合法性。
  • Sec-WebSocket-Version:这个头部表示 WebSocket 协议的版本,通常为 13,这是当前最常用的版本。

可以看到,虽然客户端发起的是一个 HTTP 请求,但其中的特殊头部标明了它的目的:升级为 WebSocket。

第二步:服务器处理 HTTP-Upgrade 请求

当服务器接收到这个 HTTP 请求后,它会检查请求头部,判断该请求是否为 WebSocket 升级请求。如果请求头部中的 UpgradeConnection 符合 WebSocket 协议的要求,服务器就会执行 WebSocket 握手操作。

为了说明这一过程,可以想象一个实际场景:假设我们在开发一个在线聊天室应用,服务器运行着一个支持 WebSocket 的框架,如 Node.js 中的 ws 库。客户端通过浏览器发起连接请求,服务器会检查请求头部,确认这是一个 WebSocket 升级请求。

如果检查通过,服务器会生成一个响应,返回给客户端。这个响应包括一个计算后的 Sec-WebSocket-Accept 字段,它是服务器根据客户端的 Sec-WebSocket-Key 计算出的值,目的是为了防止第三方伪造请求。响应的内容可能如下:

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

解释一下这个响应:

  • 101 Switching Protocols:HTTP 状态码 101 表示协议切换成功,服务器同意将该 HTTP 连接升级为 WebSocket。
  • Upgrade: websocketConnection: Upgrade:再次确认服务器同意协议升级。
  • Sec-WebSocket-Accept:这个字段是根据客户端发送的 Sec-WebSocket-Key 计算得出的,通过将 Sec-WebSocket-Key 和一个常量字符串进行 SHA-1 哈希计算,并对结果进行 Base64 编码。客户端收到这个值后,会进行校验,以确保握手的安全性。

当服务器发出这个响应后,HTTP 连接会被升级为 WebSocket 连接。此时,HTTP 协议结束,WebSocket 协议接管连接。客户端和服务器可以通过这个连接进行全双工的通信。

第三步:握手成功,开始 WebSocket 通信

当客户端收到服务器返回的 101 状态码,并且 Sec-WebSocket-Accept 验证通过后,WebSocket 握手过程就完成了。这时,客户端和服务器之间已经建立起了一个持久的 WebSocket 连接。这个连接上,双方可以自由地发送和接收消息。

在聊天室应用的例子中,握手成功后,服务器和客户端可以开始通过 WebSocket 连接交换消息。用户在浏览器中输入聊天信息,浏览器通过 WebSocket 连接将消息发送到服务器。服务器接收到消息后,可以处理它并将更新广播给其他连接的客户端,所有这些操作都是通过已经建立的 WebSocket 连接完成的。

为什么 WebSocket 需要 HTTP-Upgrade?

在理解了 WebSocket 的握手过程后,回到我们一开始的问题:为什么“WebSocket connection results from processing an HTTP-Upgrade request”?为什么 WebSocket 需要经过 HTTP 协议的升级过程?

主要有以下几个原因:

  1. 兼容性:HTTP 是 Web 上最常用的协议,几乎所有的服务器都支持 HTTP。因此,使用 HTTP 作为基础协议,能够保证 WebSocket 能够被广泛支持。通过 HTTP-Upgrade 请求,客户端和服务器可以在现有的 HTTP 基础设施上建立 WebSocket 连接。

  2. 安全性:在 WebSocket 协议设计之初,考虑到了安全性问题。通过 HTTP-Upgrade 机制,客户端和服务器可以在建立 WebSocket 连接前进行一些初步的握手验证,如 Sec-WebSocket-KeySec-WebSocket-Accept 的计算与验证,确保连接不会被恶意第三方伪造。

  3. 与防火墙和代理的兼容性:很多防火墙和代理服务器只允许 HTTP 流量通过。WebSocket 连接通过 HTTP 升级建立,可以保证在这些网络设备上的兼容性。防火墙和代理通常会允许 HTTP 请求通过,而 WebSocket 协议使用了标准的 HTTP 请求头,确保在这些设备上的顺利传输。

WebSocket 与 HTTP 的区别与联系

虽然 WebSocket 是通过 HTTP 协议的升级建立的,但它们在实际应用中有显著的不同:

  • 连接模式:HTTP 是短连接模式,每次请求完成后连接就会关闭。而 WebSocket 是长连接模式,连接一旦建立,可以在整个会话期间保持。
  • 通信方式:HTTP 是单向的,客户端发起请求,服务器返回响应。而 WebSocket 是双向的,双方都可以主动发送数据。
  • 性能:由于 WebSocket 连接是持久化的,因此可以避免多次建立和关闭连接的开销,降低延迟,提升实时性。这在需要频繁数据交换的应用中具有明显的优势,如在线游戏、实时股票推送等。

真实世界案例:在线游戏中的 WebSocket 应用

为了使这些技术概念更加具体化,可以通过在线游戏的一个实际案例来说明 WebSocket 如何在服务器端通过处理 HTTP-Upgrade 请求来建立连接。

假设我们在开发一款多人在线游戏,游戏的服务器需要与每个玩家的客户端进行实时通信,更新游戏状态,如玩家的位置、得分、敌人的动态等。在这种情况下,传统的 HTTP 协议是不够用的,因为 HTTP 的请求-响应模式无法提供低延迟的实时通信。

通过 WebSocket,游戏客户端可以在用户登录后立即向服务器发起一个 WebSocket 连接请求,服务器通过 HTTP-Upgrade 请求将该连接升级为 WebSocket 连接。一旦连接建立,服务器可以实时地向客户端推送游戏状态更新,客户端也可以即时地向服务器发送玩家的输入和动作。这种双向通信确保了游戏的流畅体验。

服务器端通过处理 HTTP-

Upgrade 请求来确认连接的合法性,并与客户端完成握手过程。这种方式不仅保证了连接的安全性,同时也大大减少了每次通信的开销,使得游戏能够在几乎没有延迟的情况下进行实时更新。

总结

WebSocket 连接的建立依赖于 HTTP-Upgrade 请求的处理,这种机制使得 WebSocket 可以在现有的 HTTP 基础设施上运作,同时提供了更高效的双向通信方式。通过这种升级请求,服务器能够安全、可靠地与客户端建立长连接,允许双方进行实时的数据交换。

在实际应用中,WebSocket 广泛用于在线聊天、实时游戏、股票推送等需要低延迟、双向通信的场景。理解 HTTP-Upgrade 过程对于开发这些实时应用至关重要,它不仅涉及 WebSocket 的协议细节,还包括网络安全性和性能优化方面的考量。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。