这里不讨论繁琐的概念,主要讨论一下,一个局域网怎样利用一个IP地址和公网互联。
涉及两个难点问题:
1.局域网中的一台主机 A(192.168.1.110)如何与外网服务器(20.173.12.22)通信?
2.服务器的返回数据包,是如何找到内网的客户端电脑A,并将数据传给电脑A上运行的程序p呢?
1.第一个问题:局域网中的主机A,如何与外网服务器(20.173.12.22)通信?
局域网中的主机A,想要访问外网服务器时,是通过NAT,将地址转换成外网地址。然后与服务器通信的。也即是说,外网的服务器,只知道与他通信的,也是一个拥有公网IP的地址。
这样问题自然就来了
2.第二个问题:那么服务器返回的消息之后,是如何知道是内网中那一台电脑发送的请求呢?
答案:通过端口来区分。
端口号是从0~65535的一个数字,每个局域网内的电脑在通过网关发出请求时,要分配一个端口号,IP虽然都给转换成了公网IP,但是端口却不同,这样就可以区分了。带上端口,就是为了服务器在返回消息时,知道要给谁。
问题又来了:
3.第三个问题:但是,局域网内的电脑发的请求,端口号会重复吗?允许重复吗?
答案:会重复。允许重复。
4.第四个问题:怎么办?
答案:局域网内的电脑发的请求,带的是局域网内部的"IP+端口号",IP是客户端电脑的IP,端口也是这台电脑的端口,在向外发请求时,NAT会重新给一个IP和端口号。这个IP就是整个局域网共用的公网IP,而端口则是临时生成一个,给这个请求。NAT设备内部,记录这个转换的映射表。到时候,可以根据这张表,来倒推原来的请求的内网IP和端口。虽然局域网内部的请求的源端口可能是一样,但是IP不一样,是可以区分清楚的。
5.第五个问题:那么同一台电脑上,不同的软件访问相同的网站,是否"IP+端口"会出现重复?
比如用谷歌浏览器,和IE浏览器访问同一个网站?
答案:不会。
首先有个概念要澄清。"IP+端口",有两对:一个是客户端,一般是我们自己局域网内的电脑;一个是服务端,一般是网站。我们客户端的“IP+端口”称为“源IP和源端口”,服务端的称为“目的IP和目的端口”。我们自己电脑上的软件占用的端口是“源”端口。“源”端口用于在服务器返回响应时,寻找目标程序所使用的端口。
不同的程序,在运行时,如果要访问网络,电脑会分配不同的端口。当两个软件同时使用相同的端口时,后打开的的那个软件会被电脑提示:“端口已被占”用而出错。
因此,不同的软件,软件自身始终是不同的端口。这个和访问的网站是否一样没有关系。
一般所说的 80端口,指的是服务端的Web服务运行在这个端口,不是我们的浏览器运行在这个端口。
以上总结一下:
局域网内的主机发请求时,会带上自己的【IP0+端口0】,走到NAT时,会将IP替换成公网IP1,并重新分配一个端口1给这个请求。当有了这个新的【IP1+端口1】之后,就可以访问外网服务器。服务器返回消息时,返回到NAT,NAT根据【IP1+端口1】找到当时局域网内的【IP0+端口0】,并发送到局域网内的目标机器(IP0)上,并发给对应的程序(端口0)。
6.那么问题又来了:局域网内电脑太多时,是否NAT的端口不够分配?
比如,局域网内有70000台电脑,大于65535了。
答:不错。这个时候,端口就不够了。一般情况下,是需要另一个公网IP的。不过,如果可以实现时分复用的话,应该还是可以的。