目录

根据RFC 3489规定 Nat共分以下类型:

第一部分: NAT类型介绍

Full Cone NAT:

Restricted Cone NAT:

Port Restricted Cone NAT:

Symmetric NAT:

特殊情况:

第二部分:STUN NAT类型检测

​​​​​​​前提条件:

第一步:检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后?

第二步:检测客户端NAT是否是Full Cone NAT?

第三步:检测客户端NAT是否是Symmetric NAT?

第四步:检测客户端NAT是否是Restricted Cone NAT还是Port Restricted Cone NAT?

第三部分:双方Nat组合可穿透性介绍

穿透关系:上述4种类型,如果定义他们的值为序列号,N为序列号相加。

第四部分:一些参考连接传送门

第五部分:P2P内网穿透操作指南


根据RFC 3489规定 Nat共分以下类型:

/// <summary>
/// UDP is always blocked.
/// </summary>
UdpBlocked,/// <summary>
/// No NAT, public IP, no firewall.
/// </summary>
OpenInternet,/// <summary>
/// No NAT, public IP, but symmetric UDP firewall.
/// </summary>
SymmetricUdpFirewall,/// <summary>
/// A full cone NAT is one where all requests from the same internal
/// IP address and port are mapped to the same external IP address and port.
/// Furthermore, any external host can send a packet to the internal host,
/// by sending a packet to the mapped external address.
/// </summary>
FullCone,/// <summary>
/// A restricted cone NAT is one where all requests from the same
/// internal IP address and port are mapped to the same external IP address and port.
///  Unlike a full cone NAT, an external host (with IP address X)
/// can send a packet to the internal host only if the internal host
/// had previously sent a packet to IP address X.
/// </summary>
RestrictedCone,/// <summary>
/// A port restricted cone NAT is like a restricted cone NAT, but the restriction
/// includes port numbers. Specifically, an external host can send a packet,
/// with source IP address X and source port P, to the internal host only if
/// the internal host had previously sent a packet to IP address X and port P.
/// </summary>
PortRestrictedCone,/// <summary>
/// A symmetric NAT is one where all requests
/// from the same internal IP address and port,
/// to a specific destination IP address and port, are mapped to the same external
/// IP address and port.  If the same host sends a packet with the same source address
/// and port, but to a different destination, a different mapping is used.
/// Furthermore, only the external host that
/// receives a packet can send a UDP packet back to the internal host.
/// </summary>
Symmetric

第一部分: NAT类型介绍 

常规情况下。NAT共分以下4大类:

  • Full Cone NAT:

内网主机建立一个UDP socket(LocalIP:LocalPort) 第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),以后用这个socket向外面任何主机发送数据都将使用这对(PublicIP:PublicPort)。此外,任何外部主机只要知道这个(PublicIP:PublicPort)就可以发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包

  • Restricted Cone NAT:

内网主机建立一个UDP socket(LocalIP:LocalPort) 第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),以后用这个socket向外面任何主机发送数据都将使用这对(PublicIP:PublicPort)。此外,如果任何外部主机想要发送数据给这个内网主机,只要知道这个(PublicIP:PublicPort)并且内网主机之前用这个socket曾向这个外部主机IP发送过数据。只要满足这两个条件,这个外部主机就可以用自己的(IP,任何端口)发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包

  • Port Restricted Cone NAT:

内网主机建立一个UDP socket(LocalIP:LocalPort) 第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),以后用这个socket向外面任何主机发送数据都将使用这对(PublicIP:PublicPort)。此外,如果任何外部主机想要发送数据给这个内网主机,只要知道这个(PublicIP:PublicPort)并且内网主机之前用这个socket曾向这个外部主机(IP,Port)发送过数据。只要满足这两个条件,这个外部主机就可以用自己的(IP,Port)发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包

  • Symmetric NAT:

内网主机建立一个UDP socket(LocalIP,LocalPort),当用这个socket第一次发数据给外部主机1时,NAT为其映射一个(PublicIP-1,Port-1),以后内网主机发送给外部主机1的所有数据都是用这个(PublicIP-1,Port-1); 如果内网主机同时用这个socket给外部主机2发送数据,第一次发送时,NAT会为其分配一个(PublicIP-2,Port-2), 以后内网主机发送给外部主机2的所有数据都是用这个(PublicIP-2,Port-2).

特殊情况:

如果NAT有多于一个公网IP,则PublicIP-1和PublicIP-2可能不同,如果NAT只有一个公网IP,则Port-1和Port-2肯定不同,也就是说一定不能是PublicIP-1等于 PublicIP-2且Port-1等于Port-2。

