2017-06-17 219 views
3

我已经被甲骨文阅读this socket tutorial和偶然发现了以下文字:在tcp连接中,服务器如何可能在一瞬间处理超过65535个客户端?

如果一切顺利的话,服务器接受连接。一旦接受,服务器将获得绑定到同一本地端口的新套接字,并且其远程端点将设置为客户端的地址和端口。它需要一个新的套接字,以便它可以继续监听原始套接字的连接请求,同时适应所连接的客户端的需要。

现在,如果我没有错,那么端口大小是16位,这限制了65K左右端口的最大数量。这意味着,如果服务器的所有端口都绑定到某个客户端本地端口,则无法在任何时候处理超过65535个连接。虽然在stackoverflow上的一些答案如this表明对活动连接没有限制。什么是对的,什么是错的?

编辑1:如果确实是一个服务器不能处理超过2^16-1的连接,那么如何像Google网站处理这一限制?

回答

3

唯一的TCP连接是由客户端IP,客户端端口,服务器的IP和服务器端口的唯一组合来定义。对于特定的服务服务器,IP和端口是恒定的(即端口80用于HTTP),但客户端IP和端口可能会有所不同。由于端口范围仅仅是1..65535这意味着服务器只能处理从在同一时间同一客户端IP地址最多65535不同的连接,因为这些是连接元组的时候只有所有可能的唯一组合端口可以​​改变。但是,如果有多个IP地址不同的客户端,则这些限制分别适用于这些客户端。然后,如果您查看不同IP地址(IPv4和IPv6)的数量,您会发现服务器理论上可以处理的连接数量基本上没有实际限制。

在实践中每一个TCP连接在服务器需要存储器,因为当前状态必须保持。需要在内核及应用描述符文件和应用协议状态等附加的存储器这意味着,有基于这可能是小于64K而且方式更多,这取决于该系统和其配置在机器的资源的实际限制。

-1

他们使用你的ISP像NAT(网络地址转换)。 你可以在路由器后面访问不同的电脑,因为你的路由器的路由映射到内部的PC。

E.g.谷歌数据中心做同样的事情。将“Google.com”映射到不同的内部服务器,允许他们总共接受超过65k的连接。

相关问题