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

WebRTC:去中心化网络P2P框架解析

在互联网的世界里,数据的传输就像一场永不停歇的 “信息快递”。当我们使用 WebRTC 实现视频通话时,背后支撑的网络框架至关重要。今天,我们将深入探索 WebRTC 开发中视频通话的前置基础 ——P2P(点对点)框架,尤其是其中 “去中心化” 这一核心概念,以及与之紧密相关的网络地址映射 NAT、网络穿透、STUN、TURN 等关键技术,揭开视频通话流畅背后的神秘面纱。

一、中心化网络与去中心化:两种截然不同的 “信息王国”

(一)中心化网络:“皇帝统治” 的信息王国

想象一下,在一个庞大的王国中,所有的信息传递都要经过一位 “皇帝”(中心服务器)。无论是两个村民之间的书信往来,还是商人之间的货物订单,都需要先把信息交给 “皇帝”,由 “皇帝” 再进行分发。这就是中心化网络的形象比喻。

在实际的网络世界里,中心化网络结构中,客户端的所有数据交互都依赖于中心服务器。例如早期的即时通讯软件,用户发送的每一条消息,都要先上传到服务器,再由服务器推送给接收方。这种方式虽然便于管理和控制,就像 “皇帝” 可以轻松掌握王国里的一切信息,但也存在明显的弊端。一旦 “皇帝”(中心服务器)出现故障,整个王国(网络系统)就会陷入瘫痪,所有的信息传递都会中断。而且,随着用户数量的增加,“皇帝”(服务器)的负担会越来越重,处理信息的效率也会降低。

(二)去中心化:“村民自治” 的信息新世界

与中心化网络不同,去中心化网络更像是一个 “村民自治” 的世界。在这个世界里,没有高高在上的 “皇帝”,每个村民(节点)都可以直接与其他村民进行信息交流。这就是 P2P 去中心化网络的核心思想。

在 P2P 网络中,每个节点都具有平等的地位,它们既可以作为数据的发送者,也可以作为数据的接收者。比如在 WebRTC 视频通话中,当两个用户建立连接后,他们的设备就直接进行视频数据的传输,无需经过中间的服务器中转。这样一来,不仅减轻了服务器的压力,就像减少了 “皇帝” 的工作量,还提高了数据传输的效率和网络的稳定性。即使部分节点出现故障,也不会影响其他节点之间的正常通信,就像个别村民生病,并不会影响整个村庄的交流一样。

二、网络地址映射 NAT:网络世界的 “地址翻译官”

(一)NAT 原理:从 “私人地址” 到 “公共地址” 的转换

在网络世界里,每个设备都有自己的地址,就像现实生活中每个家庭都有自己的门牌号。但由于 IPv4 地址资源有限,很多家庭网络(局域网)中的设备使用的都是 “私人地址”,这些地址在局域网内是唯一的,但在整个互联网中却不能直接使用。这时候,就需要 NAT(Network Address Translation,网络地址映射)来充当 “地址翻译官”。

当局域网内的设备想要访问互联网时,它会先将自己的 “私人地址” 和要访问的目标地址打包成一个 “信息包裹”,发送给 NAT 设备(通常是家庭路由器)。NAT 设备收到包裹后,会将包裹中的 “私人地址” 替换成自己的 “公共地址”,并记录下这个替换关系,就像给包裹贴上一个新的标签。然后,NAT 设备将这个新包裹发送到互联网上。当互联网上的服务器返回数据时,NAT 设备再根据之前记录的替换关系,把数据正确地转发给局域网内的设备。

(二)NAT 的实现:路由器的 “魔法变身”

NAT 的实现主要依赖于路由器等网络设备。路由器内部有一个 NAT 表,用于记录 “私人地址” 和 “公共地址” 的映射关系。当数据包进入路由器时,路由器会根据 NAT 表的规则对数据包的源地址进行转换;当数据包从互联网返回时,路由器又会根据 NAT 表对目的地址进行转换。

这个过程就像路由器在进行一场 “魔法变身”。比如,局域网内的设备 A(地址为 192.168.1.100)想要访问互联网上的服务器 B(地址为 203.0.113.1),设备 A 发送的数据包到达路由器后,路由器会将源地址 192.168.1.100 替换成路由器自己的公共地址(假设为 123.45.67.89),然后将数据包发送给服务器 B。服务器 B 返回的数据到达路由器时,路由器再根据 NAT 表,把目的地址 123.45.67.89 转换回 192.168.1.100,将数据准确地发送给设备 A。

NAT 的实现方案有三种,静态转换,动态转换,端口地址映射。
此部分图文参考 NAT网络地址转换协议简单理解_网心云全锥型改为映射公网型-CSDN博客
(1)静态转换:一对一的 “专属翻译”

静态转换就像是一位 “专属翻译”,为局域网内的特定设备提供一对一的地址映射服务。在这种方式下,管理员会手动将局域网内设备的私有 IP 地址与公网 IP 地址进行固定绑定,建立起永久的映射关系。一旦设定完成,只要设备的私有 IP 地址不变,它与公网 IP 地址的对应关系就始终保持稳定,就如同为设备分配了一个专属的、固定不变的 “对外身份”,但这种方法不能节省IPV4地址,一般不用。

例如,假设局域网内有一台服务器,其私有 IP 地址为 192.168.1.23,管理员将它与公网 IP 地址 112.93.114.32 进行静态转换绑定。那么,无论何时这台服务器访问互联网,它在外部网络看来的 IP 地址永远是 112.93.114.32;同样,当外部网络想要访问这台服务器时,也只需通过 112.93.114.32 这个公网 IP 地址,NAT 设备就能准确地将请求转发到局域网内的192.168.1.23 这台服务器上。

静态转换适用于那些需要在公网上被稳定访问的设备,比如企业对外提供服务的 Web 服务器、邮件服务器等。因为这些服务器需要一个固定的公网 IP 地址,方便外部用户随时访问。

它的优点非常明显:首先,由于映射关系固定,网络通信的稳定性和可预测性极高,不会出现地址映射混乱的情况;其次,对于外部网络来说,访问流程简单直接,就像记住一个固定的电话号码就能随时联系到特定的人;再者,静态转换在一定程度上也增强了网络的安全性,因为外部网络只能通过固定的公网 IP 与特定的内部设备通信,减少了非法访问其他内部设备的可能性。

