[What]什么是NAT

到底什么是NAT呢?在不同的领域里估计有不同的含义,本文里的NAT特指计算机网络领域的专有名词Network Address Translation,翻译成中文是网络地址转换。(在此,特别声明,以下要描写的东西,都是对该概念的基本内涵的个人理解,并没有什么新鲜的东西,也不保证正确,感兴趣请参阅《计算机网络》第四版)

其实,这个概念,理论上,我是应该懂的,但是理想很丰满,现实很骨干,我的知识早已一点不剩地还给老师了。所幸的是,由于巨蟹座念旧的性格缺陷,书我还没卖,也没扔。于是翻出来追忆让人又敬又怕的张尧弼老师,您现在可好?

回到正题,什么是NAT?要是从头道来的话,我估计就我这啰嗦劲,三本塔嫩鲍姆的厚度,我还没说完。所以,只好一切从简了。一句话,IP地址不够用,好吧,我说的是IPv4。别问我什么是IP,什么是v4,为啥不够用,都说了已经还给张老师了。姑且就当它不够用吧。

举个例子说吧,比如腾讯这种公司,有大概三万个员工,然后小马哥的脑容量有限,不可能记住三万个名字。那么怎么办呢?需要一个领导班子,我们叫高干,高级干部。人数很少,能搞定。高干呢,管中干,中干管基干,基干管员工。于是乎,大家的脑容量都没变大,但是却管理了更多的员工。就算员工重名了,也不怕搞不清,到了基干手下这个层级,重名已经很少了,基本没有。

如果你想加工资,你没法直接跟小马哥说,你只好跟你的基干领导说,然后基干跟中干汇报,中干跟高干汇报,最后报到小马哥那里了。小马哥说,一年了辛苦了,加吧。于是高干向中干传达,中干向基干传达,基干向你宣布。

例子可能有点不恰当,但我觉得本质就是这么回事。这里面要传达几个信息。第一,地址数量(能记住的名字)有限,因为IP地址的位数(脑容量)有限;第二,通过分而治之的方法,解决问题,主干网,各个级别的子网,最终实现更多数量计算机都接入网络(管理更多员工);第三,一台最普通的计算机(基层员工),如何跟另一台,其他网络的,某个计算机(小马哥)通信,还要实现双向都通信,主干网上的计算机(小马哥)有明确地址,普通子网计算机(基层员工)要发送消息,目标比较明确,但是对于主干网的计算机(小马哥),不知道是具体是哪个子网的计算机(基层员工),这时候到底如何确保信息送达。

通俗地讲,NAT就解决这些问题。为了解决IP地址不够地问题,有关部门(够神秘)特别划分了三个网段,供各个局域网随意使用10.0.0.0到10.255.255.255第一段,172.16.0.0到172.31.255.255第二段,第三段就是我们耳熟能详地192.168.0.0到192.168.255.255。理论上局域网内部,用哪个都是可以地,但是一般小组织用第三段,随着规模扩大,用第二段,以此类推。所以,判定公网IP还是内网IP是很容易的,看数字就可以了。

局域网设备向公网设备发送数据的时候,是没什么难点的,因为公网设备有唯一IP,而反过来,就麻烦了,每个局域网,都有一个192.168.1.3,到底发给谁呢?所以,就需要有NAT设备出马了,一般叫做NAT box,但是现在,按照我猜测,都是直接做在路由器里面了。NAT设备通过地址转换的方式,贯通了公网设备和子网设备的通信桥梁。

一般来说,在一个局域网内部,IP地址是唯一的。路由设备接入了公网,所以路由器一般除了自己的内网网关IP外,至少还有一个其所在公网的公网IP。在内网数据包从路由器出去时,NAT设备,会将内网数据包的源地址,替换成路由器在公网上的地址。这样从公网设备发来的数据包,就知道应该发给谁了。NAT设备在收到公网来的数据包后,再按照一定规则,将数据的目的地址翻译成内网地址,就可以实现准确投递。

我们再往里钻一层看看,这个双向翻译是怎么做的。因为IP协议不可能因为这个而去改变,所以,想做这些翻译的事情,只能在现有的数据结构上复用字段。(蛋疼啊)被利用的字段,其实就是端口字段。使用TCP协议和UDP协议时候,都需要绑定一个端口,从而数据包才能正确的在源机器和目的机器的进程间传递。所以,NAT设备在翻译从内网出去的数据包的时候,把源IP替换成公网IP,把源端口替换成内网计算机的相应端口,这样就可以了。

那么,碰巧两台内网计算机用的相同端口怎么办?好问题。所以,在内网要唯一标识一个计算机的某个进程,需要使用内网IP地址+端口的方法,这就对NAT设备提出了新的需求,NAT设备在翻译内网出去的数据包时候,不能简单的把源端口填成源机器的相应端口,而是一个由源机器IP+端口映射成的虚拟端口。同时NAT设备要把虚拟端口和源内网IP+端口的对应关系储存起来。

在公网数据包发到NAT设备时候,NAT会取出目的端口字段,查询维护的映射关系,找到真正的内网机器IP+端口,替换包里的目的IP和端口,将数据包放在内网上发送。至此,NAT全部过程都已经解释完毕了。