sockets - 64k 连接误区和 NAT 转换

标签 sockets networking tcp server

我有很多(数万个)已连接的移动设备,它们保持与服务器的开放连接。如果我对 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/

相关文章:

c - 读取 C 中文件传输的可执行文件的字符

Java - 无法与 ServerSocket 连接

linux - tcpdump 是否受 iptables 过滤的影响?

linux - 超过一定大小 (~1450) 的 TCP 消息获取 "stuck"

java - 如何在java中接收socketServer上的对象

javascript - 通过 JavaScript 连接到套接字(没有 flash)

linux - 如果我将 tomcat 7 绑定(bind)到第二个 IP 地址,它会在需要时使用第一个 IP 地址吗?

android - 以编程方式切换 "Restrict Background Data"

c++ - 向 TCP 流添加加密?

c# - NetworkStream.DataAvailable 更新缓慢