使用 HTTP keep-alive 和 websockets (socket.io) 时的 TCP 连接数
The number of TCP connections when using HTTP keep-alive and websockets (socket.io)
我已经实现了一个 full-fledged 节点 http 服务器和 database-driven 会话管理,并且能够在顶部使用 socket.io 来实现文件上传进度条和聊天应用程序。
我还使用了 node-http-proxy 并且能够代理 websockets。在这种背景下,我有以下问题,我认为我需要知道这些问题才能成为一名有效的 socket.io 开发人员。我没有被困在任何特定的代码中,但下面要求的信息是成为有效的套接字开发人员所必须的,但似乎没有任何解释。
我的理解:
一个。 HTTP 使用 TCP 套接字作为底层传输。
在旧的 HTTP 实现中,每个请求使用一个套接字。
在较新的版本中,"Keep-alive" header 用于使套接字保持活动状态以供多个 request-response 使用。
TCP 在其信令和数据传输方面本质上是 full-duplexed,但在多个 HTTP request/response 不能同时加载到同一连接的意义上不是多路复用的。 keep-alive 标志有助于按顺序为 http request/response 事务使用相同的连接。
b。 "upgrade" HTTP header 用于将常规 http 连接升级为 websocket 连接。 websocket 连接实际上是基本的 TCP 连接,现在在 http 协议级别进行了抽象。
问题:在 websockets 握手后,现在有两个 TCP 连接还是只有一个被 http 用于 full-duplex 通信?
我的意思是,是否有一个 TCP 连接用于常规 http 请求,另一个现在用于 bi-directional 传输,像 socket.io 这样的库使用?
换句话说, header "upgrade" 是否真的意味着升级现有的 TCP 连接而不是打开一个新连接?
一个网页可以打开多个 ws-based 到同一服务器的 TCP 连接吗?例如,同一页面中的两个聊天会话由同一服务器管理?
在这种情况下,打开的 TCP 连接总数是多少?它们是什么类型?
我试图用 netstat 得到一些答案,但我无法得出任何明确的结论。 Wireshark 可能会有帮助,但我不擅长使用它。
任何澄清都会有所帮助。
A websocket connection is effectively the basic TCP connection which is now abstracted at the http protocol level.
HTTP 是 TCP 之上的协议,WebSockets 也是 TCP 之上的协议。虽然 WebSockets 从编程方面看起来很像普通套接字,但它不是纯 TCP。相反,有一些框架来获取消息边界而不是单个数据流和一些数据屏蔽,因此在使用 WebSockets 传输类似 HTTP 的情况下,愚蠢的代理不会被拒绝。
HTTP 升级将底层 TCP 连接的协议从 HTTP 切换到 Websockets 协议。一旦切换完成就没有回头路了。
Can one webpage open multiple ws-based TCP connections to the same server?
一个网页可以打开多个到同一服务器的 HTTP 连接,每个连接都可以升级到 WebSockets。 Websockets RFC 的唯一限制是浏览器不应该同时创建多个 Websockets 连接到同一主机,但没有限制它们是在彼此之后创建并且 运行 并行。
In this case, what will be the total number of open TCP connections and of what type will they be?
这取决于您的应用程序。每个 WebSockets 连接都会有一个 TCP 连接。此外,还会有其他 TCP 连接来获取 HTTP 资源。这些的确切类型(HTTP 与 HTTP/2)以及它们的数量取决于浏览器和服务器,即如果使用 keep-alive,则使用 HTTP/2 等
我已经实现了一个 full-fledged 节点 http 服务器和 database-driven 会话管理,并且能够在顶部使用 socket.io 来实现文件上传进度条和聊天应用程序。 我还使用了 node-http-proxy 并且能够代理 websockets。在这种背景下,我有以下问题,我认为我需要知道这些问题才能成为一名有效的 socket.io 开发人员。我没有被困在任何特定的代码中,但下面要求的信息是成为有效的套接字开发人员所必须的,但似乎没有任何解释。
我的理解:
一个。 HTTP 使用 TCP 套接字作为底层传输。 在旧的 HTTP 实现中,每个请求使用一个套接字。 在较新的版本中,"Keep-alive" header 用于使套接字保持活动状态以供多个 request-response 使用。 TCP 在其信令和数据传输方面本质上是 full-duplexed,但在多个 HTTP request/response 不能同时加载到同一连接的意义上不是多路复用的。 keep-alive 标志有助于按顺序为 http request/response 事务使用相同的连接。
b。 "upgrade" HTTP header 用于将常规 http 连接升级为 websocket 连接。 websocket 连接实际上是基本的 TCP 连接,现在在 http 协议级别进行了抽象。
问题:在 websockets 握手后,现在有两个 TCP 连接还是只有一个被 http 用于 full-duplex 通信? 我的意思是,是否有一个 TCP 连接用于常规 http 请求,另一个现在用于 bi-directional 传输,像 socket.io 这样的库使用? 换句话说, header "upgrade" 是否真的意味着升级现有的 TCP 连接而不是打开一个新连接? 一个网页可以打开多个 ws-based 到同一服务器的 TCP 连接吗?例如,同一页面中的两个聊天会话由同一服务器管理? 在这种情况下,打开的 TCP 连接总数是多少?它们是什么类型?
我试图用 netstat 得到一些答案,但我无法得出任何明确的结论。 Wireshark 可能会有帮助,但我不擅长使用它。 任何澄清都会有所帮助。
A websocket connection is effectively the basic TCP connection which is now abstracted at the http protocol level.
HTTP 是 TCP 之上的协议,WebSockets 也是 TCP 之上的协议。虽然 WebSockets 从编程方面看起来很像普通套接字,但它不是纯 TCP。相反,有一些框架来获取消息边界而不是单个数据流和一些数据屏蔽,因此在使用 WebSockets 传输类似 HTTP 的情况下,愚蠢的代理不会被拒绝。
HTTP 升级将底层 TCP 连接的协议从 HTTP 切换到 Websockets 协议。一旦切换完成就没有回头路了。
Can one webpage open multiple ws-based TCP connections to the same server?
一个网页可以打开多个到同一服务器的 HTTP 连接,每个连接都可以升级到 WebSockets。 Websockets RFC 的唯一限制是浏览器不应该同时创建多个 Websockets 连接到同一主机,但没有限制它们是在彼此之后创建并且 运行 并行。
In this case, what will be the total number of open TCP connections and of what type will they be?
这取决于您的应用程序。每个 WebSockets 连接都会有一个 TCP 连接。此外,还会有其他 TCP 连接来获取 HTTP 资源。这些的确切类型(HTTP 与 HTTP/2)以及它们的数量取决于浏览器和服务器,即如果使用 keep-alive,则使用 HTTP/2 等