WebRTC中P2P的传输是很重要的一部分。而NAT的穿越过程对于P2P的传输也很重要。
1 NAT简介
NAT全称network adress translation,即网络地址转换。其存在的意义是将私有的IP地址转化为公有IP地址。
2 为什么会存在NAT
所有的内网都改为公网地址难道不可以吗?一方面是因为起初公网的IPv4的地址不够用,另一方面是防止其他主机或者电脑直接访问公网上的电脑,起到一定的安全作用。另
3 NAT的种类
既然上面说了,NAT存在的目的一方面是因为访问安全。那么按照安全等级划分,既和其他外网主机的通讯的限制类型可划分为四种类型。即完全锥型,IP限制型,端口限制性,对称型。下面对四种类型作简要介绍:
假设现有:
内网的主机X: IP为10.21.0.23 端口号为8888, NAT后的映射IP为10.3.02.45 端口号为2222
公网主机M: IP为192.45.80.43 端口号为 1111
公网主机P: IP为192.45.80.44 端口号为 2222
公网主机S: IP为192.45.80.45 端口号为 3333
3.1 完全锥型NAT(full cone nat)😗
无论私网主机之前是否向公网Ip发送过数据,私网主机都能接收到公网主机发送的数据。
示例: 私网主机X先访问公网主机M,主机X能成功收到M发送的数据,并且主机X在没有向主机P发送数据的情况下,也能收到另一台主机P发送的数据。
3.2 IP限制锥型NAT(adress restricted cone nat)
私网主机只有先向公网主机发送数据之后,才能接收到公网主机发送的数据。否则接收不到。
示例: 私网主机X向公网主机P发送数据,然后X能接收到P发送的数据
在之前没有向M发送过数据时,无法接收来自M的数据。
3.3 端口限制锥型NAT(port restricted cone nat)*
私网主机只有先向公网主机的某一个端口号发送数据之后,才能接收到公网主机的这一端口号发送的数据。接收数据的公网主机更换端口号,则私网主机接收不到。
示例: 主机X先向主机P的q端口发送数据,然后只X只能接收到来自主机P的q端口的数据。
3.4 对称型NAT(sysmmetric nat)
私网主机请求指定的公网主机和端口号之后,后续只能接收来自此公网主机的端口号发送来的数据。更换主机和端口号向私网主机发送数据,私网主机都接收不到。
示例: 私网主机X经过NAT先访问公网上主机P(端口号为q),然后主机能接收到来自P(端口号为q)响应的数据。同样过程访问M(端口号为n),也能接收到来自M的数据。但是对于没有请求过的主机S,如果S向主机X发送数据,则接收不到。说明此NAT类型为对称型。
和端口限制型不同的是,此种类型的转换会对每一个请求都有一个公网的IP和端口号的映射。而端口限制型还是公用一个映射后的公网IP和端口号。
4 NAT类型检测
在P2P的传输过程中,首先要在端对端传输之前要先建立一条通道。而这条通道的建立首先要知道NAT的类型,这样才能知道如何打通这条通道。
NAT类型检测要首先要了解STUN服务。使用STUN服务和处于NAT之后的客户端建立一个连接,然后通过一些列的策略来判断NAT的类型。
STUN(Simple Traversal Of UDP Through NAT 或 Session Traversal Utilities for NAT)是用来穿越NAT的协议。它允许位于NAT(或多重NAT)后的客户 端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于 NAT路由器之后的主机之间建立UDP通信。
下面介绍如何通过STUN服务来检测NAT类型。
4.1 确认网络连接状态
首先Client向Server发送一个请求,Server以相同的IP和port回复。如果client收到了回复,则说明网络状态正常。否则说明UDP的连接被阻塞
4.2 检查是否是在NAT之后
在确认UDP的连接状态是正常的之后,client再判断server接收到的client的ip和port和client请求时的ip和port是否一致。如果不一致说明是经历了NAT转换。一致说明没有经过NAT转换。
4.3 没有经过NAT转换
如果没有经过NAT转换,那么client再想同一个Server再次发送请求,然后Server以不同的IP和Port回复。如果client收到了回复则说明client本身处于公网IP,否则说明存在网络防火墙。
4.4 经过了NAT转换
4.4.1 检查是否是完全锥类型NAT
当前已经知道Client在NAT之后,此时Client向Server发送请求,Server以不同的Ip和Port回复,如果client收到了回复,则说明是完全锥类型NAT
4.4.2 检查是否是对称型NAT
由于对称型NAT的特征比较明显,每次发送出去的请求都会由私网Ip和Port映射出一个公网的Ip和Port。所以只要判断向Server1请求时,本身的公网Ip和Port和向Server2请求时的公网Ip是否是同一个。如果不是同一个Ip和Port。则说明NAT类型是对称型NAT。
4.4.3 判断是否是端口限制型NAT
当前已经知道NAT类型不是对称型NAT。此时当client向Server发送请求时,Server以相同的Ip和不同的Port回复,如果client能收到回复,则说明是Port限制型NAT。
4.4.4 判断是否是IP限制型NAT
如果client能收到回复说明是IP限制型NAT。