此外,如果任何外部主机想要发送数据给这个内网主机,那么它首先应该收到内网主机发给他的数据,然后才能往回发送,否则即使他知道内网主机的一个(PublicIP,Port)也不能发送数据给内网主机,这种NAT无法实现UDP-P2P通信。

第二部分:STUN NAT类型检测

  • ​​​​​​​​​​​​​​前提条件:

有一个公网的服务器并且绑定了两个公网IP(IP-1,IP-2)。这个服务器做UDP监听(IP-1,Port-1),(IP-2,Port-2)并根据客户端的要求进行应答。

  • 第一步:检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后?

操作:
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端无法进行UDP通信,可能是防火墙或NAT阻止UDP通信,这样的客户端也就 不能P2P了(检测停止)。
当客户端能够接收到服务器的回应时,需要把服务器返回的客户端(IP,Port)和这个客户端socket的 (LocalIP,LocalPort)比较。如果完全相同则客户端不在NAT后,这样的客户端具有公网IP可以直接监听UDP端口接收数据进行通信(检 测停止)。否则客户端在NAT后要做进一步的NAT类型检测(继续)。

  • 第二步:检测客户端NAT是否是Full Cone NAT?

操作:
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用另一对(IP-2,Port-2)响应客户端的请求往回 发一个数据包,客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端的NAT不是一个Full Cone NAT,具体类型有待下一步检测(继续)。如果能够接受到服务器从(IP-2,Port-2)返回的应答UDP包,则说明客户端是一个Full Cone NAT,这样的客户端能够进行UDP-P2P通信(检测停止)。

  • 第三步:检测客户端NAT是否是Symmetric NAT?

操作:
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程直到收到回应(一定能够收到,因为第一步保证了这个客户端可以进行UDP通信)。
用同样的方法用一个socket向服务器的(IP-2,Port-2)发送数据包要求服务器返回客户端的IP和Port。
比 较上面两个过程从服务器返回的客户端(IP,Port),如果两个过程返回的(IP,Port)有一对不同则说明客户端为Symmetric NAT,这样的客户端无法进行UDP-P2P通信(检测停止)。否则是Restricted Cone NAT,是否为Port Restricted Cone NAT有待检测(继续)。

  • 第四步:检测客户端NAT是否是Restricted Cone NAT还是Port Restricted Cone NAT?

操作:
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用IP-1和一个不同于Port-1的端口发送一个UDP 数据包响应客户端, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端是一个Port Restricted Cone NAT,如果能够收到服务器的响应则说明客户端是一个Restricted Cone NAT。以上两种NAT都可以进行UDP-P2P通信。
注:以上检测过程中只说明了可否进行UDP-P2P的打洞通信,具体怎么通信一般要借助于Rendezvous Server。另外对于Symmetric NAT不是说完全不能进行UDP-P2P达洞通信,可以进行端口预测打洞,不过不能保证成功。

第三部分:双方Nat组合可穿透性介绍

上面这张图是转的别人空间的,下面是我整理的:

实际情况是双方NAT组合是有16种可能性的。如何穿透方法将在下面详细描述:

NAT类型:把4种NAT类型分别标为1,2,3,41,FullCone,2,RestrictedCone,3,PortRestrictedCone,4,SymmetricA1 vs B1,A1 vs B2,A1 vs B3,A1 vs B4,A2 vs B1,A2 vs B2,A2 vs B3,A2 vs B4,(特殊处理:A2先向B4发包,在本地Nat打洞等待,然后B4向A2发送数据,A2收到即通)A3 vs B1,A3 vs B2,A3 vs B3,A3 vs B4,(特殊处理:A3猜测B4的端口+1方式尝试)A4 vs B1,A4 vs B2,(特殊处理:B2先向A4发包,在本地Nat打洞等待,然后A4向B2发送数据,B2收到即通)A4 vs B3,(特殊处理:B3猜测A4的端口+1方式尝试)A4 vs B4,(特殊处理:TURN转发或双方互相猜测,成功概率极小)

对称nat无法穿透,这个说法不正确,对称nat与全椎full cone nat、对称nat 与 ip受限椎型cone,是可以穿透的,对称nat与 端口受限、对称nat与对称nat,不可穿透。
类型:

1、full cone 全椎
2、Restricted Cone ip受限
3、port Restricted Cone 端口受限
4、Symmetric 对称。

穿透关系:上述4种类型,如果定义他们的值为序列号,N为序列号相加。

则N<=6可穿透。2 和 4 序列相加 = 6 则可穿透。
3(端口受限)和4(对称)= 7 不可穿透。

第四部分:一些参考连接传送门

P2P学习(一)NAT的四种类型以及类型探测 - 山上有风景 - 博客园

NAT的四种类型及类型检测【很好】 - bw_0927 - 博客园

RFC3489协议英文版:

