浅谈内部网络对外通信

版权声明:欢迎转载,转载请标明来源 https://blog.csdn.net/weixin_41973131/article/details/88701028

前言

是我看了网络层之后感觉这个挺有趣的便写了一下,如果出现错误请在留言板及时指出,谢谢!

辣么多重复IP

经常连wifi的同学经常会注意到:我们很多次连接wifi或者接入路由器的时候ip都是会是192.168.xxx.xxx之类的地址,后面我们就了解到192.168.0.0-192.168.225.225这些地址已被声明为私有化,允许任何网络在内部随意的使用这些地址,所以说世界上的主机存在着成千上万的192.168.xxx.xxx这类的地址。

但是我们知道,在网络层中数据包是根据你的IP地址进行转发的,那么既然这世界存在着这么多相同的IP地址,为什么数据包能够一个个无差错地来到我们的主机?

NAT-网络地址转换

首先我们需要知道什么是NAT,NAT的基本思想是:ISP为每个家庭或每个学校分配一个IP地址,用这个地址来进行数据传输。而在客户网络内部,每台计算机都有一个唯一的IP地址(即路由器自动分配的虚拟地址),该地址主要用来路由内部流量。如果当一个计算机需要离开客户网络向其他ISP发送数据包,IP协议字段里的IP源地址必须把唯一的内部IP地址转化为ISP为其分配的共享的公共IP地址。

而上面所说的192.168.xxx.xxx即是客户网络内部可使用的IP地址之一。

在使用NAT的情况下,ISP可以不用为每台主机分配一个唯一地址,这样大量减少了IP地址的消耗量,但这也导致了一个问题,整个网络世界出现了大量的重复IP地址,因此我们不再可以单纯根据原地址的IP来进行数据包的转发(在数据包的响应阶段)。

在阅读下面的文章时,我们应该记住,NAT一般与防火墙和隐私性紧密结合在一起 ,它能够默认阻止未经请求的入境数据包。换句话说:如果该数据包是在内部网络没有发送过请求的前提下发过来,则会被阻止访问,这也是我们需要NAT穿透(内网穿透)才能访问内部网络的原因。如果不能理解的话,可以思考一下在现实中我们可以主动访问一个在内部网络(接入路由器)的主机么?

“不伦不类的解决方案“

IP协议报文头(百度百科)

上面是IP协议的报文头,可以看到有助于外部程序访问本地内部网络的只有源地址了,而这源地址又在内部网络发送数据包到ISP时被转化成了ISP分配的公共IP地址。这样也意味着回到内部网络的路线彻底断了。

那这样的话协议设计者们肯定需要一个字段来记录真正的发送方是谁,而在上面的IP协议报文头固定字段里面只剩下一位因恶作剧而空出来的字段没有使用(图片中没有表示出来,有兴趣的同学请百度)。虽然我们可以使用可选字段来记录真正的发送方,但这样同时也意味着要给成千上万的已部署路由器修改代码,这自然是不可能的。

但是设计者注意到:大多数的IP数据包携带的要么是TCP有效载荷,要么是UDP有效载荷。那么让我们看下TCP协议的头(UDP协议于下面要说的类似):
在这里插入图片描述
我们可以知道两个协议的头都包含了一个源端口和一个目标端口字段,该端口字段指示了TCP连接从哪里开始以及到哪里结束。那么这个端口就可以拿来用啦。

下面就是NAT的实际做法:

在NAT中维护一个地址转化表,该表项里包含了三项,一个索引值,一个原内部网络的IP以及一个原内部网络的端口号。

利用Source port(源端口)字段,在任何时候当出境数据包进入NAT盒子,其源地址192.168.xxx.xxx被ISP分配的公共IP地址(用户真实地址)所取代,并且,TCP的源端口被上述的索引值所替代。最后NAT盒子重新计算IP头和TCP头的检验和,并将检验和插入数据包中。

当一个数据包从ISP到达NAT盒子时,利用TCP的源端口中的索引值查找NAT盒子的映射表,找到对应的表项之后,从该表项里提取出内部IP地址和原来的TCP源端口(类8080),并将它们插入数据包中,然后重新计算IP和TCP检验并插入到数据包中,最后将该数据包传递给客户内部的路由器。

从此一个内部网络的IP如何进行通信便讲完啦~~

猜你喜欢

转载自blog.csdn.net/weixin_41973131/article/details/88701028