首页 > 其他分享 >STUN,TURN,ICE,WebRTC

STUN,TURN,ICE,WebRTC

时间:2023-09-26 17:44:58浏览次数:38  
标签:STUN 端口 TURN NAT IP 2.1 数据包 WebRTC

参考:

Kavirajan ST  : What is WebRTC and How to Setup STUN/TURN Server for WebRTC Communication?

Andrey B. :Еnvironment: signaling, STUN and TURN servers

Meddane : Demystifying NAT Traversal with STUN TURN and ICE

 

STUN

STUN 的唯一目的是让防火墙后面的设备在向外发送 UDP 流量时发现自己的 NAT 地址和端口。

两个客户端 通过 STUN 直到自己的公有 IP 和 端口后,直接点对点,不经过任何第三方进行媒体通信 

 

 

TURN

STUN 仅适用于安全性较低的 NAT,即所谓的  完全锥形NAT(full-cone)。不能用于对称性 NAT,这时候就需要 TURN

两个客户端 通过 STUN 知道自己的公有 IP 和端口后,为了穿越防火墙,通过 TURN 进行媒体通信。

TURN服务器成本较高,因为在建立更多客户端连接的情况下,服务器利用率和带宽占用量都很大。

 

 

 

完全锥形 NAT 和 对称 NAT

NAT

属于四层负载均衡(网络层负载均衡,改变 IP 地址)

  • 客户端发送外部请求到NAT:数据包的目的IP和端口本来是这个NAT设备的。NAT 要修改目的IP和端口,使其为真实服务器地址,从而转发到服务器。
  • 内部服务器通过NAT发送响应给客户端:这个数据包的源地址是服务器自己的IP和端口,一般都是内部地址,非公网IP。如果直接发送给客户端,客户端是不认识这个地址的,所以要将源地址由服务器地址改为NAT 均衡器地址。

完全锥型 NAT(full-cone),静态 NAT

来自【同一内部 IP 地址和端口的所有请求】都映射到同一外部 IP 地址和端口

对称 NAT(Symmetric),动态 NAT

从【同一内部 IP 地址和端口到特定目标 IP 地址和端口的所有请求】都映射到同一外部 IP 地址和端口。如果内部同一主机发送具有相同源地址和端口的数据包,但发送到不同的目的地,则使用不同的映射。此外,只有接收到数据包的外部主机才能将UDP数据包发送回内部主机。

 

为什么对称 NAT 不可以使用 STUN?

Jdoe --> Jsmith 共同的步骤

  1. jdoe 请求 Stun 服务器获取其自己的公共 IP 和端口 15.1.2.1:19222
  2. 通过 SDP INVITE 将 15.1.2.1:19222 发送给 jsmith
  3. 当被叫设备 jsmith 收到 INVITE 时,它会请求 Stun 服务器以获得自己的公共 IP 和端口 13.1.2.1:19999
  4. 然后被叫端点 jsmith 在 SDP 响应中包含此 NAT 化的 IP和端口 13.1.2.1:19999

信令完成后,两个端点都有各自的公共 IP 地址和端口,将用于建立 RTP 或媒体通信,并且它们可以开始连接检查阶段。

 

1、全锥NAT (full-cone)

  • Jdoe 向 jsmith 的公共 IP 地址 13.1.2.1:19999 发送模拟音频媒体流量的 UDP 数据包(STUN 数据包)。该数据包经过 Jdoe 的防火墙进行 NAT 转换后,Jdoe 的内部源IP 改变为源地址 15.1.2.1:19222 (因为全锥形NAT,所以到 Jsmith 与到 STUN 是一样的IP和端口)。同时 Jdoe 的防火墙建立一个连接条目:Src: 15.1.2.1:19222 和 Dst: 13.1.2.1:19999
    • 一旦该数据包到达 jsmith 的防火墙,就会被防火墙丢弃,因为它是从外部不可信区域发起到内部可信区域的。 
  • jsmith 也向 jdoe 的公共 IP地址 15.1.2.1:19222 发送模拟音频媒体流量的 UDP 数据包(STUN 数据包)。该数据包经过 jsmith 的防火墙进行 NAT 转换后, Jsmith 的内部源IP 改变为源地址 13.1.2.1:19999(因为全锥形NAT,所以到 Jsmith 与到 STUN 是一样的IP和端口)。
    • 该数据包会被 jdoe 的防火墙允许,因为它是由 jdoe 发起的 Stun 数据包创建的现有连接的一部分,Jdoe 的防火墙已经添加了这个连接条目 Src: 15.1.2.1:19222 和 Dst: 13.1.2.1:19999。所以连接检查将成功。

 

 

2、对称NAT(Symmetric)

  • Jdoe 向 jsmith 的公共 IP 地址 13.1.2.1:19999 发送模拟音频媒体流量的 UDP 数据包(STUN 数据包)。该数据包经过 Jdoe 的防火墙进行 NAT 转换后,Jdoe 的内部源IP 改变为源地址 15.1.2.1: 20200(因为对称 NAT,请求到 Jsmith 与请求到 STUN(15.1.2.1:19222) ,是不一样的源端口) 。同时 Jdoe 的防火墙建立一个连接条目:Src: 15.1.2.1:20200 和 Dst: 13.1.2.1:19999 
    • 一旦该数据包到达 jsmith 的防火墙,就会被防火墙丢弃,因为它是从外部不可信区域发起到内部可信区域的。
  • jsmith 也向 jdoe 的公共 IP地址 15.1.2.1:19222 发送模拟音频媒体流量的 UDP 数据包(STUN 数据包)。该数据包经过 jsmith 的防火墙进行 NAT 转换后, Jsmith 的内部源IP 改变为源地址 13.1.2.1:19777(因为对称 NAT,请求到 Jdoe 与请求到 STUN (13.1.2.1:19999),是不一样的源端口)。
    • 连接检查将失败,因为 jdoe 的防火墙期望接收具有与条目的连接表匹配的 L3/L4 信息 Src: 15.1.2.1:20200 和 Dst: 13.1.2.1:19999 的数据包。

 

 

 

