对于stun和turn的理解
在介绍turn和stun之前我们先来了解几个概念

会话描述协议 SDP(Session Description Protocol )
网络地址转换 NAT (Network Address Translation)
网络协商 candidate
1. SDP协议
我们来思考,如果两个不同的手机,一个手机支持VP8、VP9的媒体格式,另一个支持VP8、h264的协议,他们如果通信的话会选择什么格式的媒体来进行交流?

这时候我们就需要用到这个SDP协议了,在WebRTC中,参与视频通讯的双方必须先交换SDP信息,这样双方才能知根知底,而交换SDP的过程,也称为"媒体协商"。

记住一点,SDP不叫媒体协商,交换SDP的过程才叫媒体协商,SDP全名叫会话描述协议

2. 地址转换NAT
经常有人问我=

为什么我配置了stun,进行了p2p穿透,可还是有很多情况下不通?
为什么ios通,android不通?
为什么移动能打通,电信打不通,wifi和4g有的通有的不通
好吧,其实我也不是很清楚

历史告诉我们,当我们无法触及到某个真理的时候,我们只能通过类比或者工具模拟的方式来解释我们所看到的一切。

说起nat,其实就是不知道对方实际地址,然后通过扔一个探测包,然后有回应就拿到对方地址的方式

我们说的nat不通,是因为咱们这个国内网络情况比较复杂,究其历史原因,就要说到移动、联通、电信的历史了,篇幅太长,暂时搁置。

总而言之,不通就不通嘛,总还有别的办法

3. candidate
我们先来看下Ice candidate类中的属性

public final String sdpMid;//描述协议的id
public final int sdpMLineIndex;//描述协议的行索引
public final String sdp;//会话描述协议

好了,到这为止,应该已经了解到,这玩意就是个模版

当我们调用setLocalDescription的时候,底层的代码就会帮我们的收集candidate(候选信息),然后回调到上层,然后我们将其发送到服务器,然后服务器再发送到另一端

一定会好奇这个candidate里有啥是吧,其实就是一些网络信息的候选地址,一个不通换另一种的那种。

我们称交换candidate的过程称为网络协商

stun
好了,我们的主角登场

STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)是一种网络协议,它允许位于NAT(或多重
NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的
Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间创建UDP通信。该协议由RFC 5389定
义。
其实有好多人问我,在局域网需不需要stun服务器?

我很认真的告诉你,不需要!

这时候,又会有人问了,你的demo为啥不部署stun,局域网内不通呢?

我也很认真的告诉你,请看官方demo,有个直连的类你可以借鉴,直接填写对方的地址,因为需要知道对方的地址才能进行通信的咧

来张图

STUN并不是每次都能成功的为需要NAT的通话设备分配IP地址的,P2P在传输媒体流时,使用的本
地带宽,在多人视频通话的过程中,通话质量的好坏往往需要根据使用者本地的带宽确定。

这时候,就需要turn来协调,保证通话质量,用服务器来解压

TURN
TURN的全称为Traversal Using Relays around NAT,是STUN/RFC5389的一个拓展,主要添加了Relay功能。如果
终端在NAT之后, 那么在特定的情景下,有可能使得终端无法和其对等端(peer)进行直接的通信,这时就需要公网
的服务器作为一个中继, 对来往的数据进行转发。这个转发的协议就被定义为TURN。

再来张图

在STUN分配公网IP失败后,可以通过TURN服务器请求公网IP地址作为中继地址。这种方式的带宽由服务器端承
担,在多人视频聊天的时候,本地带宽压力较小,并且,根据Google的说明,TURN协议可以使用在所有的环境中。

ICE
ICE跟STUN和TURN不一样,ICE不是一种协议,而是一个框架(Framework),它整合了STUN和TURN。
coturn开源项目集成了STUN和TURN的功能

好了这篇文章到此位置,看看代码消化一下

Android端:https://github.com/ddssingsong/webrtc_android

服务器端:https://github.com/ddssingsong/webrtc_server_node

Webrtc中stun和turn的理解相关推荐

  1. 实际中的WebRTC:STUN,TURN以及信令(五)

    原标题:WebRTC in the real world: STUN, TURN and signaling 前文链接:实际中的WebRTC:STUN,TURN以及信令(一),实际中的WebRTC:S ...

  2. WebRtc 之 STUN和TURN

    在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet.很多时候,我们希望网络中的两台主机能够直接进行通信,即所谓的P2P通信,而不需要 ...

  3. webrtc下的媒体网络连接STUN、TURN、UDP、TCP

    一.理想的网络 媒体流创建流程: 1. PeerA.PeerB分别把自己的IP地址(包含端口号)和媒体能力(本地能支持的音视频编解码类型)告诉信令服务器. 2. 信令服务器对媒体能力进行协商,找到一组 ...

  4. WebRTC中的信令和内网穿透技术 STUN / TURN

    Translated from WebRTC in the real world: STUN, TURN and signaling. 最近刚接触到WebRTC,网上看到这篇介绍WebRTC的文章不错 ...

  5. webrtc进阶-信令篇-之三:信令、stun、turn、ice

    webRTC支持点对点通讯,但是webRTC仍然需要服务端:  . 协调通讯过程中客户端之间需要交换元数据,    如一个客户端找到另一个客户端以及通知另一个客户端开始通讯.  . 需要处理NAT(网 ...

  6. webrtc进阶-信令篇-之三:信令、stun、turn、ice 【转】

    文章来源:webrtc进阶-信令篇-之三:信令.stun.turn.ice webRTC支持点对点通讯,但是webRTC仍然需要服务端:  . 协调通讯过程中客户端之间需要交换元数据,    如一个客 ...

  7. webrtc学习: 部署stun和turn服务器

    webrtc的P2P穿透部分是由libjingle实现的. 步骤顺序大概是这样的: 1. 尝试直连. 2. 通过stun服务器进行穿透 3. 无法穿透则通过turn服务器中转. stun 服务器比较简 ...

  8. WebRTC:stun/turn服务器搭建

    基于coturn项目的stun/turn服务器搭建 VoIP (Voice over Internet Protocol), 一种语音通话技术,经由网际协议(IP)来达成语音通话与多媒体会议,也就是经 ...

  9. P2P技术详解(三):P2P技术之STUN、TURN、ICE详解 (webrtc)

    https://www.cnblogs.com/mlgjb/p/8243690.html 简单的说,TURN与STURN的共同点都是通过修改应用层中的私网地址达到NAT穿透的效果,异同点是TURN是通 ...

最新文章

  1. 201671010128 2017-11-05《Java程序设计》之集合
  2. Nginx之rewrite:域名与二级目录之间的跳转
  3. FFMPEG结构体分析之AVStream
  4. 电脑销售渠道_双十一遇上英雄联盟S10,苏宁游戏装备销售增长258%
  5. 目录浏览器对话框控件 c# 1614822374
  6. 搭建了Pycharm对话平台
  7. 吴恩达机器学习练习2:Regularized logistic regression
  8. 【C++】使用setprecision控制输出流显示浮点数的有效数字个数
  9. 配置库管理及版本管理规范
  10. fan4801开关电源原理图_全面解析开关电源各功能电路(附原理图)
  11. DDA划线法(Digital Differenttial Analyzer,数值微分法)
  12. 部署CITA和区块链浏览器以及智能合约
  13. 基于深度学习的推荐系统
  14. VisualSFM+MeshLab 三维重建全过程记录
  15. 使用Pandas处理美国人口数据
  16. docker-compose 怎么只 recreate 指定的 service
  17. python集合的概念_用Python中的集合Set讲解演示高一数学集合的概念
  18. 计算机视觉——立体图像
  19. draw.io插件在vscode中一体化导出高质量图片
  20. 写日记/写博客的好处

热门文章

  1. 图论复习(各类习题)
  2. 我们是已经谈不起恋爱的80后
  3. Jsvm2 与 prototype.js 组合 應用心得
  4. OpenBoard 白板交互式应用程序
  5. eclipse+Maven安装和配置
  6. Android 开发工具集合 - (Android Dev Tools)
  7. CodeWithMosh--mysql 学习笔记(2)
  8. # 异运算_人教版六年级数学下册第29课数的运算(P7680)图文视频辅导
  9. 在python中如何判断数组中的数据为空值_缓存穿透问题,开发中真实解决方案
  10. html() 无效,Internet Explorer无效HTML解析代码漏洞