我有很多(数万个)已连接的移动设备,它们保持与服务器的开放连接。如果我对 64k 连接限制的理解是正确的,则每个客户端 IP 与服务器的单个端口的连接不能超过 64k(因为 TCP/IP 协议(protocol))(因为客户端的临时端口范围) .
但大多数时候,您处于这些设备通过使用 NAT 转换地址的网络提供商连接的环境中。 (例如,智能手机不会有静态 IP 地址)。
因此,在这种情况下,我的服务器将看到相同的 IP 地址,并且不能保证 2 个不同客户端中的源端口不会相同。
我的问题可能很愚蠢,但事实是:在这种情况下,如果我们将连接视为 5 元组(协议(protocol)、服务器端口、服务器 IP、客户端 IP、客户端端口),我的服务器如何识别正确的连接?两个不同客户端之间是否存在失去连接或冲突的风险?
最佳答案
my server will see the same ip address and nothing guarantees that the source port won't be the same in 2 different clients [...] Is there a risk of losing a connection or conflicts?
不,这是执行 NAT 的路由器的工作:将一侧的 IP:端口组合保持链接到另一侧的 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
之后),它可能会拒绝打开与其的新连接。
关于sockets - 64k 连接误区和 NAT 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33231552/