为什么我们需要 L7 反向代理来增加到后端的最大 TCP 连接限制?

为什么我们需要 L7 反向代理来增加到后端的最大 TCP 连接限制?

我偶然发现了一个YouTube 视频 - 5 分钟这说明,即使客户端和服务器之间有反向代理,它们之间可以打开的连接数在技术上也没有限制。我发现,在反向代理和后端服务器之一之间最多可以打开 64k 个连接(假设后端服务器目前侦听单个端口)。

视频中提到 64k 是 L4 代理的极限,这就是 L4 代理不可扩展的原因。这里的“不可扩展”是什么意思? 它还提到我们不能重用同一个 TCP 连接做其他事情,为什么? 在 HTTP/2.0 推出后,我们可以使用相同的 TCP 连接发送各种 HTTP 请求,那么为什么 L4 代理不能这样做呢?为什么它不能通过一个 TCP 连接转发它必须发送到给定后端服务器的所有流量,它只需用新标头替换旧的 TCP 和 IP 标头(以新的源 IP 作为其自身,以新的目标 IP 作为后端之一,同样替换端口)。它不必在 HTTP 帧中寻找任何东西。如果我的理解不正确,请告诉我。另外,为什么与后端的 L4 连接被称为“有状态的”

据我所知,L7 代理只需获取 HTTP 帧并提取请求正文并找到将请求转发到哪个精确的后端。它有什么额外的智能,可以使用相同的 TCP 连接来转发 L4 代理所没有的各种请求

我认为 L4 和 L7 之间的唯一区别是 L4 不会深入了解 HTTP 请求内部的细节,而 L7 却知道这一点。

答案1

这里的“不可扩展”是什么意思?

与后端的 TCP 连接数量有限,不能超出。

...我们不能将同一个 TCP 连接重用于其他任何用途,为什么呢?

客户端到 L4 代理的活动连接与代理到后端的连接之间存在 1:1 的关系。数据在这些连接上转发,无需进一步解释。从代理到后端的连接会在客户端和代理之间的连接关闭的同时关闭。此后,人们会使用相同的源端口(但会有一些延迟),但这不是连接重用 - 它是一个具有相同端口、ip 元组(但可能有不同的序列号)的新连接。

在 HTTP/2.0 出现之后,我们可以使用相同的 TCP 连接发送所有类型的 HTTP 请求,那么为什么 L4 代理不能这样做呢?

因为 L4 仅表示传输层(TCP、UDP),并且此级别没有 HTTP、请求等概念。唯一的方法是按原样转发数据。请注意,L4 代理不仅可以用于 HTTP,还可以用于 SSH 等,即甚至没有像 HTTP 那样的请求概念的协议。

它只需用新的报头替换旧的 TCP 和 IP 报头

L4 代理不会对原始 IP 和端口进行隧道传输,而是将其替换为代理所在系统的新 IP 和端口。它不能直接替换正在运行的 TCP 连接中的源 IP 和端口 - TCP 的工作方式并非如此。

为什么与后端的 L4 连接被称为“有状态的”?

因为它保持了外部连接(客户端到代理)和内部连接(代理到后端)之间的关联 - 这就是状态。

我认为 L4 和 L7 之间的唯一区别是 L4 不会深入了解 HTTP 请求内部的细节,而 L7 却知道这一点。

L7 代理在请求级别工作,可以对来自客户端不同 TCP 连接的请求使用相同的 TCP 连接。L4 代理无法做到这一点。

答案2

您产生误解的根源可能在于对连接的本质的理解,连接是使用临时端口完成的。

上游服务器只能处理来自同一客户端的 64k 个连接,因为 64K 是客户端临时端口范围的限制。

这是一个 例子 如何分配超过 64K 个连接:

但是您可以将多个 IP 地址分配给负载均衡器的同一个私有接口,并强制服务器以循环方式使用它们。

您可以在负载均衡器的同一个接口上定义多个网络,例如:

  • 192.168.1.1,
  • 192.168.2.1,
  • 192.168.3.1

并在上游服务器上定义相应的额外 IP 地址:

  • 192.168.1.2,
  • 192.168.2.2,
  • 192.168.3.2。

通过以下上游配置,负载均衡器将使用不同的 IP 地址将请求传递到同一个上游服务器:

upstream ipproxy {
  server 192.168.1.2:some-port;
  server 192.168.2.2:some-port;
  server 192.168.3.2:some-port;
}

负载均衡器将被强制使用不同的 IP 地址,从而允许您绕过 64k 连接限制并实现 192k 连接。

相关内容