在我前段时间写过的一篇介绍IP协议的文章中讲述到了NAT技术,但是在那篇文章中我只说了前半部分,也就是一个
私网机器如何发送报文到公网,但是后续的报文如何从公网返回私网机器我说会在之后的文章中介绍,那么今天我们
就一起来认识一下NAT技术的后半部分。
NAT技术
在之前那篇文章中所提及到的NAT技术,它主要是让私有IP对外通信时,将私有IP转换为公有IP,从而使用公有IP来访问某些资源,这就会导致私有IP不会出现在公网上,这也导致了私有IP在不同局域网中重复是不会产生什么影响的,所以NAT技术极大的解决了现如今IP地址不足的问题,并且现在的家庭、学校、公司等都使用这种技术。
我们也知道NAT技术使得使用私有IP的主机向公网中传输数据跨越子网直到到达公网的过程中一直会进行源IP地址的切换:
但是源IP地址切换就会导致,该报文到达目标主机时报文的源IP地址是出口路由器的IP地址,这就导致目标主机反向传输数据时,只能传输到出口路由器处,然后就无法继续向下继续了。
接下来我们将这个网络结构简化一下,以便引出解决方案:
我们知道在网络世界中进行网络通信的重要依据是知道对方的套接字信息,即IP地址 + 端口号,那么这意味着IP地址 + 端口号可以定位世界上唯一一台主机上的一个进程,在我们今天学习过私网和公网的知识之后,这句话好像只适用于公网了,但是我们要认识到的是在一个子网中这句话仍然适用,那就是在一个子网中IP地址 + 端口号可以定位唯一一台主机上的一个进程,那这就意味着IP地址 + 端口号在一个子网中是唯一的 。
现在我们依据上图使用IP地址为192.168.1.23的主机A向IP地址为2.3.4.6的主机B发送一个报文,假设主机A发送报文的进程端口号是8888,目标主机进程端口号8080,那么我们在掌握之前的NAT技术的话,报文从主机A到主机B的流程是这样的:
然后假如主机B要对主机A进行应答,那么它只能到达出口路由器:
此时这个报文就无处可去了,这时候就需要用到我刚才提到的那句话了:IP地址 + 端口号在一个子网中是唯一的。
在该报文从主机A传输到主机B的过程中只进行了一次源IP地址的切换,也意味着它只跨越了一次网络,私网是一个子网,我们也可以把公网也当作一个大的子网,这就意味着,无论是在跨越网络前192.168.1.23:8888在私网中是唯一的,并且切换后的2.3.4.7:8888在公网中也是唯一的,那么这两对套接字信息所构成的四元组是可以定位两个网络中唯一一条信道的,所以报文如何回来的方法就已经呼之欲出了,那就是让出口路由器保存好这两对套接字之间的双向映射关系,到了报文回来的时候,可以直接根据这个映射关系,切换目标IP地址,这样这个报文就可以回来了:
那么,很显然这个NAT转换表肯定不止这么一对映射信息。
但是这就完了吗?好像有点不太对的地方,那假如私网中的下面那台主机C同样一个端口号为8888的进程也向公网中的主机B向公网发送报文,这样的话,主机C的报文在发送到出口路由器,出口路由器进行源IP地址切换并建立映射时,右边的键值也是2.3.4.7:8888,那这样不就导致双向互为键值对不唯一了吗?
其实,在一个报文发送到外网时不仅仅源IP地址会被切换,必要的时候也会进行端口号的切换,至于切换后的端口号是多少是无所谓的,只要保证切换后的IP地址 + 端口号是唯一的就可以。这样就可以解决上面遇到的问题了。
知道上面的技术之后,其实私网中外部的网络是公网还是私网就已经无所谓了,它们的流程都是一样的,每次经过源IP地址切换时都会在对应的路由器上建立切换前后的双向映射,这样就可以让报文不只可以出去,也可以回来了。
那还有人有问题,这里的出口路由器下承载的私网主机才两个,在现实生活中,出口路由器承载的主机数量可能非常庞大,这么多的映射关系,能存放下吗?基于这样的问题所以就有着家用路由器和企业级路由器的区别。企业级路由器的存储映射关系和查找映射关系的能力肯定是更大的。
这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项。
NAT的缺点
我们看到NAT技术的非常重要的一点就是NAT路由器中存储的那一张映射表,所以也正因为这一张表,对于NAT技术来说,也是有着很明显的缺陷的:
无法从NAT外部向内部服务器建立连接;
装换表的生成和销毁都需要额外开销;
通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;
在这些缺点当中,第一点有时或许也是好处,因为这样做的话可以保证私网中的主机不会被轻易攻击。