javascript - 一个 HTTP 请求和一条 WebSocket 消息,然后断开连接——网络上什么更昂贵?

标签 javascript node.js rest http websocket

假设,由于服务器限制,我们无法与 WebSocket 客户端使用开放的双向连接。但是,我们可以打开 WebSocket 连接接收消息,然后立即断开连接。或者,您可以对相同信息发出 GET 请求。

WebSockets 源自 HTTP 请求升级,然后套接字开始。如果您可以使用 Websockets 进行一条消息传递,则 header 会减少。然后,到 RESTful 端点的 HTTP 只需要一个请求。

考虑到网络流量,哪种方法需要更少的时间来检索相同的信息?

最佳答案

纯粹从网络 Angular 来看,单个 HTTP GET 请求将更加高效,因为它只是单个请求/响应。如果您要保持 webSocket 打开并通过它发送大量流量,特别是当您发送大量小消息时,webSocket 可能会变得更加高效。但是,对于临时 webSocket 来说,建立 webSocket 连接的额外开销会降低单个请求/响应的效率。

以下是每个过程中发生的情况的说明:

HTTP GET 请求:

Establish TCP socket (back and forths to establish the socket, more if TLS)

// http request
GET /someURL HTTP/1.1
Host: example.com:8000
OtherHeaders: otherValues

并且,http 响应:

HTTP/1.1 200
OtherHeaders: otherValues

data...

Close socket

对于 webSocket:

Establish TCP Socket  (back and forths to establish the socket, more if TLS)

// webSocket connection request
GET /someURL HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

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

// Then send actual webSocket message request in webSocket data frame format

// Then receive webSocket message response in webSocket data frame format (if response required)

Close socket

因此,由于建立 webSocket 连接的一些额外开销,临时 webSocket 连接的客户端和服务器之间有更多的往返次数。当您看到建立 webSocket 连接都是以 http 请求/响应开始,然后才通过建立的 webSocket 连接发送实际数据时,这就更容易理解了。

而使用 http 连接时,您可以立即发送实际请求。

Considering the network traffic which method requires less to retrieve the same information?

对于单个请求/响应,普通 HTTP 请求/响应将使用较少的网络流量,因为它避免了设置 webSocket 连接的额外开销。

WebSockets originate with a HTTP request upgrade then the socket begins. If you can make one message delivery with Websockets the header is reduced.

是的,webSockets 可以让您更有效地发送某些类型的数据,因为它们可以让您只发送您想要发送的有效负载,而无需大量额外的 header ,但是对于只有一个请求,您只需发送一个完整的 http 请求/响应设置 webSocket 连接,这样您就不会意识到仅使用 webSocket 连接处理一条消息时所节省的净成本。如果(我想您已经意识到),如果您保持 webSocket 连接打开一段时间并通过它发送许多小消息,那么它会比普通 HTTP 更有效。但是,您的情况显然并非如此。

关于javascript - 一个 HTTP 请求和一条 WebSocket 消息,然后断开连接——网络上什么更昂贵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57515475/

相关文章:

javascript - 每次用户单击同一个按钮时如何显示 N 个 div?

javascript - 我在 graphql/graphql-js 仓库中找到了 `Object.prototype.inspect` 代码片段,什么情况下会调用它?

node.js - 套接字重新连接问题

node.js - 如何在 Node.js 中区分命令行参数

node.js REST api 身份验证和 oauth2

javascript - $.post 后面跟着 form.submit 似乎取消了 $.post

javascript - Sequelize : Object does not return after creation. 无错误。数据库中存在的对象

javascript - NodeJs - 从 JWT token 中检索用户信息?

java - HomePageController 中的字段 itemRepository 需要一个 ItemRepository 类型的 bean,但无法找到

java - 使用一个不完全是 JSON 的主体