在 络编码中会发现程序在局域 中是可以适用的,但是在外 与内 之间和内 与内 之间就不可行。
问题就在于NAT。首先介绍下NAT。
NAT的作用NAT(Network Address Translator), 络地址转换。顾名思义,它是一种把内部私有 络IP地址翻译成公有 络IP地址的技术,如图5-1所示。NAT是在IP地址日益缺乏的情况下产生的,它的主要目的是使地址能够重用[9]。
基本NAT与NAPT如图5-3所示,NAT分为两大类,基本的NAT和NAPT(Network Address/Port Translator)[10][11]。
基本的NAT,它仅将内 主机的私有IP地址转换成公 IP地址,但并不将TCP/UDP端口信息进行转换,有动态与静态之区分。由于现在大部分都属于另一种类型,即NAPT,故这里不详细讨论基础NAT。
另外一种NAT叫做NAPT(Network Address/Port Translator),从名称上我们也可以看得出,NAPT不但会改变经过这个NAT设备的IP数据 的IP地址,还会改变IP数据 的TCP/UDP端口。NAPT的地址及端口的转换过程,请看图5-4:
NAPT又分为锥型(Cone)和对称型(Symmetric),如图5-5所示,它们的区别在于,在NAT已分配端口 给Client A的情况下,如果Client A继续用1235端口与另一外 服务器通讯,锥型NAT还会继续用原来62000端口,即所分配的端口 不变。而对于对等型NAT,NAT将会分配另一端口 (如62001)给Client A的1235端口。也就是说,同一内 主机同一端口 ,对于锥型NAT,无论与哪一外 主机通讯,都不改变所分配的端口 ;而对于对等型NAT,同一内 主机同一端口 ,每一次与不同的外 主机通讯,就重新分配另一个端口 。
完全锥型NAT、受限制锥型NAT与端口受限制型NAT
锥型NAT可另外分类为完全锥形(Full Cone)NAT,受限制锥形(Restricted Cone)NAT,端口受限制锥形(Port Restricted Cone)NAT。
①完全锥形(Full Cone)NAT
这种NAT内部的主机A连接过外 主机C后,NAT会打开一个端口。然后外 的任何发到这个打开的端口的UDP数据 都可以到达A,不管是不是C发过来的[12]。
例如 A: 192.168.8.100 NAT: 202.100.100.100 C: 292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100:8000) -> C(292.88.88.88:2000)
任何发送到NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)。
②受限制锥形(Restricted Cone)NAT
这种NAT内部的主机A连接过外 的主机C后,NAT打开一个端口。然后C可以用任何端口和A通信,但其他的外 主机不可以。
例如 A: 192.168.8.100 NAT: 202.100.100.100 C: 292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100:8000) -> C(292.88.88.88:2000)
任何从C发送到NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)。
③端口受限制锥形(Port Restricted Cone)NAT
这种NAT内部的主机A连接过外 的主机C后,NAT打开一个端口。然后C只能用原来的端口和A通信,其他的外 主机不可以。
例如 A: 192.168.8.100 NAT: 202.100.100.100 C: 292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100:8000) -> C(292.88.88.88:2000)
只有C(202.88.88.88:2000)发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)。
NAT产生的问题
NAT很好地解决了地址紧缺的问题,屏蔽了内部 络,但也带来一些问题。内 的主机向外连接是很容易的(NAT相当于透明的,内 的和外 的主机均不用知道NAT的情况)。但如果外部的计算机想访问子 内的计算机就比较困难了,这可以使内 主机先发起连接从而解决问题。但是如果两台主机都分别位于两不同NAT后面时,两台主机无法通信。当分别位于两不同NAT(NAT A,NAT B)后面的两台主机A和B欲进行通讯时,若主机B主动发起连接,它该连哪个地址呢一种情况:试图直接连到主机A的内 私有地址(10.0.0.2:1234)肯定会失败,因为10.0.0.2根本就不是一个可以在公 上路由的IP地址;第二种情况,试图直接连到B的NAT公有地址(155.99.25.11:62000),NAT A会拒绝这个数据包,因为这个端口并无绑定内 主机的某个端口,或即使有所绑定,但这个端口所绑定的外 地址和端口并不是B的地址和端口。若A主动连接B,结果一样。
有两种方法解决这个问题。方法一:通过服务器,服务器作为中间人,转发主机间的数据。但若用户数量到达一定数目时,这方法浪费带宽且给服务器带来很大压力,所以方法不可行。方法二,还是通过服务器,但服务器只充当“介绍人”,不转发主机间的数据,具体请看下面的“UDP打孔技术” (UDP hole punching)
穿透NAT——UDP打孔技术
所谓的“打孔技术”,就是在内 的NAT设备上打上一个“孔”(也就是在NAT上建立一个会话,绑定地址和端口 ),这个孔不能由外部来打,只能由内 内的主机来打。而且这个孔可能是有方向的,比如从内部某台主机(比如:192.168.0.10)向外部的某个IP(比如:219.237.60.1)发送一个UDP包,那么就在这个内 的NAT设备上打了一个方向为219.237.60.1的“孔”,以后219.237.60.1就可以通过这个孔与内 的192.168.0.10联系了[13]。
下面就根据NAT的各种类型详细解析如何“打孔”,如何穿透NAT。
1.完全锥形(Full Cone)NAT
处于不同内 的主机A和主机B,各自先连接服务器,从而在各自NAT设备上打开了一个“孔”,服务器收到主机A和主机B的连接后,知道A与B的公 地址和NAT分配给它们的端口 ,然后把这些NAT地址与端口 告诉A与B,由于在完全锥形NAT的特点,A和B给服务器所打开的“孔”,能给别的任何的主机使用。故A与B可连接对方的公 地址和端口直接进行通信。服务器在这里充当“介绍人”,告诉A与B对方的地址和端口 。
2.受限制锥形(Restricted Cone)NAT
A和B还是要先连接服务器,服务器发送A和B的地址和端口信息给A和B,但由于受限制锥形NAT的特点,他们所打开的“孔”,只能与服务器通信。要使他们可以直接通信,解决办法如下:
假如主机A开始发送一个UDP信息到主机B的公 地址上,与此同时,它又通过服务器中转发送了一个邀请信息给主机B,请求主机B也给主机A发送一个UDP信息到主机A的公 地址上。这时主机A向主机B的公 IP发送的信息导致NAT A打开一个处于主机A的和主机B之间的会话,与此同时,NAT B也打开了一个处于主机B和主机A的会话。一旦这个新的UDP会话各自向对方打开了,主机A和主机B之间就可以直接通信了[14]。
3.端口受限制锥形(Port Restricted Cone)NAT
对于该类型的NAT,解决办法跟上面的方法一样。
4.对称型(Symmetric)NAT
对称型NAT,对于不同的外 主机地址,它都会分配不同的端口 ,所以进行UDP打孔比较困难,但也可以进行端口预测打孔,不过不能保证成功。
以上的穿透NAT,是对NAPT来进行穿透,主要是针对UDP协议。TCP协议也有可能,但是可行性非常小,要求更高。并且,语音视频通信是用UDP传输的,故针对TCP的NAT穿透在这里不作讨论。基础NAT不修改经过的数据包的端口 ,它们可以看作是完全锥形NAT的精简版本,即基础NAT也可以被穿透。NAT设备将在一定时间后关闭UDP的一个映射,所以为了保持与服务器能够一直通信,服务器或客户端必须要周期性地发送UDP包,保持映射不被关闭。
目前比较常用的NAT类型是完全锥型NAT
文章知识点与官方知识档案匹配,可进一步学习相关知识 络技能树WAN技术PPP22442 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!