换个角度审视NAT技术
NAT (Network address translation,网络地址转换 )是局域网连接到互联网的一个对接工作. 首先要知道NAT是一个技术或者说软件而不是协议 后面你会知道NAT 是偏应用层但工作在运输和IP层的一个技术。关于NAT 的基本原理就用一个例子来说明吧:
nat路由器有个NAT表的,比如:
NAT前
proto:udp
src ip:192.168.1.100
src port:4000
dest ip:200.200.200.200
dest port:8000
NAT后
proto:udp
src ip:公网IP
src port:随机端口,比如2323
dest ip:200.200.200.200
dest port:8000
有了这个表(端口转换表),以及四元组,就能确定每个人连接的映射关系了,比如回程的时候,NAT设备会查询NAT表,根据上面的例子,查询到2323端口对应NAT前的4000端口的一台IP地址为192.168.1.100的机器。
NAT前
proto:udp
src ip:192.168.1.100
src port:4000
dest ip:200.200.200.200
dest port:8000
NAT后
proto:udp
src ip:公网IP
src port:随机端口,比如2323
dest ip:200.200.200.200
dest port:8000
有了这个表(端口转换表),以及四元组,就能确定每个人连接的映射关系了,比如回程的时候,NAT设备会查询NAT表,根据上面的例子,查询到2323端口对应NAT前的4000端口的一台IP地址为192.168.1.100的机器。
没看错,nat在出方向转换的时候,源IP(私有ip)变成公有ip,源端口变成一个新的随机端口。
其实这个转换并不是很多人以为的转发(虽然很类似,但意义不一样,不在同一个逻辑层次上!!!!)而是重新生成一个新的数据段封装成数据包。
这时,nat表中的一个个一一对应(映射)的元祖就是内网ip和随机端口,前者标识了内网内唯一的主机,后者就是ip被对应的端口号。
这样数据返程时就可以通过端口号(destination port id)索引表锁定那台主机。
综上所述,NAT是一个软件,一个安装在边界路由器上的程序,而端口号就是其中的关键,可以这样(或者必须)理解它:对于外网,Internet只认识这台边界设备(路由器就当做一台终端主机!!!!!!!!),点到点通讯的同时还要端到端的通讯,于是边界设备上代理不同内网主机发送的数据形成了不同的会话进程,同一台设备上不同的进程当然要用端口号区分啦~。