http://www.ietf.org/rfc/rfc3489.txt

第五部分:P2P内网穿透操作指南

以下穿透指南是我自行分析整理的。如有不妥之处还望指出。谢谢

NAT类型:把4种NAT类型分别标为1,2,3,41,FullCone,2,RestrictedCone,3,PortRestrictedCone,4,Symmetric场景:有两台主机A:portA和B:portB(port都为外网端口,是与打洞服务器通信的端口,通过客户端发送心跳包维持打开),以及打洞服务器S,
需求:A拿到了B:portB的信息,要与B通信。(1)B为类型1;无论A为哪种类型,都可以直接与B:portB udp通信
(2)B为类型2;无论A为哪种类型,在B知道A之前都无法直接连接,A给S发一个打洞请求,S转发该请求到B。 若A为类型1,则A:portA可直接与B:portB udp通信; 若A为类型2或3,则A:portA和B:portB各自向对方发送一个一字节的udp包,分别在自己的路由器上打洞,从此A:portA和B:portB可进行udp通信; 若A为类型4,则portA在与不同的ip:port通信时会不一样,所以B:portB先向A发送一个一字节的udp包,在路由器上打洞,然后等待A:portA先发送数据,B:portB接收到A:portA的数据后,即知道portA,也可互通数据了;
(3)B为类型3;无论A为哪种类型,在B知道A之前都无法直接连接,A给S发一个打洞请求,S转发该请求到B。 若A为类型1,则A:portA可直接与B:portB udp通信; 若A为类型2或3,则A:portA和B:portB各自向对方发送一个一字节的udp包,分别在自己的路由器上打洞,从此A:portA和B:portB可进行udp通信; 若A为类型4,则portA在与不同的ip:port通信时会不一样,而B又要求知道portA才可让A:portA连进来,所以这种情况B只能猜测与B:portB通信的portA,通信概率小;
(4)B为类型4;无论A为哪种类型,在B知道A之前都无法直接连接,A给S发一个打洞请求,S转发该请求到B。 若A为类型1,则A:portA可直接与B:portB udp通信; 若A为类型2, 则A:portA先向B发送一个一字节的udp包,在路由器上打洞,然后等待B:portB先发送数据,A:portA接收到B:portB的数据后,即知道portB,也可互通数据了;若B的类型为3,见(3)中A为类型4的描述;若A为4,双方无法知道对方的端口,无法通信。分析可以得出:
1,无论双方是何类型:[在B知道A之前都无法直接连接,A给S发一个打洞请求,S转发该请求到B] 这步都是必须,后续则可根据不同的类型分别判断处理具体操作:
IF not (B4 and A3) OR (B3 and A4) then
begin1,A先从S查询到B的对公信息2,A收到B信息后向S发一个打洞请求,请求连接B3,S转发A的请求到B(要包含A的信息)4, A:portA和B:portB各自向对方发送一个一字节的udp包,分别在自己的路由器上打洞,从此A:portA和B:portB可进行udp通信(可以解决以下8种组合的NAT穿透:A1 vs B1,A1 vs B2,A1 vs B3,A1 vs B4,A2 vs B1,A2 vs B2,A2 vs B3,A2 vs B4,(特殊处理:A2先向B4发包,在本地Nat打洞等待,然后B4向A2发送数据,A2收到即通)A3 vs B1,A3 vs B2,A3 vs B3,A3 vs B4,(特殊处理:A3猜测B4的端口+1方式尝试)A4 vs B1,A4 vs B2,(特殊处理:B2先向A4发包,在本地Nat打洞等待,然后A4向B2发送数据,B2收到即通)A4 vs B3,(特殊处理:B3猜测A4的端口+1方式尝试)A4 vs B4,(特殊处理:TURN转发或双方互相猜测,成功概率极小))
end;5 ,B4 vs A2 [若B为类型4,则portB在与不同的ip:port通信时会不一样,所以A:portA先向B发送一个一字节的udp包,在路由器上打洞,然后等待B:portB先发送数据,A:portA接收到B:portB的数据后,即知道portB,也可互通数据了;]
6 ,A4 vs B2 [若A为类型4,则portA在与不同的ip:port通信时会不一样,所以B:portB先向A发送一个一字节的udp包,在路由器上打洞,然后等待A:portA先发送数据,B:portB接收到A:portA的数据后,即知道portA,也可互通数据了;]
5,4 vs 4,3 vs 4单独处理[转发]

参考:udp协议怎么穿透Symmetric NAT? - 知乎