然而,静态转换也存在一些缺点。最突出的问题就是对公网 IP 地址的消耗较大,每一个需要被映射的内部设备都需要占用一个独立的公网 IP 地址。在 IPv4 地址资源稀缺的当下,这种方式会造成资源的浪费;此外,手动配置映射关系的工作量较大,尤其是在设备数量较多的情况下,不仅容易出错,后期维护也较为困难。

(2)动态转换:灵活调配的 “地址池管家”

动态转换就像是一位 “地址池管家”,它管理着一个公网 IP 地址池。当局域网内的设备需要访问互联网时,NAT 设备会从这个地址池中动态地选取一个空闲的公网 IP 地址,将其与设备的私有 IP 地址建立临时映射关系。当设备的网络连接结束后,这个公网 IP 地址会被释放回地址池,以供其他设备使用。

例如,假设地址池中有 多个公网 IP 地址(112.93.114.32 -...),当设备 A(私有 IP 地址 192.168.1.23)发起网络请求时,NAT 设备从地址池中选取112.93.114.32 分配给它,建立起映射关系;当设备 A 的通信任务完成后,112.93.114.32 会被回收。如果此时设备 B(私有 IP 地址 192.168.1.24)需要上网,NAT 设备可能会将 112.93.114.32 再次分配给它,也可能分配其他空闲地址。

动态转换适用于企业或家庭等内部网络中,设备数量较多但不需要每个设备都有固定公网 IP 地址的场景。它能够更高效地利用有限的公网 IP 地址资源,满足大量设备的上网需求。

其优点在于灵活性高,通过动态分配地址,提高了公网 IP 地址的利用率,避免了像静态转换那样可能出现的地址浪费问题;同时,对于管理员来说,相较于静态转换,动态转换减少了手动配置每一个设备映射关系的工作量,只需要管理好地址池即可。

不过,动态转换也存在一些不足。由于地址是动态分配的,设备每次上网获得的公网 IP 地址可能不同,这对于一些需要固定 IP 地址才能正常工作的应用(如服务器对外提供服务)不太友好;另外,在地址分配和回收的过程中,可能会出现短暂的网络延迟或连接不稳定的情况,影响用户体验。

(3)端口地址映射(PAT):共享地址的 “超级翻译”

端口地址映射(PAT)堪称一位 “超级翻译”,它实现了多个内部设备共享一个公网 IP 地址进行网络通信的功能。PAT 在进行地址转换时,不仅会转换 IP 地址,还会对端口号进行转换和记录。它利用端口号来区分不同设备的网络连接,使得多个内部设备可以通过同一个公网 IP 地址的不同端口与外部网络进行通信。

例如,局域网内有设备 C(私有 IP 地址 192.168.1.23)和设备 D(私有 IP 地址 192.168.1.24)都要访问互联网上的服务器。设备 C 发起请求时,NAT 设备将其私有 IP 地址 192.168.1.23 和源端口号(假设为 23415)转换为公网 IP 地址 112.93.114.32 和一个新的端口号(假设为 43253);设备 D 发起请求时,NAT 设备同样将其私有 IP 地址 192.168.1.24 和源端口号(假设为 43213)转换为公网 IP 地址 112.93.114.32和另一个新端口号(假设为 43256)。当外部服务器返回数据时,NAT 设备根据返回数据中的目的端口号,就能准确地将数据转发给对应的内部设备。

PAT 是目前应用最为广泛的 NAT 实现方法,尤其适用于家庭网络、小型企业网络等设备数量众多但公网 IP 地址有限的场景。它极大地提高了公网 IP 地址的利用率,理论上一个公网 IP 地址就可以满足成千上万台设备的上网需求。

PAT 的优势十分显著:首先,它最大限度地节省了公网 IP 地址资源,有效缓解了 IPv4 地址紧张的问题;其次,配置相对简单,只需要在 NAT 设备上进行基本的设置,无需为每个设备单独配置映射;再者,通过端口号的区分,实现了多个设备同时上网的并发处理,保证了网络的高效运行。

但 PAT 也并非完美无缺。由于所有设备共享一个公网 IP 地址,在网络安全方面,一旦这个公网 IP 地址被攻击,所有使用该地址的内部设备都可能受到影响;此外,对于一些对端口号有特殊要求或依赖 IP 地址和端口号进行身份验证的应用程序,PAT 可能会导致这些应用无法正常工作,因为端口号在转换过程中发生了变化。

(三)NAT 的应用:守护家庭网络的 “安全卫士”

NAT 除了实现地址转换,还起到了一定的安全防护作用。由于局域网内的设备使用的是 “私人地址”,在互联网上是不可见的,这就相当于给家庭网络中的设备穿上了一层 “隐身衣”。外部网络无法直接访问局域网内的设备,只有当局域网内的设备主动发起请求时,NAT 设备才会建立映射关系,允许数据返回。这大大降低了家庭网络遭受外部攻击的风险,就像有一位忠诚的 “安全卫士” 守护着家庭网络的安全。

 

在数据传输的过程中,NAT 路由器会为每一个网络进程分配相应端口与公网通信。

三、NAT 种类:不同性格的 “地址翻译官”

 此部分图文参考NAT网络地址转换协议简单理解_网心云全锥型改为映射公网型-CSDN博客

(一)完全圆锥型 NAT(Full Cone NAT)

完全圆锥型 NAT 就像是一位 “热情好客” 的地址翻译官。只要局域网内的某个设备(比如设备 A)第一次向互联网上的任何一个地址发送了数据,NAT 设备就会为设备 A 分配一个固定的 “公共地址:端口” 组合,并将所有从设备 A 发出的数据都映射到这个固定的组合上。而且,任何外部设备只要知道这个 “公共地址:端口”,都可以向设备 A 发送数据,就像只要知道你家的门牌号,任何人都可以给你寄信一样。

(二)IP受限圆锥型 NAT(IP Restricted Cone NAT)

受限圆锥型 NAT 则是一位 “谨慎小心” 的翻译官。它同样会为局域网内的设备分配一个固定的 “公共地址:端口” 组合,但只有设备之前访问过的外部地址才能向该设备发送数据。比如设备 A 先访问了服务器 B,之后只有服务器 B 可以通过 NAT 设备向设备 A 发送数据,其他未被设备 A 访问过的外部设备则无法直接与设备 A 通信,就像你只给特定的人留下了联系方式,只有他们能联系到你。

