如果两个本地系统在同一个端口上下载相同的资源会发生什么?

Sor*_*ary 11 networking router nat port

我知道 NAT 表。我只想知道如果私有局域网中的两个客户端想要在同一个端口上下载完全相同的资源会发生什么?换句话说,当一个数据包来自服务器时,路由器如何决定哪个客户端应该得到这个数据包?

如果我没记错的话,来自服务器的传入数据包具有路由器的目标 IP 地址,该地址是公共的并且两者都相同,并且目标的端口号在这种情况下也恰好相同。

路由器或服务器中是否有任何机制可以检测到这一点?或者这种行为一开始是可能的吗?

我搜索这样的问题这样,这是有道理的,错误加薪,因为端口忙,但我问两个独立的系统。


更新:从评论中我意识到我不够清楚,所以让我用一个例子再说一遍:

我只关心设备的“源”端口。假设我有两台笔记本电脑(192.168.2.10192.168.2.11),它们都从互联网上的同一台服务器下载相同的文件。它们每个都有一个操作系统,它生成一个随机端口,因此源 IP 和源端口将类似于:192.168.2.10:6321192.168.2.11:7132。我认为在 NAT 中,路由器会设置它的(公共)IP 地址以及来自笔记本电脑的端口,所以如果家用路由器的公共 IP 地址是65.82.23.32,这两个包将分别获得这些源 IP 和源端口 :65.82.23.32:632165.82.23.32:7132

现在,当响应返回时,路由器可以从端口号中找出哪个数据包用于哪个笔记本电脑,对吗?到目前为止,一切都很好。但是,如果两台笔记本电脑意外或有意地生成完全相同的源端口,会发生什么情况?例如:192.168.2.10:6000192.168.2.11:6000。现在路由器会像以前一样将它的公共 IP 地址设置为源 IP 地址,但是现在如果它尝试使用这些端口号,这些包将具有完全相同的源 IP 和源端口号,例如 :65.82.23.32:600065.82.23.32:6000

这就是我感到困惑的地方,当响应回来时,路由器如何决定哪个数据包用于哪个笔记本电脑?

在@mfinni 的回答之后,我注意到这不是 PAT 的工作方式!NAT 设备(此处为路由器)将为每台笔记本电脑分配唯一端口(私有 IP 地址),然后使用这些唯一端口(例如77777778)发送数据包。因此,当反应回来,很显然,这包是针对笔记本电脑从端口,那么路由器将这些转换65.82.23.32:777765.82.23.32:7778到- > 192.168.2.10:6000192.168.2.11:6000分别。

jca*_*ron 43

TCP 连接(它是 HTTP 和许多其他协议的基础)由 4 个参数唯一地(在给定的时间点)定义:

  • 本地IP
  • 当地港口
  • 远程IP
  • 远程端口

即使您从同一台计算机同时发出两次相同的请求,即使两个 IP 地址相同且目标端口相同,源端口也会不同。

同样,如果您有来自两个设备的两个请求通过同一个 NAT 设备,则 NAT 设备将使用不同的源端口。根据设备的不同,它可能会保留原始源端口(如果存在冲突,则仅更改一个),或者始终独立于原始源端口分配一个新源端口。

然后,NAT 设备将为每个连接在其转换表中保留一个映射,该映射表明外部连接(外部 IP、外部源端口、目标 IP、目标端口)映射到内部连接(内部主机 IP、内部主机源端口、目标IP,目的端口)。

  • 就像它一样简单和基本 - 每个客户端连接都有一个 SOURCE 端口这一事实经常被初学者(以及有经验的程序员)忽视。我实际上有人假设源端口与目标端口相同,这显然根本不起作用(即 Web 服务器向另一个 Web 服务器发出 http 调用)。TCP的基本事实,很好解释。 (6认同)
  • 解释得很好。我会接受这个作为答案。它全面且易于理解。 (2认同)

mfi*_*nni 11

NAT 表知道每个客户端上的源端口是不同的,所以它不会意外地将错误的数据包发送到错误的内部客户端。NAT 设备也分配不同的出站端口,不同内部客户端之间的出站端口也不相同。

  • 不可以。假设来自客户端的源端口不相同。当客户端发出请求时,大多数协议的源端口将是临时端口范围内的随机空闲端口。 (2认同)

NiK*_*iZe 5

当您提及时,NAT您可能实际上指的是NAPT. 这会更改 NAT 设备中的源端口(至少在需要时)。因此,源端口将发生变化。

例如 iptables MASQUERADE

在这种情况下进行 NAT 时,还需要“连接跟踪”,它只是跟踪哪个“外部端口”与哪个“内部客户端和端口”相关。在 iptables 中你会经常看到RELATED,ESTABLISHED使用的规则。您还会发现,如果重新启动执行 NAPT 的路由器,它将断开所有连接。而没有任何 NAT 的路由器通常只会恢复任何连接。(假设它在客户端超时之前完成重新启动)

  • @SorousHBakhtiary当你说端口6000时你的意思是在服务器上还是在客户端上?您确实意识到 IP 协议中的每个数据包都由 4 位信息来标识,对吗?不仅仅是2.客户端(源)端口,客户端(源)IP,目的地(服务器-我认为这就是你所说的6000)端口,目的地IP。因此,即使同一台 PC 上的两个客户端连接到(目标)端口 6000,操作系统也会为它们随机分配不同的源端口。这就是路由器(和 NAT)用来确定路由的内容 - 源端口、源 IP、目标端口、目标 IP (2认同)

小智 5

路由器不使用与膝上型电脑在其对 WAN 的传出请求中生成的源端口号相同的源端口号,而是生成自己唯一的源端口号。路由器中的 NAT 表将 notebook1:6000 转换为 publicip:N,将 notebook2:6000 转换为 publicip:M。然后,它知道将流量从 Internet 到达的端口路由到何处。