我认为您缺少的部分是 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 对)