(三)端口受限圆锥型 NAT(Port Restricted Cone NAT)

端口受限圆锥型 NAT 更加 “严格苛刻”。它不仅要求外部设备是设备之前访问过的,还要求数据的源端口必须与设备之前访问时使用的端口一致。例如设备 A 通过端口 5000 访问了服务器 B 的端口 80,那么只有服务器 B 通过端口 80 向设备 A 的 “公共地址:5000” 发送数据时,NAT 设备才会放行,否则数据将被拒绝,这就像设置了双重验证,确保通信的安全性。

(四)对称型 NAT(Symmetric NAT)

对称型 NAT 是最 “孤僻” 的翻译官。对于每一个不同的外部目标地址和端口,它都会为局域网内的设备分配一个新的 “公共地址:端口” 组合。而且,只有之前向其发送过数据的外部设备,并且使用相同的 “公共地址:端口” 回复数据时,NAT 设备才会允许数据通过。这意味着即使是同一台设备访问不同的服务器,每次的映射关系都可能不同,大大增加了网络通信的复杂性。

 

四、NAT 鉴别方法:识别 “翻译官” 的 “火眼金睛”

由于不同类型的 NAT 对网络通信的影响不同,我们需要准确鉴别出客户端所处的 NAT 类型,这就需要一些 “火眼金睛” 般的鉴别方法。

(一)STUN 协议辅助鉴别

STUN(Session Traversal Utilities for NAT,NAT 会话穿越应用程序)协议是鉴别 NAT 类型的常用工具。客户端会向 STUN 服务器发送请求,STUN 服务器收到请求后,会记录下客户端的 “公共地址:端口”,并将这个信息返回给客户端。客户端通过比较自己发送请求时使用的地址和 STUN 服务器返回的地址,以及多次发送请求到不同的 STUN 服务器进行测试,就可以推断出自己所处的 NAT 类型。

例如,如果每次从不同的 STUN 服务器返回的 “公共地址:端口” 都相同,那么很可能是完全圆锥型 NAT;如果只有访问过的 STUN 服务器能返回有效地址,可能是受限圆锥型 NAT;以此类推,通过这种方式逐步确定 NAT 的具体类型。

(二)特征分析鉴别

除了借助 STUN 协议,还可以通过分析网络通信的特征来鉴别 NAT 类型。比如观察数据包的传输规律、端口的使用情况等。如果发现对于不同的目标地址,映射的 “公共地址:端口” 总是变化的,那么很可能是对称型 NAT;如果只有特定的外部地址和端口组合才能进行通信,就需要进一步判断是受限圆锥型还是端口受限圆锥型 NAT。这种方法需要对网络通信原理有深入的理解,并且结合实际的测试数据进行分析。

1.对称型 NAT 的鉴别​

对称型 NAT 在所有 NAT 类型中表现最为 “多变”,其最显著的特征是:对于每一个不同的外部目标地址和端口,它都会为局域网内的设备分配一个新的 “公共地址:端口” 组合。在鉴别时,我们可以通过以下方式进行验证:​

  1. 多目标地址测试:从局域网内的设备向多个不同的外部服务器(如服务器 A、服务器 B、服务器 C)发起连接请求。在正常通信过程中,使用抓包工具(如 Wireshark)捕获数据包,观察每次请求时设备对应的 “公共地址:端口”。如果每次连接到不同服务器,设备的 “公共地址:端口” 都发生变化,比如连接服务器 A 时是 “203.0.113.1:5000”,连接服务器 B 时变为 “203.0.113.2:5001” ,连接服务器 C 时又变成 “203.0.113.3:5002”,那么该 NAT 设备很可能是对称型 NAT。​
  2. 端口变化验证:即使是连接同一个外部服务器的不同端口,对称型 NAT 也会分配不同的 “公共地址:端口”。例如,先连接服务器 A 的 80 端口,记录下设备的 “公共地址:端口”;再连接服务器 A 的 443 端口,若发现 “公共地址:端口” 与之前连接 80 端口时不同,进一步证明是对称型 NAT。由于其高度的随机性和端口敏感性,对称型 NAT 的网络穿透难度极大,在鉴别时需重点关注端口和地址的组合变化情况。​
2.受限圆锥型 NAT 与端口受限圆锥型 NAT 的鉴别​

这两种 NAT 类型都对外部连接有所限制,需要进一步细致区分:​

2.1IP受限圆锥型 NAT​

受限圆锥型 NAT 允许局域网内设备与外部通信,但前提是外部设备必须是设备之前访问过的。鉴别步骤如下:​

  1. 首次访问记录:让局域网内设备首次访问外部服务器 D,使用抓包工具记录此时设备的 “公共地址:端口” 以及 NAT 设备建立的映射关系。​
  2. 非访问设备测试:尝试从外部一个未被设备访问过的服务器 E 向该设备发起连接请求。由于受限圆锥型 NAT 的限制,此连接请求会被 NAT 设备拒绝,在抓包数据中可看到服务器 E 发送的数据包被丢弃或返回错误响应,而设备不会收到任何数据。​
  3. 已访问设备验证:再次让设备访问服务器 D,确保连接正常。然后从服务器 D 向设备发起反向连接,此时连接能够成功建立,因为服务器 D 属于设备之前访问过的外部地址,符合受限圆锥型 NAT 的规则。通过这样的对比测试,可判断该 NAT 设备是否为受限圆锥型 NAT。​
2.2端口受限圆锥型 NAT​

端口受限圆锥型 NAT 在受限圆锥型 NAT 的基础上,增加了端口限制条件,即不仅要求外部设备是设备之前访问过的,还要求数据的源端口必须与设备之前访问时使用的端口一致。鉴别过程如下:​

  1. 初始访问与记录:让局域网内设备访问外部服务器 F 的 80 端口,记录设备的 “公共地址:端口” 以及 NAT 设备建立的映射关系。​
  2. 同地址不同端口测试:从服务器 F 的另一个端口(如 8080 端口)向设备发起连接请求。由于端口不一致,即使服务器 F 是设备之前访问过的地址,该连接请求仍会被 NAT 设备拒绝,抓包数据中会显示相关拒绝信息。​
  3. 同地址同端口验证:从服务器 F 的 80 端口再次向设备发起连接请求,此时连接能够成功建立,因为满足了端口受限圆锥型 NAT 的双重限制条件(相同地址且相同端口)。通过这一系列严格的测试,可准确鉴别出端口受限圆锥型 NAT。​
