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

时间:2016-03-23 08:15:47

标签: linux sockets go tcp websocket

阅读以下文章:10M concurrent websockets

因此,有1000个websocket服务器正在侦听端口10000-11000。当与这些服务器之一建立连接时,我假设它们从随机建立的TCP连接与随机端口继续通信。因此,当使用一个IP,并且有64K端口时,如何保持10M连接?是否通过IP端口对识别连接?可以建立从不同IP到同一端口的两个不同连接吗?这是如何工作的?

3 个答案:

答案 0 :(得分:2)

  

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

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

  

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

不是问题。

  

是否通过IP端口对识别连接?

  

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

  

这是如何在幕后工作的?

见上文。 IP:端口对。你回答了自己的问题。

答案 1 :(得分:2)

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

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

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

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

客户端(启动TCP连接的一方)受其操作系统可以为给定目标主机和端口打开的临时端口数量的限制。老实说,我不知道这是否是客户端操作系统或TCP / IP规范本身的限制。

答案 2 :(得分:0)

我认为你缺少的部分是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(端口)* 2 ^ 32(ipv4地址)连接。

实际上,有保留的IP,端口,内存限制等,所以数量要小得多。

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

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