这两天复习计算机网络的时候遇到这样一个概念。
NAT 网络地址转换(Network Address Translation)
大概是这样的。
举一个例子,假如说我们现在接入了校园网,我有一个内部IP是10.2.61.55。
意思是我是2号楼第6层A段(1)的第55台主机。我的网关是10.2.61.254
如图:
当我要像外界发数据包的时候我该用什么IP呢? 10.2.61.55?
大家不要忘了这是一个内部的IP,类似的另一个内部的IP是192.168.*.*
互联网上的通信是相互的,例如TCP就是三次握手,我给你说句话,你还要告诉我你收到这句话了。
那么假如说我现在在浏览器里打开百度网页,我使用10.2.61.55 的IP,那么当百度的服务器给我回应消息的时候,数据报里的目标地址应该填10.2.61.55吗?
我们都知道这是一个内部地址,当路由器转接收到一个以内部地址为目的地址的数据包时,会直接丢弃到不发送。
那么我们处在一个内部网络究竟是怎样与服务器进行通信的呢?
答案是NAT路由器,或者说是 实现了NAT功能的路由器。
我们都知道广义上的路由器是工作在网络层的设备,其主要功能是转发分组。
对于接收到的一个数据包,只会改变它的MAC地址,以及IP数据包里的TTL(生存时间)字段 减 1
还是举刚才的那个例子来说明。
假如我现在要访问百度网站,那么我势必要和百度服务器建立HTTP连接。
HTTP连接的运输层协议使用的是TCP协议,也就是要使用端口。
那么我发出去的数据包就是这样的。
运输层:源端口5000 目标端口 80
网络层:源地址10.2.61.55 目标地址119.75.217.56
经过我的第一个网关(一个路由器)10.2.61.254 ,数据包就会变成这样
运输层:源端口3001 目标端口 80
网络层:源地址10.2.61.254 目标地址119.75.217.56
然后再经过多个网关(多个路由器)最后到了与外部网络相连的路由器时,发出数据包就会变成这样
运输层:源端口6001 目标端口 80
网络层:源地址61.185.225.162 目标地址119.75.217.56
注意这个时候源地址就变成了一个对外真实的IP地址
服务器接到与我们校园与外部相连的路由器发出的数据包,就会这样返回一个数据包
运输层:源端口80 目标端口 6001
网络层:源地址119.75.217.56 目标地址61.185.225.162
然后再经过多个路由器最后变成这样一个数据包
运输层:源端口80 目标端口 3001
网络层:源地址119.75.217.56 目标地址10.2.61.55
于是我们本机就接收到了来自百度服务器的数据包了。
需要注意的一些问题:
1.路由器在进行IP地址,与端口转换的过程中,会把之前原先的IP地址与端口地址存起来,形成一个映射表,在收到外部发来的数据包时,会根据映射表来重新修改数据包中的IP地址与端口地址。
2.根据需要,外部的路由器可能不止一个(毕竟一个主机的端口只有那么几w个)
那么使用NAT路由器还有什么好处呢?
1.节省世界上的IP资源
2.外部不知道我们这个内部网络究竟是怎样划分的,就增加了内部网络的安全性。
3.防止外部主机攻击,内部的主机或服务器。