3.完全圆锥型 NAT 的鉴别​

完全圆锥型 NAT 是限制最少的类型,其特征为:只要局域网内设备首次向任何外部地址发送数据,NAT 设备就会为其分配一个固定的 “公共地址:端口” 组合,后续任何外部设备都可通过该组合与设备通信。鉴别方法较为简单:​

  1. 首次访问操作:让局域网内设备访问任意一个外部服务器 G,记录此时设备的 “公共地址:端口”。​
  2. 多设备连接测试:从多个不同的外部设备(如服务器 H、服务器 I 等)向该设备发起连接请求。在完全圆锥型 NAT 下,这些连接请求都能成功建立,且设备始终使用首次访问时分配的 “公共地址:端口” 进行通信 。通过这种多外部设备连接验证,可快速判断该 NAT 设备是否为完全圆锥型 NAT。​

通过对数据包传输规律、端口使用情况等网络通信特征的细致分析,结合针对性的测试步骤,我们能够在不依赖 STUN 协议的情况下,准确鉴别出不同类型的 NAT。这种方法虽然需要对网络通信原理有深入理解,但在复杂多变的网络环境中,能为网络优化、故障排查以及 WebRTC 等应用开发提供重要的技术支持 。

五、网络穿透:打破 NAT “壁垒” 的 “神奇魔法”

在 P2P 网络中,由于 NAT 的存在,两个位于不同局域网内的设备之间直接通信会面临重重困难,他们自身不知道自己的公网ip,只知道自己的私网地址,这就像被一堵无形的 “壁垒” 隔开。而网络穿透技术就是打破这堵 “壁垒” 的 “神奇魔法”,让设备之间能够建立直接连接。

(一)打洞原理:让数据 “穿墙而过”

网络穿透的核心机制是 “打洞”,其目的是在 NAT 设备上开辟出一条让数据能够双向流通的通道。为了更好地理解这个过程,我们可以想象两个分别住在不同 “网络城堡”(局域网)里的人,想要直接通信,但城堡的大门(NAT 设备)只允许内部居民主动外出(局域网设备主动发起对外连接),不允许外部人员随意进入。此时,就需要借助一些巧妙的方法来打开沟通的渠道。

当两个设备(我们称为设备 A 和设备 B)想要建立 P2P 连接时,它们首先会借助一个中间服务器(通常是 STUN 服务器或 TURN 服务器)来交换彼此的网络信息。具体步骤如下:

  1. 信息获取:设备 A 和设备 B 分别向中间服务器发送请求,获取自己在 NAT 设备外部的 “公共地址:端口”。这个过程就像是两个足不出户的死宅通过中间人打听自己的 “详细地址”(就像你搬家以后想要网购但不知道自己的送货地址,此时需要通过中间人去打听)。
  2. 信息交换:设备 A 和设备 B 通过信令服务器交换各自从 STUN 服务器获取到的 “公共地址:端口” 信息。信令服务器就像是一个 “信息传递员”,负责将设备 A 的地址信息传递给设备 B,同时将设备 B 的地址信息传递给设备 A。
  3. 同时发起连接:在获取到对方的 “公共地址:端口” 后,设备 A 和设备 B 会同时向对方的地址发送数据。虽然一开始,NAT 设备会拒绝这些来自外部的未经请求的数据,但当这些数据到达 NAT 设备时,NAT 设备会记录下这些连接尝试。
  4. “洞” 的形成:由于双方都进行了主动的连接尝试,NAT 设备会逐渐 “信任” 这些连接请求,认为它们是合法的通信行为,从而在 NAT 设备上打开一个 “洞”,允许数据通过。这样,设备 A 和设备 B 就建立起了直接的连接,实现了数据的双向传输,就像两个城堡之间打通了一条秘密通道,居民们可以自由往来。

需要注意的是,“打洞” 成功的关键在于双方几乎同时向对方发起连接请求。如果时间差过大,NAT 设备可能会在另一方发起连接之前就丢弃数据,导致打洞失败。

(二)不同 NAT 类型下的穿透难度

不同类型的 NAT 对网络穿透的难度有着显著影响,就像不同的城堡有着不同的防御等级,攻破它们的难度也各不相同。

  1. 完全圆锥型 NAT:这是最容易穿透的 NAT 类型,堪称 “防御薄弱的城堡”。由于它对外部连接的限制较少,只要设备在局域网内主动发起过对外连接,NAT 设备就会为其开放一个固定的 “公共地址:端口”,并且允许任何外部设备通过这个地址进行连接。因此,在完全圆锥型 NAT 环境下,只需要简单地通过中间服务器获取对方地址,然后发起连接,就很容易实现网络穿透。
  2. 受限圆锥型 NAT:这种类型的 NAT 相对复杂一些,类似于 “设有访客名单的城堡”。它要求外部设备必须是设备之前访问过的,才允许连接。在进行网络穿透时,除了通过中间服务器获取地址,还需要先让设备与目标设备进行一次 “预沟通”(即主动访问目标设备),将目标设备加入 NAT 设备的 “信任名单”,之后才能成功穿透。
  3. 端口受限圆锥型 NAT:其限制条件更多,如同 “设有严格门禁系统的城堡”,不仅要求外部设备是设备之前访问过的,还要求数据的源端口必须与设备之前访问时使用的端口一致。这就需要在穿透过程中,精确控制端口信息,确保每次连接的端口都符合 NAT 设备的要求,大大增加了穿透的难度。
  4. 对称型 NAT:这是最难穿透的 NAT 类型,仿佛是 “固若金汤的城堡”。因为它对于每一个不同的外部目标地址和端口,都会为局域网内的设备分配一个新的 “公共地址:端口” 组合。这意味着每次连接都需要重新获取地址,并且由于其高度的随机性和严格的访问限制,很难预测和建立稳定的连接通道,往往需要借助更复杂的技术手段,如 TURN 服务器的中继转发,才能实现穿透。

