我知道 NAT 表。我只是想知道如果私有局域网中的两个客户端想要在同一个端口上下载完全相同的资源会发生什么?换句话说,当数据包来自服务器时,路由器如何决定哪个客户端应该获取此数据包?
如果我没错的话,来自服务器的传入数据包具有路由器的目标 IP 地址,该地址是公共的,并且对于两者而言都是相同的,而且目标的端口号在这种情况下也恰好相同。
路由器或服务器中是否有任何机制可以检测到这种情况?或者这种行为一开始是否可能?
我搜索过类似的问题这,这是有道理的,因为端口繁忙而引发错误,但我询问的是两个独立的系统。
更新 :从评论中我意识到我说的不够清楚所以让我用一个例子再说一遍:
我只关心设备的“源”端口。假设我有两台笔记本电脑(192.168.2.10
和192.168.2.11
),它们都从互联网上某处的同一台服务器下载相同的文件。它们每个都有一个操作系统,它会生成一个随机端口,因此源 IP 和源端口将类似于:192.168.2.10:6321
和192.168.2.11:7132
。我认为在 NAT 中,路由器将设置其(公共)IP 地址以及笔记本电脑的端口,因此如果家用路由器的公共 IP 地址是65.82.23.32
,这两个包将分别获得这些源 IP 和源端口:65.82.23.32:6321
和65.82.23.32:7132
。
现在,当响应返回时,路由器可以根据端口号确定哪个数据包是发往哪台笔记本电脑的,对吗?到目前为止一切顺利。但如果两台笔记本电脑意外或故意生成完全相同的源端口,会发生什么情况?例如:192.168.2.10:6000
和192.168.2.11:6000
。现在路由器将像以前一样将其公共 IP 地址设置为源 IP 地址,但现在如果它尝试使用这些端口号,这些包将具有完全相同的源 IP 和源端口号,例如:65.82.23.32:6000
和65.82.23.32:6000
。
这就是我感到困惑的地方,当响应返回时,路由器如何决定哪个数据包适合哪台笔记本电脑?
在 @mfinni 回答之后,我注意到 PAT 的工作方式并非如此!NAT 设备(此处为路由器)将为每台笔记本电脑分配唯一端口(私有 IP 地址),然后使用这些唯一端口发送数据包(例如7777
和)。因此,当响应返回时,可以清楚地知道哪个数据包来自端口的哪个笔记本电脑,然后路由器会将这些,分别7778
转换为 -- > 。65.82.23.32:7777
65.82.23.32:7778
192.168.2.10:6000
192.168.2.11:6000
答案1
TCP 连接(HTTP 和许多其他协议的基础)在给定的时间点由 4 个参数唯一定义:
- 本地 IP
- 本地端口
- 远程 IP
- 远程端口
即使你从同一台计算机同时两次发出相同的请求,即使两个 IP 地址相同、目标端口相同,但源端口也会不同。
同样,如果两个设备发出两个请求,且这些请求通过同一个 NAT 设备,则 NAT 设备将使用不同的源端口。根据设备的不同,它可能会保留原始源端口(并且仅在发生冲突时更改一个源端口),或者始终独立于原始源端口分配新源端口。
然后,NAT 设备将在其转换表中为每个连接保留一个映射,该映射指出外部连接(外部 IP、外部源端口、目标 IP、目标端口)映射到内部连接(内部主机 IP、内部主机源端口、目标 IP、目标端口)。
答案2
NAT 表知道每个客户端上的源端口是不同的,因此它不会意外地将错误的数据包发送到错误的内部客户端。NAT 设备还会分配不同的出站端口,这些端口在不同的内网客户端之间是不一样的。
答案3
当你提到NAT
你实际上可能指的是NAPT
。这会更改 NAT 设备中的源端口(至少在需要时)。因此源端口将会更改。
例如iptables
MASQUERADE
在这种情况下执行 NAT 时,还需要“连接跟踪”,它只是跟踪哪个“外部端口”与哪个“内部客户端和端口”相关。在 iptables 中,您经常会看到RELATED,ESTABLISHED
使用的规则。您还会发现,如果重新启动执行 NAPT 的路由器,它将断开所有连接。而没有任何 NAT 的路由器通常会恢复任何连接。(假设它在客户端超时之前完成重新启动)
答案4
路由器不使用笔记本电脑在向 WAN 发出的请求中生成的相同源端口号,而是生成自己独特的源端口。路由器中的 NAT 表将 laptop1:6000 转换为 publicip:N,将 laptop2:6000 转换为 publicip:M。然后它知道根据来自 Internet 的流量到达哪个端口将传入数据包路由到哪里。