WebRTC学习进阶之路 --- WebRTC网络知识详解(一)(P2P/STUN/TURN/ICE)
WebRTC学习进阶之路系列总目录:https://blog.****.net/xiaomucgwlmx/article/details/103204274
在介绍这些基本知识之前我们要清楚WebRTC的目的以及根本要解决的问题是什么。WebRTC首要要解决的问题是两个浏览器之间如何进行音视频的实时互动,对于底层来说就是两个端点之间如何进行高效的网络传输。下边我们来一项一项的详细介绍这些内容。
一、NAT(Network Address Translator)
网络上的主机要有一个公网的地址才能进行通讯,现实中我们大部分主机都是在网关之后的,实际是有一个映射,在网关上有一个NAT功能,将内网的地址映射成外网的地址。
NAT的工作原理:
其实就是一个地址的映射,上图左半部分是几台内网机器,有自己的内网IP,他们之间可以通讯,但与互联网没法通讯 ,因此需要NAT进行转换。如11.0.25.23转换成122.35.10.11,每台内网主机实际要映射成不同的端口,IP不变。
NAT产生的原因
1,IPv4的地址不够
2,出于网络安全的原因
NAT种类
1,完全锥型NAT(Full Cone NAT)
当内网中的某一台主机经过NAT的映射后形成外网IP地址和端口号,外网的所有主机只要知道这个地址就都可以向这台主机发送数据,安全性低;
2,地址限制性锥型NAT(Address Restricted Cone NAT)
对出去请求的时候会对出去的IP地址做一些限制,当回来的时候只有出去的IP地址主机才能回消息,也就是我没有向你发送请求你向我发数据是不允许的;
3,端口限制锥形NAT(Port Restricted Cone NAT)
在IP地址限制的基础上又增加了端口的限制,给某台主机的某个应用发送,也就是只有有个应用或者说这个端口回来的数据才会接收;
4,对称型NAT(Symmetric NAT)
当经过NAT转换的时候,内网的主机出外网的时候形成的映射并不是一个,而是多个IP地址和端口,也就是说访问不同的主机他会形成自己的IP地址和端口,这就更加严格,你想知道我的IP地址都很困难。我请求A出去的是一个IP地址和端口,A告诉B有一个内网他的映射地址是这个,通过这个地址访问的时候实际是不能访问的,因为如果内网的主机与第三个主机进行连接的时候会新建一个IP地址和端口,基本不能穿越。
NAT穿越的原理
下边对每一种NAT类型的穿越原理进行介绍。
1,完全锥型NAT
左边是内网自己的IP地址和端口X,y,通过防火墙转换之后形成外网的IP地址和端口A,b,外边的三台主机要想与内网的主机进行通讯的时候,首先要由内网的主机向外请求,请求外网中的某一台主机,这样会在NAT上打一个洞,形成一个外网的IP地址和端口,然后其他的主机只要获得了这个IP地址和端口都可以通过防火墙与内网主机进行通讯。
2,地址限制锥形
会在防火墙上形成一个五元组:内网主机的IP地址和端口,外网映射后的公网IP地址和端口以及要请求的主机的IP地址和端口。同样的第一步要由内网向外网发送请求,在NAT上形成一个映射表,外网主机就可以和内网主机通讯。如图可以看到,向P这个主机发送请求,P可以通过不同的应用或者说端口向内网主机发送消息,但对于其他主机,由于IP地址的限制只有P这台主机的所有应用可以通讯
3,端口限制锥形
更加严格,不管对IP地址限制,对端口也有限制,如图请求P这台主机的q端口,那么只有这个主机的这个端口可以进行通讯。
4,对称型NAT
前边三个在我防火墙上形成的公网IP地址和端口时不变的,想要访问的主机要找是能找到的(虽然有的通有的不通),而对称型会形成多个公网地址,对于每一台主机都会形成不同的IP地址和端口,如图,M,n只有向C,d发送才能成功,向A,b发送就没法通讯。
基本步骤:
1,C1,C2向STUN发消息
2,交换公网IP及端口
3,C1->C2,C2->C1,甚至端口猜测
想要穿越C1和C2都要知道彼此的地址,就要向STUN服务发消息,STUN服务拿到他们地址后就能拿到他们对应的IP和端口,然后进行交换公网的IP和端口信息,然后按照类型进行打通。
NAT穿越组合
NAT类型判断
二、STUN(Simple Tranversal of UDP Through NAT)
STUN介绍
- STUN存在的目的就是进行NAT穿越
- STUN是典型的客户端/服务器模式。客户端发送请求,服务端进行响应
RFC STUN规范
- RFC3489/STUN
- Simple Traversal of UDP Through NAT 通过UDP进行穿越
- RFC5389/STUN
- Session Traversal Utilities for NAT 一系列穿越NAT的工具,包括UDP和TCP两套穿越方式
STUN协议
- 消息头,包括20字节的STUN header
- Body中可以有0个或多个Attribute
消息头有哪些组成呢:
2个字节(16bit)类型 2个字节消息长度,不包括消息头本身 16个字节事务ID,请求与响应事务ID相同
消息头的格式:
下边详细介绍一下header中的这些字段的具体含义。
STUN Message Type(消息类型,2字节):
- 前两位必须是00,以区分复用同一端口时STUN协议
- 2位用于分类,即C0和C1
- 12位用于定义请求/指示
C0C1
- 0b00:表示是一个请求
- 0b01:表示是一个指示
- 0b10:表示是请求成功的响应
-
0b11:表示是请求失败的响应
大小端模式:
- 大端模式:数据的高字节保存在内存的低地址中
- 小端模式:数据的高字节保存在内存的高地址中
- 网络字节顺序:采用大端排序方式
Message Length:消息长度,2字节
Magic Cookie:4字节,固定魔法数,看到这个魔法数就可以判断为STUN消息
Transaction ID:
- 4字节,32位,固定值0x2112A442,通过它可以判断客户端是否可以识别某些属性
- 12字节,96位,标识同一个事务的请求和响应
SRUN Message Body:
- 消息头后有-或多个属性
-
每个属性进行TLV编码:Type,Length,Value
三、TURN(Traversal Using Relays around NAT)
TURN介绍
- 目的是解决对称NAT无法穿越的问题,遇到对称型等无法穿越时将数据传给TURN服务,由TURN服务中介转给其他接收者,或者其他接收者发送数据给TURN服务,转送给client端
- 建立在STUN之上,消息格式使用STUN格式消息,协议头和body基本一样,外壳形式一样内容有所不同
- TRUN Client要去服务端分配一个公共IP和Port用于接收或发送数据
总结一下使用流程:
- STUN binding
- Caller TURN allocation
- Caller sends offer
- Callee TURN allocation
- Callee answers OK
- Exchage candidate IP address
- ICE check for P2P connection
- If P2P unsuccessful, make relay connection
四、ICE(Interactive Connectivity Establishment)
什么是ICE?
ICE,Interactive Connectivity Establishment,交互式连通建立方式,并非一种新的协议,它不需要对STUN、TURN或RSIP进行扩展就可适用于各种NAT,需要两端进行交互才能创建连接。
ICE是通过综合运用上面某几种协议,使之在最适合的情况下工作,以弥补单独使用其中任何一种所带来的固有缺陷。
对于SIP来说,ICE只需要定义一些SDP(Session Description Protocol)附加属性即可,对于别的多媒体信令协议也需要制定一些相应的机制来实现。
如何建立交互?
我们来看一张图,这张图清楚表达了两个端之间通过ICE建立交互连接的过程:
简述一下过程,首先两个终端Peer都知道自己的外网IP地址,那如何知道另一方的地址呢,想要建立连接,就需要通过信令服务器转发彼此信息,交换IP地址和端口建立连接。这里涉及到几个核心概念:
ICE Candiate:
- 每个Candiate是一个地址
每个候选者包括:协议、IP、端口、类型
例如:a = Candiate:...UDP ...192.168.1.2 1816 type host - Candiate类型
主机候选者:电脑本地的IP地址和端口
反射候选者:穿越NAT后映射的外网地址
中继候选者:进行NAT穿越很多时候是穿越不成功的,这时候需要服务器进行中转形成的地址
- 收集Candiate
Host Candiate:本机所有IP和指定端口
Reflexive Candiate:映射的Candiate通过STUN/TURN服务获取
Relay Candiate:向中继服务器发请求,拿到中继地址,通过TURN协议获取
ICE具体做些什么
- 收集Candiate
- 对Candiate Pair排序 进行Candiate交换
- 连通性检查 发送侦测包进行检测
ICE技术
基于IP的语音、数据、视频等业务在NGN(Next Generation Network)网络中所面临的一个实际困难就是如何有效地穿透各种NAT(Network Address Translator)/FW(Fire Wall)的问题。对此,SIP(会话初始化协议)以往的解决方法ALGs((Application Layer Gateway Service))、STUN、TURN等方式。
现在有一种新的媒体会话信令穿透NAT/FW的解决方案-交互式连通建立方式ICE。它通过综合利用现有协议,以一种更有效的方式来组织会话建立过程,使之在不增加任何延迟同时比STUN等单一协议更具有健壮性、灵活性。多媒体会话信令协议是在准备建立媒体流传输的代理之间交互信息的协议,例如SIP、RTSP(real time streaming protocol)等。
下边给大家看一个webrtc的整体交互过程如下图:
参考链接:https://blog.****.net/ice_ly000/article/details/100904428
WebRTC学习进阶之路系列总目录:https://blog.****.net/xiaomucgwlmx/article/details/103204274