当前位置: 首页 > news >正文

NAT 类型及 P2P 穿透

在当今互联网环境中,网络地址转换(NAT, Network Address Translation)技术已成为连接私有网络与公共互联网的核心桥梁。然而,NAT的广泛应用也为P2P通信带来了挑战。在P2P通信中,NAT穿透技术是实现设备间直接连接的关键。由于NAT屏蔽了外部网络的直接访问,P2P应用程序需要通过巧妙的技术手段绕过这一障碍,以建立高效的通信通道。本文深入探讨不同类型 NAT 的特性,分析NAT类型的探测方法及其原理,阐述NAT穿透的实现机制。

1. NAT类型

网络地址转换(NAT)类型根据其映射和过滤规则的不同,可分为以下四种主要类型,每种类型在地址端口映射和外部连接限制方面具有独特特性,影响P2P通信和NAT穿透的效果。这些NAT类型的不同特性直接影响P2P通信的可行性和效率,理解其工作原理是实现有效NAT穿透的基础。

1.1. 完全锥型(Full Cone)

内部主机的IP和端口映射到固定的外部IP和端口,任何外部设备都可以通过该外部地址向内部主机发起连接。特点是映射关系固定且开放,穿透性最强,但安全性较低。

如下图所示,Client B 和 Client C 都可以与 Client A 无阻碍双向通信。

1.2. 地址受限锥型(Address Restricted Cone)

内部主机的IP和端口映射到固定的外部IP和端口,但只有内部主机主动联系过的外部设备才能通过该映射发起连接。相比全锥形NAT,增加了来源IP限制,安全性更高,但穿透复杂性增加。

如下图所示,Client A 必须先向 Client B 发送报文,Client B 才能够向 Client A 发送报文;否则,Client C 直接向 Client A 发送的报文,会被 NAT 丢弃。

1.3. 端口受限锥型(Port Restricted Cone)

类似受限锥形NAT,但进一步限制外部设备必须使用内部主机曾联系过的IP和端口进行通信。端口限制提高了安全性,但对P2P连接的实现要求更高。

如下图所示,不仅 Client C 发送的报文会被丢弃,Client B 通过不同端口(IP地址不变)发送的报文也会被 NAT 丢弃。

1.4. 对称型(Symmetric)

每次内部主机与不同外部设备通信时,NAT分配不同的外部端口映射,且仅允许对应的外部设备通过该映射回连。映射的高度动态性和严格限制使对称NAT穿透难度最大。

如下图所示,Client A 向 Client B 和 Client C 发送报文,会在 NAT 上生成两个不同的映射表项,外部报文的 IP 地址和端口在表项中查找不到,都会被丢弃。

2. NAT类型探测

NAT类型探测是识别网络地址转换设备行为的关键过程,通过发送特定的请求并分析响应,确定NAT的类型及其对通信的限制。探测过程通常利用UDP数据包,通过与外部服务器交互,测试NAT的映射和过滤规则。核心原理在于观察内部IP和端口映射到外部地址的模式,以及外部请求是否能够成功接收。探测开始时,内部主机发送请求到不同外部IP和端口,服务器使用不同的IP和端口返回响应,基于是否收到响应及映射地址的稳定性,逐步判断NAT类型。包括检查UDP是否被防火墙阻止、是否分配公共IP,以及映射是否对所有外部请求开放或受地址/端口限制。

上图展示了NAT类型探测的技术原理,接下来我们将对其探测原理和流程进行深入分析。

2.1. UDP Blocked

内部主机向外部服务器发送探测报文。如果未收到服务器的响应,则表明网络存在UDP阻塞,可能由防火墙或NAT配置限制所致

2.2. Firewall

当内部主机收到服务器的首次响应并从响应中确认分配了公网IP后,探测流程继续进行。接下来,内部主机再次向服务器发送探测报文。此时,服务器将使用不同的IP地址和端口进行响应,以进一步测试网络环境的限制。如果第二次响应未能成功接收,表明可能存在防火墙对特定IP或端口的额外过滤,从而中断了通信。

2.3. Open Internet

