[TOC]
原本标题想命名为“局域网中,不同子网之间的通信",但因为太长所以放弃了
## 给局域网通信的手段——NAT
大学时,常在淘宝购物,那时候我写的收货地址是学校食堂旁边的中通快递,快递小哥收到后,总是会主动送到我们公寓门口,这服务真是太赞了。
刚开始的时候,我还一直纳闷,快递小哥是如何知道我公寓的?作为一只好奇的猫,我还是忍不住问了,对方回答是我第一次去取货的时候,他问我要了公寓地址。
他还给我看了那个本子,大概200个左右吧,每条记录是这样的:
**收件人电话:XXX
收件人地址:XXX公寓
时间:XXX**
原来他是根据电话找到我的工具的,天才 ):
这样下去你的本子够记吗,学校每年进来那么多新生,
他笑着回答:这个很简单,我的本子只是用半年,半年后我就换新的本子,并且那些超过半年没有寄东西或者收东西的人,我就删除了
我顿时五体投地!
最近我在学习TCP/IP的时候遇到一个类似的问题:
我向百度发送一个请求,百度怎么回复给我的呢?毕竟我的电脑可是在局域网内,估计全世界IP和我相同的人不下一万。
一开始我向的是,百度收到我的请求后,拿到我的MAC地址,然后给我的MAC地址发送应答。。。
估计我现在被你鄙视了吧,要知道,经过一个路由器的转发,源MAC地址就是路由器的地址,目的MAC地址就是下一站路由器或者真正目的地的MAC地址。
也就是说,当不是在同一个子网内通讯,MAC地址是会变化的。
所以百度不知道我的MAC。
后来我又想,我是做PHP的,拿到的IP是客户端的公网IP,所以,百度已经是发到我的公网IP所在的路由器,也就是我家的路由器上面,然后路由器转给我。。。
可是不对啊,我家的路由器连接的是小区的网,小区连接的是XXX的网,不知道N层路由器之后才到的公网,那岂不是公网IP路由器受到一个数据包之后,就要采用暴力的广播方式,让所有路由器都受到,然后所有的路由器都再广播。。。一层层下去。
这不是网络风暴吗?可是我平时上网不卡啊?所以也不对。
直到后来,我看到了一种技术:NAT
NAT是现在的路由器必须支持的基本功能,1991年推出。
和快递差不多,当我向百度发送一个请求的时候,路由器就记录我的IP和端口,然后源IP换成路由器的IP,源端口就随机用一个未使用的端口,记录在表中:
**方向:出
局域网IP :192.168.1.2
端口:12345
换成的IP:172.12.11.23
换成的端口:20000**
如果收到一个数据包,是172.12.11.23:20000就还原成192.168.1.2:12345回来,然后通过在同一个子网的通讯方式将数据报发送给我。
这个方式是很好的,因为不管经过多少层的路由器,依然可以根据NAT表将数据发送给正确的主机。
当然咯。NAT表是有限的,所以会有超时限制,为了不断开连接,P2P软件可是会没事干就发送一天信息,以更新NAT记录的时间。
**这里有好的资源:**
[ 路由器直连网络可以互通,还需要做NAT?](http://bbs.51cto.com/thread-796705-1.html)
![](https://box.kancloud.cn/da969076b68db28f52bf00a2300aa7c0_751x381.png)
[NAT详解:基本原理、穿越技术(P2P打洞)、端口老化等](http://www.cnblogs.com/imstudy/archive/2016/05/04/5458133.html)
![](https://box.kancloud.cn/659247cd713a2a7f73302641ac1ee454_1056x173.png)