(三)网络穿透的关键技术与工具

  1. STUN(Session Traversal Utilities for NAT):作为网络穿透的 “侦察兵”,STUN 协议主要用于帮助客户端获取自己在 NAT 设备外部的 “公共地址:端口”,并判断自己所处的 NAT 类型。客户端向 STUN 服务器发送请求,STUN 服务器通过分析请求的来源地址,将客户端的 “公共地址:端口” 返回给客户端。有了这些信息,客户端就可以尝试与其他设备进行直接连接,进行网络穿透。在简单的网络环境中,尤其是面对完全圆锥型 NAT 等相对容易穿透的类型时,STUN 协议通常能够有效地实现网络穿透。
  2. TURN(Traversal Using Relays around NAT):当 STUN 无法实现网络穿透时,TURN 协议就成为了 “终极救星”。TURN 服务器可以作为中继服务器,在两个无法直接连接的设备之间转发数据。如果两个设备之间的 NAT 类型过于复杂,无法通过打洞实现直接连接,客户端就会向 TURN 服务器请求中继服务。设备将数据发送给 TURN 服务器,TURN 服务器再将数据转发给目标设备。虽然这种方式会增加一定的延迟和服务器的负担,但确保了即使在复杂的网络环境下,设备之间也能进行通信。例如,在一些企业网络或复杂的家庭网络环境中,TURN 服务器常常是保障 WebRTC 视频通话稳定进行的关键。
  3. ICE(Interactive Connectivity Establishment):ICE 并非是一种独立的穿透技术,而是一套框架,它整合了 STUN 和 TURN 等技术,旨在为客户端提供一个统一的、自动的网络穿透解决方案。ICE 会自动尝试使用 STUN 进行打洞,如果失败则切换到 TURN 中继。通过这种方式,ICE 能够适应各种复杂的网络环境,提高网络穿透的成功率,为 WebRTC 等应用提供稳定可靠的连接基础。

网络穿透技术通过巧妙的 “打洞” 原理,结合 STUN、TURN、ICE 等关键技术和工具,克服了不同 NAT 类型带来的重重困难,实现了设备之间的直接连接。它是 WebRTC 等 P2P 应用能够正常运行的关键支撑,让我们在复杂的网络环境中也能享受流畅的点对点通信体验。随着网络技术的不断发展,网络穿透技术也将持续演进,为我们带来更加高效、稳定的网络连接服务。

六、STUN 与 TURN:WebRTC 的 “得力助手”

(一)STUN:网络穿透的 “侦察兵”

STUN 协议在 WebRTC 中扮演着 “侦察兵” 的角色。它的主要任务是帮助客户端获取自己在 NAT 设备外部的 “公共地址:端口”,并判断自己所处的 NAT 类型。客户端向 STUN 服务器发送请求,STUN 服务器通过分析请求的来源地址,将客户端的 “公共地址:端口” 返回给客户端。有了这个信息,客户端就可以尝试与其他设备进行直接连接,进行网络穿透。

例如,在 WebRTC 视频通话中,客户端启动后会先向 STUN 服务器发送请求,获取自己的外部地址信息,然后信令服务器交换双方数据信息。如果发现可以直接与对方设备建立连接,那么视频数据就可以直接通过 P2P 方式传输,大大提高了传输效率。

(二)TURN:网络穿透的 “终极救星”

当 STUN 无法实现网络穿透时,就需要 TURN(Traversal Using Relays around NAT,NAT 遍历使用中继)协议登场了。TURN 服务器就像一个 “终极救星”,它可以作为中继服务器,在两个无法直接连接的设备之间转发数据。

在实际应用中,如果两个设备之间的 NAT 类型过于复杂,无法通过打洞实现直接连接,客户端就会向 TURN 服务器请求中继服务。设备将数据发送给 TURN 服务器,TURN 服务器再将数据转发给目标设备。虽然这种方式会增加一定的延迟和服务器的负担,但确保了即使在复杂的网络环境下,设备之间也能进行通信。比如在一些企业网络或复杂的家庭网络环境中,TURN 服务器可以保障 WebRTC 视频通话的稳定进行。

在国内网络环境中,WebRTC 开发视频通话进行网络打洞时失败率相对较高,主要有以下几方面原因:

 
  • 网络环境复杂
    • 多种 NAT 类型并存:国内网络中存在多种类型的 NAT 设备,包括对称型 NAT、圆锥型 NAT(如受限圆锥型和端口受限圆锥型)等。不同类型的 NAT 对网络穿透的支持程度不同,对称型 NAT 由于其严格的地址和端口映射规则,使得打洞难度较大,而国内网络中对称型 NAT 的使用较为广泛,这增加了打洞失败的概率。
    • 多层 NAT 嵌套:在一些网络场景下,尤其是企业网络或小区宽带网络中,可能存在多层 NAT 嵌套的情况。数据需要经过多个 NAT 设备的转发和处理,每一层 NAT 都可能对数据包进行修改和过滤,这使得网络穿透的难度大幅增加,打洞成功的概率降低。
  • 运营商策略限制
    • IP 地址资源紧张:随着国内互联网用户数量的不断增加,可用的公网 IP 地址资源日益紧张。为了缓解 IP 地址短缺的问题,运营商采用了多种地址分配策略,如动态分配 IP 地址、使用私有 IP 地址段等。这导致设备获取到的公网 IP 地址不稳定,且可能存在多个设备共享一个公网 IP 地址的情况,使得网络穿透过程中地址匹配和连接建立变得更加困难,从而提高了打洞失败率。
    • 安全策略限制:出于网络安全考虑,运营商可能会实施一些安全策略,如限制某些端口的访问、对数据包进行深度检测和过滤等。这些策略可能会干扰网络穿透过程中数据包的正常传输和连接建立,导致打洞失败。例如,某些运营商可能会限制非标准端口的使用,而 WebRTC 的网络穿透可能需要使用一些动态分配的端口,这就可能会被运营商的安全策略所拦截。
  • 防火墙设置
    • 企业和家庭防火墙:在企业和家庭网络中,为了保护内部网络的安全,通常会设置防火墙。这些防火墙可能会对进出网络的数据包进行严格的过滤和限制,阻止未经授权的连接请求。在进行网络打洞时,防火墙可能会将来自外部的连接请求视为潜在的安全威胁而予以拦截,导致打洞失败。
    • 安全软件防火墙:用户安装的安全软件(如杀毒软件、防火墙软件等)也可能会对网络通信进行监控和过滤。一些安全软件可能会误判 WebRTC 的网络穿透行为为恶意攻击,从而阻止相关的网络连接,增加了打洞失败的可能性。