交互式建立连接 Interactive Connectivity Establishment (ICE)

RFC 8445 中定义的交互式连接建立 (ICE) 是一个结合了 STUN 和 TURN 的框架。

ICE 在两个节点之间建立尽可能直接的连接。ICE 强制要求默认情况下使用 STUN,因为 TURN 通信需要连续使用 TURN 服务器,连接不是对等的,并且会使用更多的服务器资源。

  • 如果它们之间可以直接连接,则会应用 STUN 协议。
  • 如果无法实现直接媒体连接,端点将回退到 TURN 服务器并集中发送其 UDP 流量,而不是点对点。
  • 通过 STUN 以发现端点的 NATed IP 和端口。
  • Turn 发现 :Turn 服务器的中继公共 IP(例如 Expressway-E(Cisco的))
  • 发现最佳 RTP 路径,或者在端点之间直接 RTP 流(如果使用专用公共 IP),或者通过中继转向服务器(例如 Expressway-E(Cisco的)),或者通过传统 RTP 流(例如,对于 MRA 端点通过 Expressway-C) 

 

 

标签:STUN,端口,TURN,NAT,IP,2.1,数据包,WebRTC
From: https://www.cnblogs.com/suBlog/p/17730794.html

相关文章

  • WebRTC C++ 线程和线程管理剖析
    线程管理实例化代码(单例)ThreadManager*ThreadManager::Instance(){staticThreadManager*constthread_manager=newThreadManager();returnthread_manager;}初始化位置WebRTC中启动新线程的标准方法是通过创建Thread对象,然后调用Thread.Start()方法来启用......
  • scheduler,kube-controller-manager 报server returned HTTP status 401 Unauthorized
    现象:K8S组件报serverreturnedHTTPstatus401Unauthorized,看apiserver 日志有很多Unabletoauthenticatetherequest"err="[x509:certificatehasexpiredorisnotyet 1、分析:是因为集群证书更新了,然而使用kubectldeletepods方式去重启组件是没生效的,需要通过......
  • VUE中的data(){return}与data:{}区别
    组件是一个可复用的实例,当你引用一个组件的时候,组件里的data是一个普通的对象,所有用到这个组件的都引用的同一个data,就会造成数据污染。data:{}data:{msg:0}使用return包裹后数据中变量只在当前组件中生效,不会影响其他组件。data(){return}data(){......
  • java在try-catch-finally代码块中return或者throw Exception时需注意的问题
    在Java的try-catch-finally代码块中使用return或者throwException时,需要注意以下几个问题:1.Return语句的执行:当在try或catch中使用return语句时,程序会立即退出当前方法并返回指定的值。但是在执行return之前,finally代码块将被执行。如果finally中也包含retur......
  • Kingbase ES 函数返回-return语句
    文章概要:本文在https://www.cnblogs.com/kingbase/p/15703611.html一文的基础上总结了KingbaseES中函数能支持的return语句,整体上兼容oracle的基础上,也和PG语法一样。同时列举了sqlserevr表值函数和代码故障案例。一,关于return语句有5个return语句可以用来从KES函数中返回数......
  • WebRTC C++ RTP over TCP配置
    前言RTPoverTCP这种情况,一般是WebRTCP2P打洞失败,才会选择WebRTC默认使用UDP传输,但是也可以通过TCP传输。使用TCP传输,需要服务器中转,turnserver,licode,janus之类的服务器解决方案搭建coTurn中转服务器https://blog.51cto.com/fengyuzaitu/7265986C++修改代码url后面必须指定?t......
  • MySQL 切换数据库、用户卡死:“You can turn off this feature to get a quicker start
    数据量很大的话,常规切换数据库会把里面所有的表遍历一遍,会很慢甚至是卡死。解决方法:登录的时候直接在最后面加一个-A就行了。[root@localhost~]#"/usr/local/mysql-8.0.11/bin/mysql"-uroot-p123456-A 实战演示:我演示的数据库就是一个数据量很大的数据库,切换数据库......
  • 详解 WebRTC 协议原理与框架
    一、WebRTC 是什么WebRTC,名称源自网页即时通信(英语:WebReal-TimeCommunication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API。它于2011年6月1日开源并在Google、Mozilla、Opera支持下被纳入万维网联盟的W3C推荐标准。谷歌2011年6月3日宣布向开发人员开放WebRTC......
  • 完美解决Server returned HTTP response code:403 for URL报错问题
    在调用某个接口的时候,突然就遇到了Server returned HTTP response code: 403 for URL报错这个报错,导致获取不到接口的数据,下面小编给大家分享解决Server returned HTTP response code:403 for URL报错问题,感兴趣的朋友一起看看吧 前言原因依赖post请求结语......
  • WebRTC rtc::FileRotatingLogSink日志使用
    前言WebRTC默认日志打印到控制台,如果需要打印到文件或网络,需要自己继承并实现LogSink这个类的接口。即在OnLogMessage函数里面完成日志的输出(写磁盘文件,写网络socket等)。庆幸的是webrtc中的FileRotatingLogSink类帮助我们实现日志写入磁盘文件,并且FileRotatingLogSink能控制文件......