64k连接神话和NAT翻译

时间:2015-10-20 08:22:21

标签: sockets networking tcp server

我有很多(成千上万)连接的移动设备维持与服务器的打开连接。如果我对64k连接限制的理解是正确的,那么每个客户端IP的服务器单个端口的连接数不能超过64k(因为TCP / IP协议)(因为客户端的临时端口范围)

但大多数情况下,您处于这样的环境中,这些设备通过使用NAT转换地址的网络提供商进行连接。 (例如,智能手机没有静态IP地址)。

因此,在这种情况下,我的服务器将看到相同的IP地址,并且没有任何保证源端口在2个不同的客户端中不会相同。

我的问题可能是愚蠢的,但它是:如果我们在这种情况下将连接视为5元组(协议,服务器端口,服务器IP,客户端IP,客户端端口),我的服务器如何识别正确的连接? ?是否存在丢失两个不同客户之间的连接或冲突的风险?

1 个答案:

答案 0 :(得分:3)

  

我的服务器将看到相同的IP地址,并且没有任何保证源端口在2个不同的客户端中不会相同[...]是否存在丢失连接或冲突的风险?

不,这是执行NAT的路由器的工作:保持一侧的IP:端口组合与另一侧的端口组合相连。

所以:

Client | IP | Src | < NAT > | IP | Src | Dest   | Dst
====================================================== 
1      | .1 |  42 | <-----> | .3 |   1 | Server | 80 
2      | .2 |  84 | <-----> | .3 |   2 | Server | 80

鉴于两个客户端(源IP 10.0.0.1,源端口42)和(源IP 10.0.0.2,源端口84)希望在端口80连接到您的服务器,然后NAT将转换其IP:端口对在NAT的其他(右)侧有效的一对(例如11.0.0.3),通过给它们一个唯一的源端口(在那个侧) NAT)。它会将此转换保留在内存中,以便能够以两种方式发送数据包。

您会看到NAT右侧的元组(所以您的服务器看到的)是唯一的:

11.0.0.3:1 - Server:80 
11.0.0.3:2 - Server:80

如果路由器确定可能的服务器元组已耗尽(因此在11.0.0.3:65535 - Server:80之后),它可能会拒绝打开与它的新连接。