如果内部主机成功接收到服务器使用不同IP地址和端口发送的第二次响应,则表明网络环境没有额外的限制或过滤,属于开放互联网(Open Internet)状态,允许来自不同外部端点的自由通信。

2.4. Full Cone NAT

当内部主机收到服务器的首次响应后,若发现响应中显示的并非公网IP,表明其通信经过NAT映射。接下来,内部主机再次发起探测报文,服务器则使用不同的IP地址和端口进行响应。如果内部主机仍能成功接收到这一第二次响应,说明NAT允许来自任何外部IP和端口的请求通过相同的映射,这符合全锥形NAT(Full Cone NAT)的特性,表明该NAT类型具有较高的开放性。

2.5. Symmetric NAT

如果内部主机未能接收到使用不同IP和端口发送的第二次响应,则进一步进行探测。内部主机随后向另一个外部端点(IP2:Port2)发起第三次探测报文,服务器使用相同地址(IP2:Port2)发送响应。如果内部主机发现外部看到的公网地址与第一次不同,表明NAT为每个不同的外部IP和端口对分配了独特的映射,这一行为特征符合对称NAT(Symmetric NAT)的特性,反映了其严格的动态映射规则。

2.6. Restricted Cone NAT

如果比较发现第一次和第三次探测中服务器返回的公网地址相同,表明NAT的映射在不同外部IP间保持一致。接下来,内部主机发起第四次探测,服务器使用与前次相同的IP但不同端口进行响应。如果内部主机无法收到这一响应,说明NAT限制了来自未主动联系过的端口的连接,符合端口受限锥形NAT(Port Restricted Cone NAT)的特性。反之,如果能够成功接收响应,表明NAT仅对未联系过的IP施加限制,而端口开放,符合地址受限锥形NAT(Address Restricted Cone NAT)的特征。

3. P2P可穿透性

P2P穿透又叫P2P打洞,是指在网络地址转换(NAT)环境下,通过技术手段实现点对点(P2P)通信中两台主机直接建立连接的过程。尽管NAT有效解决了IP地址短缺和网络安全问题,但其对外部连接的限制(如映射和过滤规则)往往阻碍了P2P通信的直接性。影响P2P穿透成功率的因素是多方面的,比如 NAT 设备对标准协议的支持、动态 IP 地址策略、防火墙策略等,这其中,双方NAT类型的组合对P2P穿透成功率影响最大。

上面表格展示了不同NAT类型组合,P2P穿透的理论可行性,接下来我们深入研究其背后机理。

双方通过STUN服务器获取初始公网映射,并通过信令服务器交换这些地址。

3.1. 全锥型<->全锥型

全锥型 NAT 任何外部设备都可以通过该外部地址向内部主机发起连接,只要获取了 NAT 后地址,就可以完全无限制的进行双向通信,谁先向谁发送报文都可以。

3.2. 全锥型<->地址受限锥形

地址受限锥型 NAT,只允许与内部主机主动联系过地址进行通信,这就要求 Client B 要先向 Client A 发送报文,在地址受限锥型 NAT 上建立映射表项并记录地址 IPA',否则 Client A 发往 Client B 的报文会被 NAT 丢弃。

3.3. 全锥型<->端口受限锥型

端口受限锥型比地址受限锥型的限制更严格,只允许与内部主机主动联系过的地址和端口进行通信,这对全锥型 NAT 来说不是问题,因为一般情况,其映射的地址和端口不会变化。P2P打洞逻辑和流程与地址受限锥型一致。

3.4. 全锥型<->对称型

对称型 NAT 为不同外部设备通信分配不同的端口,如果 Client A 先发送报文,报文会被对称型 NAT 丢弃。因此,需要 Client B 向 Client A 发送报文,这样在对称型 NAT 会创建映射表项,分配新的地址和端口,Client A 发送的响应能够送达 Client B。

3.5. 地址受限锥型<->地址受限锥型

两边都是地址受限锥型 NAT,那第一个报文肯定会被对方 NAT 丢弃,如下图所示。但没关系,此时已经在主动发送报文端 Client B 的 NAT 上分配了端口映射,允许 IPA' 的报文通过。紧接着 Client A 发送报文,报文会顺利到达 Client B,双向打洞完成。

