NAT网关和NAT穿越原理


一、原理图



1、背景信息:

 (1)我们模拟的情形是位于网络A下的内网主机UserA 想要和位于网络B下的内网主机UserB进行点对点通信,刚开始的时候UserA和UserB都不知道对方的公网和内网IP地址及端口号,所以必须要再公网上搭建一个服务器C,服务器C主要的任务就是维护一张用户名到(主机的公网IP+端口号)的映射表,这样用户就可以从服务器C上获取UserB的公网IP和地址

 (2)UserA在局域网内发的IP包源地址是192.168.1.100:3000,该IP包经过路由器A后会被路由器A修改成能够在公网传输的公网IP地址和公网端口号:125.71.229.217:4001。UserB向公网发送报文路由器B也会对它做同样处理。


2、NAT穿越:

 STEP1:  假设UserA想要给UserB发送消息,那么UserA就会让服务器C通知UserB先进行打洞操作。

 STEP2: UserB收到打洞通知后,就发送IP包(目地址:125.71.229.217:4001,源地址:202.108.22.5:6002)给路由器A。路由器A收到该IP包后会查看源地址(202.108.22.5:6002),路由器发现局域网之前没有请求过该源地址,所以路由器会过滤掉此包。(这一步就相当于打了个洞)

STEP3: 现在到了最后UserA给UserB发送消息的一步,UserA通过路由器A发出IP数据包(目地址:202.108.22.5:6002,源地址:125.71.229.217:4001)给路由器B,同样路由器B要查看该IP包的源地址(125.71.229.217:4001),因为在STEP2中路由器B给路由器A发送过对此地址的请求(最后被丢掉的那个包),所以路由器B不会丢掉该包。接下来路由器B会读取IP包的目的地址202.108.22.5:6002,然后通过映射表转换成内网IP地址和端口号:192.168.1.100:3000,这样就可以发送报文给主机UserB了。


3、其他:

(1)对称路由器和非对称路由器

实际上上面的NAT穿越技术只适合锥形路由器(非对称路由器),说道这就要讲一下什么是对称路由器和非对称路由器了:

非对称路由器:将同一内网IP  (比如:192.168.1.100:3000) 访问不同外网地址比如百度和谷歌时映射成的公网IP和公网端口是相同的(比如都是:202.108.22.5:6002)。

反之,对称路由器就是:将同一内网IP(比如192.168.1.100:3000)访问不同网络地址比如百度和谷歌时映射成的公网IP和公网端口是不同的(比如访问百度时映射成:202.108.22.5:6002,访问谷歌时映射成:125.71.229.217:4001)


回到2中讲的NAT穿越技术,显然,UserA想给UserB发送消息,前提是:UserB 给UserA发送消息(打洞操作)和UserB给服务器C发送消息(注册自己的公网IP)用的公网IP地址和端口号是相同的。所以NAT穿越只适合非对称路由器。


(2)不能用TCP做NAT穿越,只能用UDP做NAT穿越。


因为:tcp是基于连接的通信,而路由器会把来自同一主机的同一端口号上的不同tcp连接映射成不同的公网端口号。反之,UDP不是基于连接的传输协议,所以使用UDP就可以将不同的网络请求映射成同一公网源地址和公网端口号。体现到实际编程中就是:同一文件描述符通过路由器可以映射成同一公网IP地址和端口号。不同文件描述符通过路由器要被映射成同一公网地址和不同的公网端口号。


UserA 和 服务器C通信(注册自己的公网IP)时,需要创建一个文件描述符 fd1;UserA  和 UserB通信时还要再创建一个描述符 fd2。 路由器对不同描述符做映射时,会把不同的描述符映射到不同的公网端口号上。

比如:UserA  的文件描述符fd1 绑定到了端口3000上,文件描述符 fd 通过端口复用也绑定到了端口3000上;但路由器在做映射时,会将这两个文件描述符代表的tcp连接映射成如下格式(eg:) 192.168.1.100:3000 <->202.108.22.5:6002;   192.168.1.100:3000 <-> 202.108.22.5:6003

使用UDP可以完成NAT穿越:

因为UserA 通过文件描述符fd1 和 服务器C通信,然后UserA可以继续用此fd1和UserB通信,这样路由器就会把同一内网地址上的同一端口号发出的请求映射成同一公网地址。


已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页