我有很多(成千上万)连接的移动设备维持与服务器的打开连接。如果我对64k连接限制的理解是正确的,那么每个客户端IP的服务器单个端口的连接数不能超过64k(因为TCP / IP协议)(因为客户端的临时端口范围)
但大多数情况下,您处于这样的环境中,这些设备通过使用NAT转换地址的网络提供商进行连接。 (例如,智能手机没有静态IP地址)。
因此,在这种情况下,我的服务器将看到相同的IP地址,并且没有任何保证源端口在2个不同的客户端中不会相同。
我的问题可能是愚蠢的,但它是:如果我们在这种情况下将连接视为5元组(协议,服务器端口,服务器IP,客户端IP,客户端端口),我的服务器如何识别正确的连接? ?是否存在丢失两个不同客户之间的连接或冲突的风险?
答案 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
之后),它可能会拒绝打开与它的新连接。