热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WebRTC教程二:WebRTCAPI和Leak

WebRTC教程二:WebR

这篇文章主要介绍了 WebRTC 的一些主要 API 和内部自带的建立连接的功能及特性。

附上教程(1):WebRTC 教程(1)

WebRTC API

getUserMedia

首先介绍了 getUserMedia,这是一个提供到多媒体流的 API。比如希望存储音视频数据就可以使用 MediaStreamRecorder API。getUserMedia()是一个无论对于开发者还是用户都十分方便的 API:开发者可以仅使用一个函数来获取音视频源数据,而用户也不需要安装其他软件或库。这个 API 只有一个方法,就是 getUserMedia(),从属于 window.navigator.object。

getUserMedia 结构

getUserMedia 方法会提示用户是否有使用一个多媒体的权限,其输入参数是音频或视频的参数,这些参数都是 bool 类型的,你可以根据你的需求选择这些参数,如是否请求一个音视频流。此外还可以添加额外的限定,如分辨率,视频的宽高度等。

错误/异常处理‘’

接着讲者展示了一些 getUserMedia 可能返回的错误及异常处理:

RTCPeerConnection

RTCPeerConnection 代表了两台计算机之间的端到端连接,它提供了连接到一个远程对端的方式,控制和断开连接的方法。这个 API 是 WebRTC 连接的核心部分,负责了整个端到端连接的生命周期。

RTCPeerConnection 结构

在 WebRTC 中可以使用 RTCPeerConnection()构造函数,来获取一个端到端间最新建立的 RTC 连接。这个 API 接收一个 RTCConfiguration 类为输入参数,并定义了这个端到端连接应如何建立,以及其应使用的 ICE 服务器。

RTCPeerConnection 功能

  • 它会跟踪本地和远程连接流;

  • 它会管理 NAT 穿透的 ICE 工作流;

  • 它会根据需求自动触发流的重新协商;

  • 它会在流之间发送自动的心跳包;

  • 它会为其他 API 提供连接请求,接收答复等。

RTCPeerConnection 概览

接着讲者展示了 RTCPeerConnection 的具体模式:

图中可以看到 RTCPeerConnection 掌管了端到端连接的本地和远程流,以及负责控制 ICE Agents,来跟 STUN 和 TURN 服务器工作。

Session Description Protocal(SDP)

要建立端到端连接,就必须知道对方的公网 IP 地址。假设有以下情况:

  • 两端都在同一网络下,可以直接连接;

  • 两端各在一个子网下,且可能还有防火墙,对于 WebRTC 无法直接建立连接;

  • 一端可能下线、忙碌、或者无意与其他用户初始化连接。

WebRTC 自带的 ICE 协议可以解决必需的路由和连接检查,剩下的问题可以由信令服务器解决。为了使用信令服务器,用户首先需要在同一个信令服务器下,并通过信令服务器来交换其他用户的连接信息。信令服务器通过 SDP 服务来获取用户信息。

SDP 是一种单纯的基于文本的协议,传递一种会话文件:连接的各种属性的列表,如媒体类型、网络参数、编解码器、带宽信息等。WebRTC 提供一个 createOffer()方法来为会话产生 SDP 描述,但是 WebRTC 内部实际上不会直接处理 SDP,它的 Javascript Session Establishment 会处理所有 SDP 过程的内部工作。SDP 请求产生结束后,会通过信令服务器被发送到远程对端。产生的 offer 称之为会话的 "local description",对于接收到的 SDP 答复,称之为会话的 "remote description"。