P2P内网穿透之Nat类型介绍及Nat类型检测16种NAT组合穿透操作指南整理相关推荐

  1. 群晖NAS使用ZeroTier进行p2p内网穿透

    群晖NAS使用ZeroTier进行p2p内网穿透 看不惯可以看:https://www.zjjflsz.top/wordpress/?p=133 前期准备:ZeroTier安卓安装包.windos的Z ...

  2. 基于个人服务器的P2P内网穿透

    前言 作为一个重度桌游爱好者,最近和小伙伴沉迷TTS(桌游模拟器),但是TTS是基于P2P进行连接的,如果小伙伴都不在一个网络节点上就会非常卡顿,为了更好的玩游戏,最后使用了基于zerotier的内网 ...

  3. Java--枚举类型(枚举类型介绍 定义枚举类型 枚举类型的使用 枚举类型的注意事项 遍历枚举项)

    01: Java–枚举类型(枚举类型介绍 & 定义枚举类型 & 枚举类型的使用 & 枚举类型的注意事项 & 遍历枚举项) 02: Java–枚举类型(枚举类型实现接口 ...

  4. p2p打洞源码,p2p内网穿透源码,NAT内网穿透源码,NAT穿透源码

    一.p2p是什么? p2p是点对点的缩写(peer-to-peer networking),其可以定义为:端对端的资源共享,每一端即可是服务端,也可以是客户端.既可以是资源的提供者,也可以是资源的共享 ...

  5. p2p内网穿透技术-udp打洞

    在公司如何访问家里的电脑?实现方法有很多,其它p2p传输文件最快,能否实现? udp打洞原理 假设有两台分别处于各自的私有网络中的主机:A和B:N1和N2是两个网络的NAT设备,分别拥有IP地址P1和 ...

  6. 一款超牛逼的 P2P 内网穿透神器(附安装、使用教程)

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...

  7. 内网之windows域相关概念介绍

    原地址 https://www.920vip.net/article/36 1 内网渗透基础 内网/局域网(Local Area Network,LAN),是指在某一区域内有多台计算机互联而成的计算机 ...

  8. ip以及端口转发数据、根据端口转发显示内网的web的方法介绍

    一.ip和端口都转发(跨机器) 将140.207.3.110(内网是192.168.0.139)服务器 端口为11450的数据转发到 192.168.0.138的1145端口上面去. 1.部署服务器1 ...

  9. 【原创】IP摄像头技术纵览(七)---P2P技术—UDP打洞实现内网NAT穿透

    [原创]IP摄像头技术纵览(七)-P2P技术-UDP打洞实现内网NAT穿透 本文属于<IP摄像头技术纵览>系列文章之一: Author: chad Mail: linczone@163.c ...

最新文章

  1. 高校学霸情侣 双双保研中科院,3年获近9万奖学金,120余项个人荣誉……
  2. Jmeter 使用脚本 生成html测试报告
  3. java 存储png文件_vue图片上传及java存储图片(亲测可用)
  4. 信息学奥赛一本通(1034:计算三角形面积)
  5. 深度优先搜索之在图上寻找路径
  6. 谈谈JavaScript的ECMA5中forEach
  7. 如何在oracle中查询所有用户表的表名、主键名称、索引、外键等 - Oracle   基础和管理_files...
  8. python+selenium从excel读取成语到谷歌搜索得到搜索结论数
  9. mouseenter和mouseleave与mouseover和mouseout的区别
  10. Git merge合并冲突 error: ‘merge‘ is not possible because you have unmerged files的解决方法
  11. html自我介绍怎么弄,用html设计一个自我介绍的静态网页
  12. 内核同步机制——蜗窝科技
  13. php ftp 时间不对,ftp时间差8小时引起的?
  14. ZZULIOJ:1088: 手机短号 (多实例)
  15. Hadoop中的slaves文件
  16. 加入域时提示“不能访问网络位置”
  17. 用python画地球_如何用PYTHON程序模拟一个太阳系?
  18. Mysql_sql存储过程
  19. MyBatis中万能的Map和模糊查询
  20. 三菱四节传送带控制梯形图_三菱plc控制传送带三级 编程 fx2n 模拟四节传送带控制实验三菱...

热门文章

  1. android自动化测试弹框,干货 | App 自动化测试痛点(弹框及首页启动加载完成判断处理)...
  2. 关于uniappH5安卓机拨打电话报错 tel:177*******6 的网页无法加载,因为: net::ERR_UNKNOWN_URL_SCHEME
  3. 【三】部署zabbix-proxy代理服务器和高可用,以及监控windows系统和java应用
  4. 支付宝页面第三方登录开发
  5. Web编程原理之HTTP协议
  6. Leanback教程
  7. eclipse设置黑色背景
  8. AdblockPlus拦截规则简单教程
  9. 实现和(女)朋友一起看电影 Java websocket
  10. 《Maven实战》笔记整理