如果我有两台内部计算机通过 NAT 路由器连接到同一个外部 IP 地址,路由器如何将流量传送到正确的内部计算机?据我了解,NAT 将传入数据包转发到最近将传出数据包发送到 [传入数据包] 发件人 IP 地址的计算机。由于两台计算机都发送到相同的地址,路由器是否将数据包转发给两者?如果是这种情况,客户端软件是否有责任确定哪些数据包是相关的?
如果两台计算机都尝试连接到同一个端口,是否有可能?
如果我有两台内部计算机通过 NAT 路由器连接到同一个外部 IP 地址,路由器如何将流量传送到正确的内部计算机?据我了解,NAT 将传入数据包转发到最近将传出数据包发送到 [传入数据包] 发件人 IP 地址的计算机。由于两台计算机都发送到相同的地址,路由器是否将数据包转发给两者?如果是这种情况,客户端软件是否有责任确定哪些数据包是相关的?
如果两台计算机都尝试连接到同一个端口,是否有可能?
当您打开一个套接字时,您需要寻址目标系统的一个端口并在您自己的系统上打开一个共轭侦听端口以接收任何响应。您必须向目标系统发送您的侦听端口。
有多个系统使用相同的调制解调器
当您启动网络浏览器并访问 www.google.com:80 时,您的浏览器会从系统获取/搜索免费的非系统共轭端口以进行侦听。假设共轭端口是 10000。侦听器端口用于接收来自 google 的 http 流。
然后,坐在您旁边的孩子也顺便浏览了 www.google.com:80 和他/她的 play Station 或 xbox 的 google 会话——也顺便分配了共轭端口 10000。
你们俩都坐在电缆调制解调器后面,而电缆调制解调器后面是您的无线路由器。并且您的两个系统都位于无线路由器后面——所有系统都按照网络拓扑的顺序排列。
防止路由器/调制解调器上的端口地址冲突
假设您的有线电视公司 DHCP 为您的调制解调器分配了 ip4 地址 72.72.72.72。但是您的无线路由器 DHCP 将 192.168.0.10 分配给您的系统,并将 192.168.0.11 分配给您孩子的系统。
当携带您的侦听器端口信息的帧通过您的 NAT 路由器时,它将转换一个或两个侦听端口。假设您的页面使用端口 15000,您孩子的页面使用端口 16000。
然后,您的无线路由器将来自 72.72.72.72:15000 和 72.72.72.72:16000 的请求发送到谷歌服务器。
然后,谷歌服务器分别响应 72.72.72.72:15000 和 72.72.72.72:16000,当您的无线路由器遇到响应时,它会进入它存储的映射并将 72.72.72.72:15000 转换为 192.168.0.10:10000 到到达您的系统,但将 72.72.72.72:16000 转换为 192.168.0.11:10000 以到达您孩子的系统。
运行 web/game/ftp/etc 服务器
但是,如果您的系统上运行着 Web 服务器或 ftp 服务器,该怎么办。如果您有两个系统并且都有一个 Web 服务器并且两个 Web 服务器都在侦听端口 80,该怎么办?
假设您的第一个 Web 服务器系统的无线路由器注册/分配的本地 IP 地址是 192.168.0.30,而您的第二个 Web 服务器系统是 192.168.0.40。
无线路由器通常默认有一个配置网页 192.168.0.1:80,除非您更改它。页面上有一个选项卡,您可以在其中定义/保留应用程序端口映射。
您可以注册您的无线路由器以保留映射
192.168.0.30:80 => outgoing port 8080
192.168.0.40:80 => outgoing port 8088
因此,您必须给您的朋友打电话,您的网络/游戏服务器可分别通过 72.72.72.72:8080 和 72.72.72.72:8088 进行寻址,无线路由器将阻止其端口 8080 和 8088 使用其自己的动态 NAT。
当然,72.72.72.72 仅在您的 ISP DHCP 决定更新您的调制解调器的 ip4 地址(例如 72.72.90.200)之前一样好。之后,您必须给您的朋友打电话/发电子邮件并说嘿,服务器的地址已分别更改为 72.72.90.200:8080 和 72.72.90.200:8088。或者您可以订阅动态 dns (ddns) 服务以使用命名域,其中 ddns 服务需要您在系统上安装一个简单的心跳实用程序来帮助他们监控地址变化。DDNS 翻译是一个单独的问题/策略。
NAT 调制解调器
较新的 ISP 合同为您提供具有 NAT 的调制解调器。如果是这样,您必须关闭调制解调器上的一个或无线路由器上的一个。您不应该同时使用两者 - 翻译两次有什么意义,因为 NAT 只是为了防止地址冲突。当您从无线路由器关闭 NAT 时,它可以作为集线器交换机而不是路由器运行,因此您可以使用它的一个 LAN 插座而不是通过它的 WAN 插座将它连接到调制解调器。
路由器管理每台计算机独立的“源”端口。虽然您可能连接到“目标”上的端口 80,但路由器可能会将源端口分配给某个高编号端口。
维基百科将其总结为
网络地址转换涉及重写源和/或目标 IP 地址,通常还包括 IP 数据包通过 NAT 时的 TCP/UDP 端口号。还必须重写校验和(IP 和 TCP/UDP)以考虑更改。
已经提供了很好的答案,但这里有另一个例子:
HOST A addr HOST B addr
10.1.0.2:4040 10.1.0.3:4040
-----------------------------------------
NAT 200.50.50.28:4040 200.50.50.28:4041 (what external host sees)
200.50.50.28 是路由器的全球(互联网)IP。
每个端口号在 NAT 表中都是唯一的。当然,路由器会透明地完成修改源地址和目标地址的所有脏活。
它为传入的外部流量使用不同的端口,然后 NAT 将一个端口上的数据包路由到一个内部 IP 地址,并将来自另一个端口的数据包路由到另一个内部 IP 地址......来自每台内部计算机的初始请求,当它在出路时通过 NAT,确定哪个端口将用于来自外部 IP 地址的传入流量,并告诉外部服务器将其流量发送回该连接的哪个端口。
RFC3022 提供了大量有关其工作原理的信息
由于已经讨论了 Internet 服务提供商 (ISP) 提供的面向公众或外部 IP 地址,因此我想补充一下。您可以要求您的 ISP 让您的公共 IP 地址保持不变。它将变为静态,因此如果您的朋友想在您的网络地址转换器 (NAT) 中访问您的服务器,您不必通知他们更改 IP 地址。在撰写本文时,静态 IP 地址的成本约为 100 美元。大多数 ISP 他们称之为商业帐户。您可以通过谷歌搜索“我的 IP 地址是什么”来确定您面向公众的 IP 地址。