3.6. 地址受限锥型<->端口受限锥型

由于地址受限锥型建立的映射是固定映射,从 Client A 发送 Client B 报文的端口不会变化,因此,其打通逻辑和流程与 3.5 是一致的。

3.7. 地址受限锥型<->对称型

由于 Client B 的 NAT 是对称型,Client B 向 Client A 发送报文时,会分配新的端口,如果 Client B 发送的报文不能够到达 Client A,则 Client A 无法获取 Client B 在对称型 NAT 上分配的端口。因此,要求 Client A 先向 Client B 发送报文,虽然报文会被对称型 NAT 丢弃,但是会在地址受限锥型 NAT 上创建表项。

假设对称型 NAT 每次分配的IP地址不变,IPB'=IPB''。

3.8. 端口受限锥型<->端口受限锥型

双方都是端口受限锥型,任何一方先发送报文,报文都会被对方 NAT 丢弃,但是会在本端出口 NAT 上创建表项并记录访问的IP和端口,这样后续的报文就可以顺利通过。

3.9. 端口受限锥型<->对称型

对称型 NAT 每次都会分配新的端口,Client A 发往 Client B 的报文会被端口受限锥型 NAT 丢弃,这样 Client A就无法获知 Client B 在对称型 NAT 上的端口。因此,理论上是无法打洞成功的。

3.10. 对称型<->对称型

双方都是对称型 NAT,双方都无法获取对端绑定的端口,理论上无法打洞。

4. 总结

本文简要概述了NAT类型,并深入分析了NAT类型探测与P2P穿透的技术原理。然而,这些分析基于理想化环境,实际网络场景远超本文描述的复杂性,可能面临多层NAT、IP地址动态变化以及打洞窗口时间限制等诸多挑战。针对这些问题,工程实践中需开发针对性的解决方案,以增强系统的可靠性和适应性。本文仅展示了打洞的基本原理,而在实际工程中,为提升打洞效率,通常采用双向同时探测策略,从而优化连接建立的成功率和速度。此外,值得一提的是,对于理论上无法打洞的结论,工程上常通过智能猜测和优化手段,尝试将“不可能”转化为“可能”。

http://www.lqws.cn/news/586351.html

相关文章:

  • 信创项目oracle数据库迁移到达梦数据库需要会有哪些问题?如何解决?
  • Linux云计算基础篇(2)
  • 2025年6月个人工作生活总结
  • 【Springai】项目实战进度和规划
  • SpringCloud系列(42)--搭建SpringCloud Config分布式配置总控中心(服务端)
  • 个人博客开发问题记录:ThreadLocal获取用户数据失败
  • 《用奥卡姆剃刀原理,为前端开发“减负增效”》
  • CentOS 7 8 安装 madam
  • LLaMA-Factory框架之参数详解
  • (LangChain)RAG系统链路之嵌入模型Embedding(三)
  • spring-ai 工作流
  • 深入理解CSS定位:掌握网页布局的核心技术
  • SpringBoot 启动入口深度解析:main方法执行全流程
  • 【Python使用】嘿马云课堂web完整实战项目第2篇:CMS页面管理需求,后端工程搭建【附代码文档】
  • C++ 安装使用教程
  • Git命令使用心得
  • LeetCode 594. 最长和谐子序列
  • if __name__ == ‘__main__‘:
  • 【嵌入式ARM汇编基础】-ELF文件格式内部结构详解(三)
  • IDEA相关配置记录
  • 对selenium进行浏览器和驱动进行配置Windows | Linux
  • 【机器学习第四期(Python)】LightGBM 方法原理详解
  • Excel Report
  • Photoshop 插件 NBP Freqsep Control 2.0 安装全流程
  • C++ Programming Language —— 第4章:程序流程结构
  • 【启发式算法】Dynamic A*(D*)算法详细介绍(Python)
  • 「Java流程控制」while循环
  • 3.前端和后端参数不一致,后端接不到数据的解决方案
  • Redis 和 Mysql 如何保证数据一致性
  • [Python 基础课程]变量