七、总结

在 WebRTC 视频通话的世界里,P2P 去中心化网络框架是实现高效、稳定通信的基石。从中心化到去中心化的转变,让我们摆脱了对中心服务器的依赖,提高了网络的可靠性和效率。而 NAT 作为网络世界的 “地址翻译官”,虽然给网络通信带来了一定的挑战,但通过 NAT 鉴别方法、网络穿透技术以及 STUN 和 TURN 等协议的辅助,我们能够打破重重障碍,实现设备之间的直接连接。

这些技术相互配合,就像一支默契的团队,共同为 WebRTC 视频通话保驾护航。理解和掌握这些前置基础知识,是深入学习 WebRTC 开发的关键。在未来的技术探索中,我们还将继续挖掘这些技术的潜力,让 WebRTC 在视频通话领域发挥出更大的作用,为用户带来更加流畅、稳定的通信体验。

相关文章:

WebRTC:去中心化网络P2P框架解析

在互联网的世界里,数据的传输就像一场永不停歇的 “信息快递”。当我们使用 WebRTC 实现视频通话时,背后支撑的网络框架至关重要。今天,我们将深入探索 WebRTC 开发中视频通话的前置基础 ——P2P(点对点)框架&#xff…...

Linux 上安装RabbitMQ

🐇 安装 Erlang/OTP 27.3.4(最新稳定版) 1. 下载 Erlang 源码 cd /usr/local/src wget https://erlang.org/download/otp_src_27.3.4.tar.gz2. 解压源码 tar -zxvf otp_src_27.3.4.tar.gz cd otp_src_27.3.43. 安装依赖 sudo apt update …...

Service Mesh实战之Istio

Service Mesh(服务网格)是一种专为微服务架构设计的网络代理层,用于处理服务间的通信、管理和监控。Istio 是一个流行的开源 Service Mesh 实现,通过提供流量管理、观测性和安全性等功能,帮助开发者应对分布式系统的复…...

BGP练习

一、要求拓扑图 二、要求 完成上图内容,要求五台路由器的环回地址均可以相互访问 三、需求分析 1. 网络连通性目标 - 需求明确要求五台路由器(AR1 - AR5 )的环回地址能够相互访问。环回地址是路由器上用于测试、管理及作为BGP等协议中Ro…...

【Redis】分布式锁的实现

目录 一、本地锁存在的问题 二、redis实现分布式锁原理 三、使用示例 四、锁误删问题 解决思路 获取锁和释放锁代码优化 五、锁释放的原子性问题 解决思路(Lua脚本) 使用流程 总结 大家好,我是千语。上期给大家讲了使用悲观锁来解决…...

【vue】全局组件及组件模块抽离

