WebRTC中P2P的传输是很重要的一部分。而NAT的穿越过程对于P2P的传输也很重要。


文章目录

  • 1 NAT简介
  • 2 为什么会存在NAT
  • 3 NAT的种类
  • 3.1 完全锥型NAT(full cone nat):*
  • 3.2 IP限制锥型NAT(adress restricted cone nat)
  • 3.3 端口限制锥型NAT(port restricted cone nat)*
  • 3.4 对称型NAT(sysmmetric nat)
  • 4 NAT类型检测
  • 4.1 确认网络连接状态
  • 4.2 检查是否是在NAT之后
  • 4.3 没有经过NAT转换
  • 4.4 经过了NAT转换
  • 4.4.1 检查是否是完全锥类型NAT
  • 4.4.2 检查是否是对称型NAT
  • 4.4.3 判断是否是端口限制型NAT
  • 4.4.4 判断是否是IP限制型NAT
  • 5 完整过程图示


1 NAT简介

NAT全称network adress translation,即网络地址转换。其存在的意义是将私有的IP地址转化为公有IP地址。

android app nat类型检测_android app nat类型检测

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发送的数据。

android app nat类型检测_IP_02

3.2 IP限制锥型NAT(adress restricted cone nat)

私网主机只有先向公网主机发送数据之后,才能接收到公网主机发送的数据。否则接收不到。

示例: 私网主机X向公网主机P发送数据,然后X能接收到P发送的数据

在之前没有向M发送过数据时,无法接收来自M的数据。

android app nat类型检测_IP_03

3.3 端口限制锥型NAT(port restricted cone nat)*

私网主机只有先向公网主机的某一个端口号发送数据之后,才能接收到公网主机的这一端口号发送的数据。接收数据的公网主机更换端口号,则私网主机接收不到。

示例: 主机X先向主机P的q端口发送数据,然后只X只能接收到来自主机P的q端口的数据。

android app nat类型检测_端口号_04

3.4 对称型NAT(sysmmetric nat)

私网主机请求指定的公网主机和端口号之后,后续只能接收来自此公网主机的端口号发送来的数据。更换主机和端口号向私网主机发送数据,私网主机都接收不到。

示例: 私网主机X经过NAT先访问公网上主机P(端口号为q),然后主机能接收到来自P(端口号为q)响应的数据。同样过程访问M(端口号为n),也能接收到来自M的数据。但是对于没有请求过的主机S,如果S向主机X发送数据,则接收不到。说明此NAT类型为对称型。

和端口限制型不同的是,此种类型的转换会对每一个请求都有一个公网的IP和端口号的映射。而端口限制型还是公用一个映射后的公网IP和端口号。

android app nat类型检测_IP_05

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。

5 完整过程图示

android app nat类型检测_端口号_06