我认为,为了回答这个问题,我们需要理解的是在整个WebSocket创建过程中基础TCP连接如何精确地演变。您将认识到WebSocket连接的 粘性
部分是基础TCP连接本身。我不确定在WebSockets上下文中“会话”的含义。
在较高级别上,启动“ WebSocket连接”要求客户端向HTTP服务器发送HTTP
GET请求,而该请求包括
Upgrade标头字段。现在,为了实现此请求,客户端需要建立与HTTP服务器的TCP连接(这可能很明显,但是我认为在此处明确指出这一点很重要)。然后,通过
相同的 TCP连接发送后续的HTTP服务器响应。
请注意,现在,在发送服务器响应之后,如果客户端或服务器未主动关闭TCP连接,则该TCP连接仍然处于打开/活动状态。
现在,根据RFC
6455,WebSocket标准,在第4.1节的末尾:
如果服务器的响应如上所述得到验证,则
表示 已建立
WebSocket连接,并且WebSocket连接处于OPEN状态
我从这里了解到,客户端在发送初始HTTP
GET(升级)请求之前发起的同一TCP连接将保持打开状态,从现在开始将用作全双工WebSocket连接的传输层。这很有道理!
关于您的问题,这意味着负载平衡器将仅在发出初始HTTP GET(升级)请求 之前 ,即 在
两个通信端点之间建立涉及该WebSocket连接创建的一个和唯一的TCP连接 之前
,扮演角色。。此后,TCP连接将保持建立状态,并且不能通过两者之间的网络设备“重定向”。 __
我们可以得出这样的结论:在您的会话术语中 ,TCP连接定义了会话 。只要WebSocket连接处于活动状态(即未终止),就 可以定义
并提供并驻留在其自己的会话中。没有什么可以改变这个会议。在这张图中,两个独立的WebSocket连接不能共享同一会话。
如果您用“会话”引用其他内容,则可能是应用程序层引入的会话,我们无法对此进行评论。
根据您的评论进行编辑:
所以您说的是负载平衡器不参与TCP连接
不,至少在总体上是不正确的。从某种意义上说,它可以决定如何处理客户端连接尝试,它绝对会影响TCP连接的建立。具体细节取决于负载均衡器的确切类型(,请参见下文)。重要提示:在两个端点之间建立连接后-
虽然我不认为负载均衡器是一个端点,但我指的是WebSocket客户端和WebSocket服务器-
两个端点在WebSocket连接的生命周期中将不再更改。负载均衡器可能仍在网络路径中,但可以假定不再具有影响力。
因此,全双工连接是在客户端和最终服务器之间吗?
是!
***有不同类型的负载平衡。根据类型,在两个端点之间建立连接后,负载均衡器的作用会有所不同。例子:
- 如果负载平衡是基于DNS发生的,则负载平衡器完全不参与最终的TCP连接。它只是告诉客户端哪个主机必须 直接 连接。
- 如果负载均衡器的工作方式类似于AWS的第4层ELB(此处提供文档),则可以说它代理了TCP连接。因此,客户端实际上会将ELB本身视为服务器。但是,发生的情况是,ELB只是沿两个方向转发包裹,而没有进行任何更改。因此,它仍然透明地大量参与TCP连接。在这种情况下,实际上涉及两个永久TCP连接:一个从您到ELB,一个从ELB到服务器。这些在WebSocket连接的整个生命周期中都是永久的。



