由于 websocket 的大量使用,网络设备会耗尽临时端口吗?

网络工程 tcp 联网
2022-03-02 03:25:58

这可能是一个非常愚蠢的问题,但我真的很想了解。

我的理解是 tcp 连接保持打开状态表明客户端和服务器之间的每个网络设备都在为连接主动分配一个临时端口,以便响应可以正确到达客户端。

因此,当打开 websocket 连接时,这应该意味着只要套接字处于启动状态,并且客户端和服务器之间的所有网络设备实际上都保持其临时打开状态之一只是为了服务一个客户端,同一个 tcp 连接就会保持打开状态?

在这种情况下,网络设备是否可能会用完临时端口?

我在这里想念什么?谁能指导我,以便我可以尝试更好地了解这里的底层过程?

3个回答

保持打开的 tcp 连接表示客户端和服务器之间的每个网络设备都在主动为连接分配一个临时端口,以便响应可以正确到达客户端。

不完全的。临时端口仅用于客户端(普通用户级应用程序只能分配临时端口)。服务器将其已知端口用于所有会话(例如 443 用于 HTTPS)。中间路由器仅通过目标 IP 转发 IP 数据包 (L3),而不管其有效负载、L4 协议等。

在源 NAT 的情况下,私有到公共 NAT 路由器在其 WAN 接口(单个公共 IP 地址或地址池)上分配一个公共源端口,理论上可以与连接到其他地方的其他 NAT 会话共享。

服务器端的目标 NAT 路由器(公共到私有)不需要其 LAN 接口上的端口。它只是根据其转发表替换目标 IP 和 L4 端口。

基本上,套接字仅在客户端上绑定一个临时端口,如果适用,在源 NAT 路由器上绑定。

TCP 连接的特征在于 4 个参数:源和目标端口,以及源和目标 IP 地址(v4 或 v6)。因此,您可以在任意两台设备之间建立 64K 连接,这不会妨碍任何一方与第三台主机的连接。

客户端和服务器之间的网络设备通常工作在 IP 级别,不关心 TCP 端口。最大的例外是 NAT(网络地址转换),一种在客户端设备之间共享单个 IPv4 地址的黑客攻击。在这种情况下,到单个服务器的 64K 连接在这些客户端之间共享。

对于某些负载均衡器/代理配置来说,临时端口耗尽是一个真正的问题,其中在相同的两个对等点/IP 地址之间建立了大量的 TCP 连接。

NGINX 有一篇很好的文章,介绍了如何识别日志中的问题以及缓解问题的方法。这篇文章是特定于 Linux 的,但讨论的概念对 TCP 是通用的。

如果您在您的环境中有这种担忧,您可能会在超级用户论坛中得到更好的讨论。但是,您可能会考虑保持活动的可能性,或者在您的 websocket 服务器上打开更多 TCP 端口并在它们之间分配连接,以减轻您遇到的任何临时端口限制。