- NAT:内网打穿到公网
- STUN:公网信息交换,进行连接
- TURN:云端服务器,防止STUN连接失败,A端通过TURN服务器转发给B端
- ICE:找出所有的IP路径
NAT
NAT穿越可以分为四种类型:完全锥型、地址限制型、端口限制型、对称型
完全锥型
内网打穿后生成公网地址和端口,任意外网用户访问都可以访问,没有限制。
地址限制型
内网主机IP和端口、 NAT穿越后生成公网IP和端口、要请求的主机IP,其它主机的ip地址不是内网主机要请求的地址会失败
端口限制型
在地址限制型的基础上,增加了端口限制,如果请求的主机返回的端口也不对,请求也不成功
对称型
NAT穿越后会生成多个IP地址和端口号, 请求的主机对应一个ip地址和端口,内外穿到外网会生成不同的ip地址和端口号给不同的主机
NAT穿越的原理
- 1.C1,C2向STUN发送消息(网络信息),stun获取对应的公网ip和端口
- 2.stun交换公网IP及端口给C1,C2
-
C1->C2,C2->C1,端口猜测
image.png
-
NAT类型检查
前提要在服务端部署STUN服务器,并且有两个IP地址和端口
- 客户端发送请求给服务端,服务端发送多条相同的ip地址和端口给客户端,如果客户端不能接收到则网络不同。
- 客户端收到服务端信息,判断发送出去的公网的ip和本机的ip是否一致,一致则是公网,不一致到4
- 服务端再发送另一个IP和端口给客户端,如果客户端可以接收到就是在一个开放的网络中,客户端接收不到则是有防火墙的
- NAT检测:
4.1 服务端发送不同的IP和端口给客户端,如果能接收到则是完全锥型
,不行就是4.2
4.2 客户端向服务端的第二个ip和端口发送数据,服务端返回一个ip和端口给客户端,如果与1
的不一样则是对称型
。如果一样4.3
4.3 客户端向服务端第一个IP地址和端口发送请求,返回的是同一个地址不同的端口号,如果客户端不能接收到则是端口限制型
,能接收到则是地址限制型
STUN协议
目的:NAT穿越,主机访问STUN服务器,返回一个公网ip地址
stun是典型的客户端/服务器响应模式,客户端发送请求,服务端响应。
规范:
RFC3489:通过UDP进行NAT穿越
RFC5389:通过UDP、TCP进行NAT穿越
由于UDP会有失败的情况,RFC5489引入TCP。
stun 5389格式
- STUN Header
-
message type
(类型):2个字节,共16位,前两位是00用以不同的协议复用同一个端口的时候区分哪个是STUN协议;还有2位C0、C1用于分类:请求、指示、成功应答、失败应答;剩余12为用于请求 - 消息长度: 2个字节,不包含header本身
- magic cookie:4字节,固定值0x2112A442。通过它可以判断客户端是否可以识别某些属性。有这个值就是5389,5389定义了一些新的属性。
- 事务ID:12字节,96位,用于匹配请求与响应的事务ID相同的消息
-
0b00:表示是一个请求
0b01:表示一个指示
0b10:表示一个请求成功的响应
0b11:表示一个请求失败的响应
最右侧是c0,
大小端模式
- 大端模式:数据的高字节保存在内存的低地址中,低字节保存在内存的高地址中
- 小端模式:数据的高字节保存在内存的高地址中,低字节放在低地址中
- 网络字节顺序:采用大端排序方式
网络中使用大端模式,左边的优先被接收到,右边的最后接收到。
- body
- 消息头后有0个或多个属性
- 每个属性进行TLV编码:Type,Length,Value
其中USERNAME、PASSWORD最重要,用于STUN服务器验证用户合法性
属性的什么时候使用
N/A 不支持,O是可选的,M是服务端,C是客户端
TURN协议
- TURN是在解决NAT无法穿越的问题。
对称型和对称型
与对称型好端口限制型
无法互通。 - 在无法通行的时候,将媒体流数据转给TURN服务器,进行中继处理,然后再转发给客户端
- 建立在STUN上,消息格式使用STUN格式消息,主要body的属性不一样。(STUN和TURN建立在一起)
- TURN Client要求服务端分配一个公共IP和Port用于接收或发送数据。
turn使用的传输协议
turn client - turn server :UDP、TCP、TLS over TCP
TURN server to peer: UDP
在STUN无法接通时,这时就需要公网的服务器作为一个中继,对来往的数据进行转发。这个转发的协议就被定义为TURN。TURN和其他中继协议的不同之处在于,它允许客户端使用同一个中继地址(relay address)与多个不同的peer进行通信。
使用TURN协议的客户端必须能够通过中继地址和对等端进行通讯,并且能够得知每个peer的的IP地址和端口(确切地说,应该是peer的服务器反射地址)。
TURN协议被设计为ICE协议的一部分,relay地址会作为一个候选,由ICE在多个候选中进行评估,选取最合适的通讯地址。一般来说中继relay的优先级都是最低的。
TURN协议本身是STUN的一个拓展,因此绝大部分TURN报文都是STUN类型的,作为STUN的一个拓展,TURN增加了新的方法(method)和属性(attribute)。
在典型的情况下,TURN客户端连接到内网中,并且通过一个或者多个NAT到达公网,TURN服务器架设在公网中,不同的客户端以TURN服务器为中继和其他peer进行通信,如下图所示:
在上图中,左边的TURN Client是位于NAT后面的一个客户端(内网地址是10.1.1.2:49721),连接公网的TURN服务器(默认端口3478)后,
服务器会得到一个Client的反射地址(Reflexive Transport Address, 即NAT分配的公网IP和端口)192.0.2.1:7000,
此时Client会通过TURN命令创建或管理ALLOCATION,allocation是服务器上的一个数据结构,包含了中继地址的信息。
服务器随后会给Client分配一个中继地址,即图中的192.0.2.15:50000,另外两个对等端若要通过TURN协议和Client进行通信,
可以直接往中继地址收发数据即可,TURN服务器会把发往指定中继地址的数据转发到对应的Client,这里是其反射地址。
Server上的每一个allocation都唯一对应一个client,并且只有一个中继地址,因此当数据包到达某个中继地址时,服务器总是知道应该将其转发到什么地方。
但值得一提的是,一个Client可能在同一时间在一个Server上会有多个allocation,这和上述规则是并不矛盾的。
ICE
ICE包括了NAT、STUN、TURN。
主要工作:
第一步:找出端与端的所有路径:网卡的路径,NAT穿越后的公网ip、中继服务、多网卡、vpn等
第二步:相互传给对方路径,找出能通的路径
基本概念
- ICE Candidate
1.每个candidate是一个地址,协议、IP地址、端口、类型
2.candidate类型:主机候选者、反射候选者(nat后的地址)、中继候选者(TURN服务生成的IP地址) - 具体工作
收集candidate、对candidate pair 排序、连通性检测 - SDP
通过信令服务器交换SDP媒体信息