| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Webrtc从理论到实践三:角色 -> 正文阅读 |
|
[系统运维]Webrtc从理论到实践三:角色 |
系列文章目录Webrtc从理论到实践一:初识 一、一对一通信架构图二、通信角色介绍
????从上图我们可以看到, 在架构图中主要存在四个角色:客户端1,中继服务器(STUN/TURN),信令服务器和客户端2。两个客户端在这里就不多做介绍了,主要介绍一下另外两个角色。 信令服务器????首先说一下信令服务器,要实现Webrtc的一对一通信,信令服务器是最重要的一环。信令服务器的作用主要有三个:
中继服务器????再来说一下中继服务器,中继服务器的主要目的就是为了实现P2P连接,这里的STUN 和TURN 分别代表了两种协议。 NAT????1993年提出的NAT(Network Adress Translation,网络地址转换)技术是为了解决当时IPV4地址不足,而IPV6短期内还无法替换IPV4的问题,同时它还能够有效地避免来自外部网络的攻击。 然而由于 网关会将外部网络发起的主动连接直接丢弃,这就给P2P连接带来很大的麻烦。所以如果想让两个处于NAT后的终端直接通信,就需要一些适用于P2P网络的NAT穿越技术,比如反向链接技术,应用层网关ALG(Application Level Gateway)技术,打洞技术,中间件技术等。 STUN????STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)用于检测网络中是否存在NAT设备,并获取两个终端经NAT设备分配的外网IP地址和端口,然后建立一条可穿越NAT的P2P链接,这一过程也被形象的称为“打洞”。STUN无需现有的NAT设备做任何改动,只需要在组网中搭建一台STUN服务器,操作简便,所以得到广泛的应用。
STUN 进行内网穿透主要有两个阶段,一是探测阶段,二是打洞阶段,其中探测阶段比较重要,它又分为两个步骤,第一个是探测内网中是否存在NAT保护,第二个步骤是 判断NAT的类型。下面我将结合流程图为大家讲解一下这两个步骤。(注:以下流程是基于两台STUN服务器,每台STUN服务器具有两块网卡,每块网卡都配置公网IP地址的情况下进行的) NAT探测
NAT类型探测
打洞阶段这里所谓的”洞“就是在NAT上建立了一个内外网映射表,我们以最简单的完全锥型举例,这张表包括内网ip和内网port,映射的外网ip和外网port,格式如下 不同类型的NAT之间可能无法进行穿越,下表是各NAT是否可穿越表
IP限制型与对称型下面我将以IP限制锥型和对称型之间的穿越过程为例,讲解Stun打洞的具体流程 第一、二步是主机先与STUN服务器通信,交换双方的外网的IP和端口等信息,然后在各自的NAT上创建映射表,比如
之后就是第三步主机A向第一二步获得的主机B外网Ip和端口发送数据,但是此时主机B的NAT映射表中没有主机A的记录,所以主机A发往主机B的数据就会被丢弃,但是此时主机A的NAT映射表上增加了B的IP地址[S的外网IP,B的外网IP],最后进行第四步,因为主机B位于对称型NAT之后,所以每次访问一个新的IP主机时,会映射一个新的外网端口,并且重新打一个”洞“,生成的NAT表如下
此时,由于主机A上的洞已经生成,由于主机A位于IP限制锥型之后并且已经记录了主机B的外网IP,所以主机B向主机A的发送的数据可以正常到达主机A。同时,主机A也可以向主机B发送数据,至此IP限制锥型与对称型NAT打洞成功。 端口限制型和对称型接下来,我想要解释一下为什么端口限制型无法与对称型进行NAT穿越。我们将上述图中的A主机放到端口限制型NAT之后。在第四步的时候由于B映射的外网端口如果是新的端口并且没有在A的NAT映射表中的记录该端口,所以数据包是无法发送到A主机的.这里再扩展一下,如果要想让二者建立通信,需要让两台主机建立65535个UDP通信,由于65535包含了所有的端口号,所以总有一个端口是对的,但是这样就导致电脑无法处理正常的TCP连接,并且会占用大量资源,而且成功率也非常低,所以我们通常认为二者是不能进行穿透的。 TURN前面说到了当遇到NAT无法打通的情况下,WebRtc就会使用TURN协议通过中转的方式来实现端到端的通信。下面,我将讲解一下TURN协议的通信流程。 分配客户端首先向STUN Port(默认是3478端口)发送一个Allocate请求到服务器,服务器会给该客户端分配一个relay端口并且返回分配成功响应,在该response中包含了XOR-REPLAYED-ADREE属性,该属性的值是A的relay端口。该relay地址是个公网地址,相当于客户端A在公网上的一个代理,任何想要与A通信的客户端,只要将数据发送到A的relay地址就可以了。 转发机制????任何想要与客户端A通信的人,只要知道客户端A的relay地址就可以,注意B在这里不是client,它被称为peer,client和peer之间有两种方式可以通过中继服务器交换数据,一种是relay,第二种是channel。client是可以同时与多个peer进行通信的,那么server是如何得知哪个peer应该接收数据,以及告知client接收的数据来自哪个peer的呢?
信道机制????音视频数据转发场景中,使用Send/Data Indication转发机制,会多加的36字节格式信息,加重客户端和服务端之间的带宽压力。为改善这种情况,turn提供channeldata message信道机制。channeldata message不使用stun头部,而使用一个4字节的头部,包含一个称为信道号*的值(channel number)每一个使用中的信道号都与一个特定的peer绑定,即作为对等端地址的一个记号。要将一个信道与对等端绑定,客户端首先发送一个信道绑定请求(channelbind request)到服务器,并且指定一个未绑定的信道号以及对等端的地址信息。绑定后client和server都能通过channeldata message来发送和转发数据。信道绑定默认持续10分钟,并且可以通过重新发送channelbind request来刷新持续时间。和Allocation不同的是,并没有直接删除绑定的方法,只能等待其超时自动失效。 上图中0x4001为信道号,即channeldata message的头部中头2字节,值得一提的是信道号的选取有如下要求: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/29 8:35:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |