如果我有两个内部计算机通过NAT路由器连接到相同的外部IP地址,怎么是路由器能够获得流量到正确的内部计算机?我的理解是,NAT将传入数据包转发给最近将传出数据包发送到[传入数据包]发送者的IP地址的计算机。由于两台计算机都发送到相同的地址,路由器是否将数据包转发给两者?如果是这样的话,客户端软件有责任确定哪些数据包是相关的?两台电脑如何通过NAT连接到相同的外部地址?
是否有可能,如果两台计算机尝试连接到同一个端口?
如果我有两个内部计算机通过NAT路由器连接到相同的外部IP地址,怎么是路由器能够获得流量到正确的内部计算机?我的理解是,NAT将传入数据包转发给最近将传出数据包发送到[传入数据包]发送者的IP地址的计算机。由于两台计算机都发送到相同的地址,路由器是否将数据包转发给两者?如果是这样的话,客户端软件有责任确定哪些数据包是相关的?两台电脑如何通过NAT连接到相同的外部地址?
是否有可能,如果两台计算机尝试连接到同一个端口?
当您打开套接字时,您需要对目标系统的端口进行寻址,并在您自己的系统上打开一个共轭侦听端口以接收任何响应。您必须将目标系统发送给您的监听端口。
使用相同的调制解调器
当您启动网页浏览器,并转到www.google.com:80有多个系统,您的浏览器获得/搜索免费的非系统共轭端口从聆听系统。让我们说,共轭端口是10000.监听端口用于接收来自谷歌的http流。
然后你的孩子坐在你旁边顺便还可以浏览www.google.com:80并且还捎带分配轭端口10000
你们两个播放台站或任何的Xbox-的他/她的谷歌会坐在电缆调制解调器后面,电缆调制解调器后面是无线路由器。而且你的两个系统都在无线路由器后面 - 所有这些都按照网络拓扑结构的顺序排列。
为了防止对路由器/调制解调器端口地址冲突
让我们说,有线电视公司DHCP分配调制解调器IP4 ADRESS 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。
然后,google服务器会分别响应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,以达到您孩子的系统。
运行网络/游戏/ FTP /等服务器
但是,如果你有一个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插座将其连接到调制解调器。
+1多么真棒的解释!我一直对以下事实感到沮丧:对NAT的大多数解释都没有真正解决传出连接上的回复如何使其回到发件人。 – AaronLS 2010-02-01 09:49:37
它用于传入外部流量不同的端口,并且NAT然后路由一个端口上的分组发送给一个内部IP地址,并从另一个端口到另一个内部IP地址的报文...从每个iniital请求内部计算机,当它通过NAT出口时,建立哪个端口将用于来自外部IP地址的传入流量,并且它告诉外部服务器将该流量重新发送到该外部服务器的端口。
路由器管理的“源”端口是单独的每个计算机。虽然您可能正在连接到“目标”上的端口80,但路由器可能会将源端口分配给某个高端端口。
Wikipedia概括起来为
网络地址转换涉及 重新编写源和/或 目的IP地址,通常 也是TCP/UDP端口的IP 数据包的数量,因为他们通过NAT。 校验和(IP和TCP/UDP)必须 也被重写,以考虑 的变化。提供
纠正我,如果我错了:两台计算机最初请求连接到1.1.1.1端口1000.路由器组成新的端口,40000和40001.路由器发送数据包,仍然连接到端口1000.当服务器发送它回来,它发回到端口40000或40001.这是有道理的,除了我想当打开连接,发送和接收发生在同一端口。 – user241146 2009-12-30 20:49:09
一个“套接字”由四部分数据组成:起始IP地址,起始端口,目的地IP和目的地端口。在你的例子中,端口40000和40001是源端口,1000是目的端口。 – kdgregory 2009-12-30 21:04:57
已经很好的答案,但这里是另一个例子:
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表中是唯一的。当然,路由器完成所有脏透明地修改源地址和目标地址的工作。
因此,如果两台计算机使用相同的源端口,路由器会自动为任何主机重新分配一个新的src端口?然后Host A和Host B连接的服务器会看到不同的src端口?如果Host A和Host B的端口没有冲突,则路由器不会更改src端口?只是想确认我是否正确理解它。谢谢 – kuchi 2017-12-01 10:46:36
@kuchi,是的服务器为每个主机看到不同的端口。通常,路由器会解决地址冲突问题,即如果两台主机连接到两台不同的服务器,则可以使用相同的端口。元组'((src_ip,src_port,dest_ip,dest_port)'必须是不同的。 – 2017-12-01 11:29:41
RFC3022提供了关于如何工作
如果你问如果您的基于IP的程序需要知道NAT的很多信息,答案是否定的 - 这就是为什么它是如此的成功。 – 2009-12-30 20:30:41
有一个被接受的答案,所以我没有看到赏金中的重点。 – 2017-08-18 21:11:34
@RonMaupin他想为现有的答案提供一些他的声誉赏金,因为他喜欢它或者对他有很大的帮助。查看赏金的描述*一个或多个答案是堪称典范,值得额外奖励。奖励现有的接受答案*。这里的人们经常这样做,即使在很多年以后,也要奖励额外的好处。 – 2017-08-19 08:48:00