多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[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)