Sockets 64k连接神话与NAT翻译

Sockets 64k连接神话与NAT翻译,sockets,networking,tcp,server,Sockets,Networking,Tcp,Server,我有很多(成千上万)连接的移动设备,它们与服务器保持开放连接。如果我对64k连接限制的理解是正确的,那么每个客户端IP到服务器的单个端口的连接不能超过64k(因为TCP/IP协议)(因为客户端的临时端口范围) 但大多数情况下,您所处的环境中,这些设备通过使用NAT转换地址的网络提供商连接。(例如,智能手机没有静态IP地址) 因此,在这个上下文中,我的服务器将看到相同的ip地址,并且不能保证源端口在两个不同的客户端中不相同 我的问题可能很愚蠢,但问题是:在这种情况下,如果我们将连接视为5元组(协议

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

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

因此,在这个上下文中,我的服务器将看到相同的ip地址,并且不能保证源端口在两个不同的客户端中不相同

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

我的服务器将看到相同的ip地址,并且没有任何东西可以保证源端口在两个不同的客户端中不相同[…]是否存在丢失连接或冲突的风险

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

因此:


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

好的。谢谢你的明确回答。我认为网络提供商的NAT(主要用于2G/3G/4G类型的移动网络)可以轻松处理此用例。@jobou好的解决方案之一是让您的NAT在右侧有多个IP地址。:)ISP可以很好地做到这一点。
Client | IP | Src | < NAT > | IP | Src | Dest   | Dst
====================================================== 
1      | .1 |  42 | <-----> | .3 |   1 | Server | 80 
2      | .2 |  84 | <-----> | .3 |   2 | Server | 80
11.0.0.3:1 - Server:80 
11.0.0.3:2 - Server:80