为了账号安全,请及时绑定邮箱和手机立即绑定

在单个 IP 上维护超过 65535 个连接

在单个 IP 上维护超过 65535 个连接

Go
慕斯709654 2021-12-27 15:42:17
因此,有 1000 个 websocket 服务器侦听端口 10000-11000。当与这些服务器之一建立连接时,我假设它们继续从随机建立的 TCP 连接与随机端口进行通信。那么,当使用一个IP,并且有64K端口时,如何保持10M连接?连接是否由 IP 端口对识别?可以建立从不同 IP 到同一端口的两个不同连接吗?这是如何在引擎盖下工作的?
查看完整描述

3 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

当与这些服务器之一建立连接时,我假设它们继续从随机建立的 TCP 连接与随机端口进行通信。

错误的假设。它们使用正在侦听的相同本地端口号与客户端通信。

那么,当使用一个IP,并且有64K端口时,如何保持10M连接?

不是问题。

连接是否由 IP 端口对识别?

是的。

可以建立从不同 IP 到同一端口的两个不同连接吗?

是的。

这是如何在引擎盖下工作的?

往上看。IP:端口对。你是在自问自答。


查看完整回答
反对 回复 2021-12-27
?
忽然笑

TA贡献1806条经验 获得超5个赞

很抱歉完全改变了我的答案。

如果机器有足够的内存和处理能力,Linux 可以轻松支持数百万个打开的套接字。TCP/IP 堆栈允许这样做,因为操作系统针对给定 TCP 数据包的目标套接字由源和目标 IP 以及端口元组确定。

实现 websocket 协议的服务器只需要侦听单个 TCP 套接字,通常由 HTTP 或 HTTPS 端口号定义,但在本示例中不需要。作为标准 TCP 握手的一部分,当接收到作为 websocket 请求的 HTTP 请求时,服务器操作系统和应用程序为与新客户端的 TCP 连接打开一个唯一的套接字。websocket 包负责将这个新套接字上使用的协议从标准 HTTP 升级到 websocket。

在示例中,为每个 websocket 套接字启动了一个 goroutine。

客户端,即发起 TCP 连接的一侧,受到其操作系统可以为给定目标主机和端口打开的临时端口数量的限制。老实说,我不知道这是客户端操作系统的限制还是 TCP/IP 规范本身的限制。


查看完整回答
反对 回复 2021-12-27
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

我认为您缺少的部分是 TCP 连接实际上是两对 IP:PORT。

一种用于服务器,一种用于客户端。

tcp 套接字的侦听端通常总是相同的 IP/端口对。

示例:net.Listen("tcp", ":8080")正在侦听端口 8080(在这种情况下在所有接口上)

连接(客户端)端通常使用单个传出 IP 和随机端口。

示例:net.Dial("tcp","server:8080)选择一个随机可用的临时端口,然后尝试连接到server:8080

因此,在上面的示例中,该连接是:(client.ip:32768 -> server.ip:8080其中 32768 是所选的临时端口)

这两对组合形成了独特的联系。

服务器端可以从单个客户端获取与可用(客户端)端口一样多的连接。如果有 IP 地址,也可以使用尽可能多的客户端。

把它想象成,对于一个监听套接字,理论上你可以有 2^16(ports) * 2^32(ipv4 addrs) 个连接。

实际上,有保留的 IP、端口、内存限制等,因此数量要少得多。

例如,Linux 上的临时端口范围是 32768 - 61000。这意味着如果我net.Dial("tcp", "server:8080")超过 28232 次,我将开始收到错误,因为我将用尽给定服务器地址的临时端口范围。但是,如果服务器正在侦听 2 个单独的端口,我可以对第一个端口执行 28232,对第二个端口执行另一个 28232。

当您看到人们进行 10MM 连接测试时,他们必须使用多个客户端 IP 或多个服务器 IP/端口来实现这一点(或两者的组合以获得 10MM 唯一的客户端:ip/服务器:ip 对)


查看完整回答
反对 回复 2021-12-27
  • 3 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信