CSDN站内私信我(关注旁边,就是私信),领取最新最全C++音视频学习提升资料,内容包括(C/C++Linux 服务器开发,FFmpeg webRTC rtmp hls rtsp ffplay srs

 

SDP 方法

讲者展示了之前提到的四个最主要的处理 SDP 的函数:

其中可以看到创建 SDP 请求和答复的 createOffer()以及 createAnswer(),以及设置本地 SDP 和远程 SDP 的 setLocalDescription()和 setRemoteDescription()。

SDP 流程

讲者展示了一张 SDP 流程图:

图中信令服务器用于转发端到端之间的 SDP 请求以及答复。

Interactive Connectivity Establishment (ICE)

端到端连接

由于多层的防火墙和 NAT 设备,用户之间的端到端连接有可能十分困难。假设两个用户各处在一个独立的子网下,WebRTC 框架就可以解决这种情况下的连接问题。RTCPeerConnection 类包含一个 ICE Agent,ICE Agent 可以获取到本地 IP 和端口,并可以完成两端之间的连接性检查,此外还可以保持连接存活。

ICE 工作模式

在确认了会话描述后,ICE 就会开始自动寻找所有可用 IP 地址和端口。首先他会向操作系统请求其公网 IP 地址,假如这一步失败了,ICE Agent 就会向它的 STUN 或者 TURN 服务器请求其公网 IP。如果一个新的节点(ip+port),ICE 就会自动通过 RTCPeerConnection 对其注册。整个 ICE 流程都是在后台自动完成的。在这个过程完成后,就能够找到端到端间路由路径。

Trickle ICE

Trickle ICE 是对于 ICE 协议的一个扩展,允许在端之间进行增性的寻找以及连接检查。RTC 不需要再等待 ICE 寻找过程结束,就可以通过信令服务器向另一端发送增性升级,这样的话另一端就不需要在连接的过程中等待。这样的话两端就可以在没有 ICE 的情况下交换 SDP 请求。尽管 Trickle ICE 会在信令服务器上产生更多的网络流量,但是可以帮助在端到端连接初始化时减小很多时间。简而言之,就是 WebRTC 先发送 SDP 请求,然后一旦有成员被发现就开始 trckle ICE。

在 WebRTC 连接中,没有任何保证连接建立后就能一直保持此状态,这个连接很有可能周期性的断开,这时 ICE Agent 就会尝试找到最优路径来重新建立这个连接。

WebRTC Leak

WebRTC 提供了非常方便好用的在浏览器的实时视频通信系统,但是仍需要考虑线上隐私问题。

WebRTC Leak 指的是:你的公网 ip 地址被你浏览器的 WebRTC 功能所泄露出去。当你使用虚拟专用网(Virtual Private Network:VPN)时,你的 IP 地址还是安全的,但是当你使用了 WebRTC 后,WebRTC 就能通过 STUN/TURN 服务器获得到你的公网 IP 地址。

如何检查 WebRTC Leak

首先使用你的 VPN 并连接到一个服务器,再检查你的公网 IP 地址是什么。然后在 google 中搜索你的 ip 地址,如果搜索到的结果和你本地显示的一样,说明 WebRTC 把你的公网 IP 地址泄露了。

如何避免 WebRTC Leak

目前的唯一方法就是把浏览器的 WebRTC 功能关闭。如果你使用的是火狐浏览器,你就可以在 url 中输入about:config,并将media.peerconnection.enabled一值设置为 false。如果你使用的是 Chrome 浏览器,则需要安装uBlock Origin Chrome扩展来关闭 WebRTC 功能。


推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 本文比较了eBPF和WebAssembly作为云原生VM的特点和应用领域。eBPF作为运行在Linux内核中的轻量级代码执行沙箱,适用于网络或安全相关的任务;而WebAssembly作为图灵完备的语言,在商业应用中具有优势。同时,介绍了WebAssembly在Linux内核中运行的尝试以及基于LLVM的云原生WebAssembly编译器WasmEdge Runtime的案例,展示了WebAssembly作为原生应用程序的潜力。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • java实现rstp格式转换使用ffmpeg实现linux命令第一步安装node.js和ffmpeg第二步搭建node.js启动websocket接收服务
    java实现rstp格式转换使用ffmpeg实现linux命令第一步安装node.js和ffmpeg第二步搭建node.js启动websocket接收服务第三步java实现 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
author-avatar
用户qqpgrvet8m
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有