一、全局组件 只要是实例化过的区域都可以使用 Vue.component("组件名",{ template: 内容} ) 二、组件模块抽离 抽离就是把template的内容写到body里面,然后建立id写到变量下的template里,id变量写到component里 body{ template: …...

手写 vue 源码 === watch 实现

目录 1. watch 的基本使用 2. watch 的整体架构 3. doWatch 函数的实现 3.1 处理不同类型的监听源 3.2 清理副作用的机制 3.3 创建响应式效果 3.4 初始化执行 3.5 返回停止函数 4. watch 如何基于 ReactiveEffect 实现 4.1 依赖收集过程详解 4.2 更新触发过程详解 …...

STM32核心机制解析:重映射、时间片与系统定时器实战——从理论到呼吸灯开发

知识点1【重映射的概念】 1、引入 默认: **定义:**系统或硬件在未经用户修改时的预设配置或行为 STM32的引脚功能、外设配置、中断向量表等默认由芯片设计或库函数预设。 部分重映射 **定义:**仅修改部分资源或地址的映射关系&#xff…...

【Linux网络编程】HTTPS协议原理

目录 一,HTTPS是什么? 1,什么是加密? 2,为什么需要加密? 3,常见的加密方式 对称加密 非对称加密 4,数据摘要&&数据指纹 二,HTTPS协议加密方案 方案一&a…...

【idea】快捷键ctrl+shift+F(Find in files)不起作用

问题描述 在idea中使用快捷键CtrlShiftF,进行内容的搜索,但是弹不出对话框、或有时候能弹出有时候又弹不出。 原因分析 1.怀疑是缓存问题?--清空缓存重启也没什么作用 2.怀疑是idea的问题?--有时行、有时不行,而且…...

「光域」系列激光测距传感器:以光为尺,重构空间认知边界

在150米深的地下矿井中,无人矿卡需要精准识别前方3厘米的落石;在千米高空的风电塔筒检测现场,工程师手持设备要穿透50米雾霭锁定0.1毫米的形变;在智能仓储的立体库房里,穿梭车需在0.3秒内完成货架间距的毫米级校准………...

http和https的区别

HTTP(超文本传输协议)和HTTPS(超文本传输安全协议)是互联网上用于传输数据的两种协议,它们的主要区别如下: 1. 安全性 HTTP:明文传输,数据在传输过程中不加密,容易被窃…...

Dapp开发-如何开发一个dapp

DApp开发全流程指南:从需求到落地的技术实践与生态构建 ——2025年去中心化应用开发方法论与未来趋势解析 一、需求定位与架构设计:构建DApp的技术地基 需求精准定位 功能定义:明确DApp的核心场景(如DeFi借贷、NFT交易、DAO治理&…...

Python邮件处理(使用imaplib和email库实现自动化邮件处理)

在日常工作中,我们经常需要自动化处理电子邮件,比如自动下载附件、解析邮件内容、处理特定格式的数据等。本文将通过一个实际案例,详细介绍如何使用Python的imaplib和email库来实现邮件的自动化处理。 目录 环境准备与库介绍IMAP邮件服务器连…...

时空注意力机制深度解析:理论、技术与应用全景

时空注意力机制作为深度学习领域的关键技术,通过捕捉数据在时间和空间维度上的依赖关系,显著提升了时序数据处理和时空建模能力。本文从理论起源、数学建模、网络架构、工程实现到行业应用,系统拆解时空注意力机制的核心原理,涵盖…...

鸿蒙 UIAbility组件与UI的数据同步和窗口关闭

使用 EventHub 进行数据通信 根据 Stage 模型概念图 UIAbility 先于 ArkUI Page 创建 所以,事件要先 .on 订阅 再 emit 发布 假如现在有页面 Page1 和他的 UIAbility // src/main/ets/page1ability/Page1Ability.ets onCreate(want: Want, launchParam: Ability…...

UI-TARS: 基于视觉语言模型的多模式代理

GitHub:https://github.com/bytedance/UI-TARS 更多AI开源软件:发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI 基于视觉语言模型(Vision-Language Model)的 GUI 代理应用,允许用户通过自然语言控制电脑操…...

C++多态讲解

1. 多态的概念 通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态就是函数重载和函数模板,他们传不同的类型的参数就可以调用不同的函数,通过参数的不同达到多种形态,之所以叫编译时多态&…...

QuecPython+蜂窝模组基础开发

开发准备 硬件: 一块 QuecPython_EC2X_EVB 开发板 (以该开发板为例,更多开发板介绍参见下文开发板列表)USB 数据线 (USB-A TO USB-C)PC (Windows10) 蜂窝模组开发板列表: EC2X_EVBEC600X_EVBEC800X_EVBEC600X/EC800X_CORE_EVBBG95_EVBEC200X_EVBEG91…...

-MAC桢-

MAC桢和IP的关系: 主机A想跨网络和B通信需要IP地址进行路由选择,但一个局域网,比如路由器进行路由选择之前,首先要将数据包发送给路由器B,也就是局域网通信也就是同一个网段的主机进行通信,所以必须通过mac…...

反转链表 - 简单

************* C topic: 206. 反转链表 - 力扣(LeetCode) ************* Give the topic an inspection. It seems really easy. At very first, I think that I will use reverse cammand to kill this topic. But a few seconds later I found that…...

负载均衡 ELB 在 zkmall开源商城高流量场景下的算法优化

在电商大促、直播带货等高频交易场景下,流量突发增长对系统稳定性提出严峻挑战。ZKmll 开源商城通过对负载均衡 ELB(Elastic Load Balancer)算法的深度优化,结合业务场景特性设计动态加权轮询 地域感知 热点分流的混合策略&…...

YOLOv5推理代码解析

代码如下 import cv2 import numpy as np import onnxruntime as ort import time import random# 画一个检测框 def plot_one_box(x, img, colorNone, labelNone, line_thicknessNone):"""description: 在图像上绘制一个矩形框。param:x: 框的坐标 [x1, y1, x…...

创建三个网络,分别使用RIP、OSPF、静态,并每个网络10个电脑。使用DHCP分配IP

DHCP 自动分配IP,集中管理,提高效率 在路由器中设置 Router>en Router#conf t Router(config)#ip dhcp pool ip30 //创建DHCP地址池 Router(dhcp-config)#network 192.168.30.0 255.255.255.0 // 配置网络地址和子网掩码 Router(dhcp-config)#defa…...

[网络层]网络层设备路由器

路由表 路由器能进行路由转发,所依靠的核心数据结构就是路由表,那么路由表是怎么来的, 静态路由和动态路由: 说的是表项,这个表项是静态的还是动态的,就跟ARP缓存表的表项静态动态是一回事, …...

Maven 项目中将本地依赖库打包到最终的 JAR 中

文章目录 前言详细步骤 前言 在现代后端开发中,构建高效且可扩展的 Web 应用程序通常依赖于多种第三方库和内部依赖。这些依赖可以来自公共仓库,也可能是公司内部自研的库或尚未发布到公共仓库的 JAR 包。本文将详细介绍如何在 Maven 项目中处理本地依赖…...

大模型的Lora如何训练?

大模型LoRA(Low-Rank Adaptation)训练是一种参数高效的微调方法,通过冻结预训练模型权重并引入低秩矩阵实现轻量化调整。以下是涵盖原理、数据准备、工具、参数设置及优化的全流程指南: 一、LoRA的核心原理 低秩矩阵分解 在原始权重矩阵$ W 旁添加两个低秩矩阵 旁添加两个…...

CSS3 伪类和使用场景

CSS3 伪类(Pseudo-classes)大全 CSS3 引入了许多新的伪类,以下是完整的 CSS3 伪类分类列表(包括 CSS2 的伪类): 一、结构性伪类(Structural Pseudo-classes) 这些伪类根据元素在文…...

GitDiagram - GitHub 仓库可视化工具

GitDiagram - GitHub 仓库可视化工具 项目链接:https://github.com/ahmedkhaleel2004/gitdiagram 将任何 GitHub 仓库转换为交互式架构图,只需替换 URL 中的 hub 为 diagram。 ✨ 核心功能 即时可视化:将代码库结构转换为系统设计/架构图…...

[特殊字符] 本地大模型编程实战(29):用大语言模型LLM查询图数据库NEO4J(2)

本文将基于langgraph框架,用LLM查询NEO4J图数据库,构建可定制、能应对复杂场景的工作流! 🌟 核心亮点 是否用户提问是否电影相关?生成Cypher查询直接回答执行查询生成最终答案 🧩 模块化实现 1️⃣ 定义状态机 from …...

Python中操作Neo4j图数据库

在当今数据驱动的时代,关系型数据库在处理高度关联的数据时常常显得力不从心。图数据库,尤其是Neo4j,以其独特的图结构和高效的关系查询能力,成为了解决这一问题的利器。结合Python的简洁与强大,我们可以更高效地构建和…...

人工智能时代:解锁职业新身份,从“认证师”到“工程师”的进阶之路

在人工智能技术浪潮席卷全球的今天,技术的飞速迭代正在重塑职业版图。从算法优化到伦理决策,从系统测试到应用开发,AI技术不再只是程序员的专属领域,而是成为各行各业从业者必须掌握的“生存技能”。当企业争相布局AI赛道,个人如何在这场变革中抢占先机?答案或许藏在两个…...

浙江大学 deepseek 公开课 第三季 第3期 - 陈喜群 教授 (附PPT下载) by 突破信息差

浙江大学DeepSeek系列公开课第三季重磅开启,特邀该校多领域权威学者联袂主讲。课程聚焦AI技术如何重构基础学科研究范式,深度解码以DeepSeek为代表的智能模型在交叉学科中的创新应用。在"XAI"融合浪潮下,学术大咖将剖析传统学科与人…...

企业级商城系统容器化部署技术方案

容器化部署已成为企业级商城系统构建高可用、弹性架构的核心技术。结合行业实践与技术趋势,以下从架构设计、工具链选型、关键挑战及解决方案等维度,提供一套完整的实施技术方案: 一、架构设计与技术选型 微服务架构拆分 服务拆分原则&#x…...

Java设计模式之适配器模式:从入门到精通

适配器模式(Adapter Pattern)是Java中最常用的结构型设计模式之一,它像一座桥梁连接两个不兼容的接口,使得原本由于接口不兼容而不能一起工作的类可以协同工作。本文将全面深入地解析适配器模式,从基础概念到高级应用,包含丰富的代码示例、详细注释、使用场景分析以及多维对…...

Spark,RDD中的转换算子

RDD中的转换算子 map算子 对数字1-10进行乘除,*2 filter算子 对数字1-10进行过滤,过滤出偶数 filatMap算子 对单词进行拆分 reduceByKey算子 对具有相同键的所有值进行聚合操作 统计词频词频统计简洁写法 ———————————————— 版权声明…...

牛客周赛 Round 92(再现京津冀蓝桥杯???)

1. 小红的签到题 现在小红希望你写出一个长度为 nnn 的、使用了下划线命名法命名的变量。为了显出特征,请保证该变量至少由两个单词组成。 输入描述: 输入一个正整数 n(3≦n≦100),代表需要构造的变量长度。 输出描述: 输出一个长度为 n 的字符串&#x…...

React 18 的新功能:构建高性能应用的革新之道

React 18 的发布标志着前端开发进入了一个全新的并发时代。作为 React 历史上最重要的版本之一,它不仅带来了底层架构的深度重构,更通过一系列创新功能重新定义了现代 Web 应用的开发范式。这些特性在保持向后兼容的同时,为开发者提供了前所未…...

Python-Flask-Dive

Python-Flask-Dive 适用Python编写一个Flask的快速上手模板,后续如果需要使用Python快速进行we端的验证可以直接下载使用 1-项目创建 本项目仓库代码地址:https://gitee.com/enzoism/python_flask_dive 1-Python环境 ## 1-空工程初始化环境 mkdir my_pr…...

热门CPS联盟小程序聚合平台与CPA推广系统开发搭建:助力流量变现与用户增长

一、行业趋势:CPS与CPA模式成流量变现核心 在移动互联网流量红利见顶的背景下,CPS(按销售付费)和CPA(按行为付费)模式因其精准的投放效果和可控的成本,成为企业拉新与用户增长的核心工具。 CPS…...

16.three官方示例+编辑器+AI快速学习webgl_buffergeometry_lines_indexed

本实例主要讲解内容 这个Three.js示例展示了如何使用**索引几何体(Indexed Geometry)**创建复杂的分形线条图案。通过递归算法生成科赫雪花(Koch Snowflake)曲线,并利用索引缓冲区优化顶点数据存储,实现高效的线条渲染。 核心技术包括: 索…...

PowerBI基础

一、前言 在当今数据驱动的时代,如何高效地整理、分析并呈现数据,已成为企业和个人提升决策质量的关键能力。Power BI 作为微软推出的强大商业智能工具,正帮助全球用户将海量数据转化为直观、动态的可视化洞察。数据的世界充满可能性&#xf…...

【MCP】魔搭社区MCP服务(高德地图、everything文件搜索)

【MCP】魔搭社区MCP服务(高德地图、everything文件搜索) 1、上手使用2、环境配置(1)cherry-studio配置(2)添加魔搭大模型服务(如果已经设置了其他大模型服务,可跳过)&…...

适合大数据和宽表的数据存储和分析场景的数据库

适合大数据和**宽表(wide table)**的数据存储和分析场景的数据库,通常需要具备以下几个特性: 支持高吞吐量的写入和读取;能处理百万级列或数百列的宽表结构;良好的压缩和分区能力;支持分布式扩展和容错;一定程度的 SQL 支持或灵活的查询引擎。✅ 推荐数据库类型及代表产…...

ORB特征点检测算法

角点是图像中灰度变化在两个方向上都比较剧烈的点。与边缘(只有一个方向变化剧烈)或平坦区域(灰度变化很小)不同,角点具有方向性和稳定性。 tips:像素梯度计算 ORB算法流程简述 1.关键点检测(使用FAST…...

Node和npm初学

了解Node和npm 目录 ​1. 什么是 npm?​ 2. npm有哪些使用场景?​ 3. npm有什么核心特性?​ 4.npm的常用命令有那些? 5. 关键配置文件是什么?​ ​6. 安全与最佳实践​ 7.什么是 Node.js?​ 8.Node.js有什么优势? 9.如何安装和下载? 10.如何验证安装成功?…...

【android bluetooth 案例分析 03】【PTS 测试 】【PBAP/PCE/SGSIT/SERR/BV-01-C】

1. PBAP/PCE/SGSIT/OFFS/BV-01-C 1. 测试项说明: Please initiate a GATT connection over BR/EDR to the PTS.Description: Verify that the Implementation Under Test (IUT) can initiate GATT connect request over BR/EDR to PTS.测试项名称: Ple…...

VIC-2D 7.0 为平面样件机械试验提供全视野位移及应变数据软件

The VIC-2D系统是一个完全集成的解决方案,它基于优化的相关算法为平面试样的力学测试提供非接触、全场的二维位移和应变数据,可测量关注区域内的每个像素子集的面内位移,并通过多种张量选项计算全场应变。The VIC-2D 系统可测量超过 2000%变形…...

深入理解Embedding Models(嵌入模型):从原理到实战(下)

🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是 Embedding 2、什么是嵌入模型 二、构建嵌入…...

labview硬件采集

(1)硬件的描述 (2)实验步骤1: (3)实验步骤2 库名/路径的选择要使用32位的开发资料 (4)实验步骤3 (5)实验步骤4 找到DoSetV12() 设置返回类型 设置chan 设置state labv…...