前言
最近因为在研究WebRTC,因为对音频视频模块基本都已经了解,就对其中的网络模块针对性的了解一下。
这里面Transport层主要涉及3个层次SRTP、Multiplexing、P2P(STUN+TURN+ICE),现在就主要针对P2P这部分STUN、TURN和ICE的来源和设计初衷做个简单的介绍,不涉及具体的算法和技术实现,主要内容主要是翻译自外网的这篇文章。里面有一些公司介绍广告就不说了。
IP地址和视频连接的一个棘手问题是NAT的限制和防火墙对建立可靠呼叫的影响(A setback to IP and Video connectivity has been the restriction NATs and firewalls pose to reliable call completion.这句原话的语法拆解了好久= =)。NAT和防火墙在安全和加强因特网的可用性上扮演了很重要的角色,但是同时也造成了在建立IP终端上严重的问题。IETF(国际互联网工程任务组 The Internet Engineering Task Force,简称 IETF)创建里STUN, TURN和ICE标准来解决NAT穿越的问题。
STUN能帮助连接IP终端:
- 发现他们是否在NAT或者防火墙后面
- 确定公网IP地址和防火墙的类型。STUN然后使用这些信息去协助建立点对点的IP连接
虽然STUN在解决大部分用户设备(路由器之类的)的NAT问题上很有效,但是它在很多公司网络上问题上不是很有效。TURN,全称Traversal Using Relay NAT,通过提供使用一个流媒体预备服务来实现终端之间的流媒体传输的降级NAT穿越技术。
ICE是一个权衡STUN、TURN来提供可以来的IP建立和媒体传输的框架,通过一个SIP提供一个终端交换候选IP地址和端口的模型(比如一个私有地址和TURN服务地址)。
什么是NAT
NAT是指Network Address Translation。概括来说就是路由器把本地私有子网IP地址转换称公网(通常是一个由因特尔服务供应商ISP分配的IP地址)IP地址的修改IP信息的过程。现有的一个主要挑战就是在网络中的客户端之间建立直接连接。
现在有4中NAT在如今的路由器中,根据最少限制性到最多限制性来排序可以分为:
Full cone(全锥型)
一旦一个内网地址(iAddr:iPort)被映射到一个外部网络地址(eAddr:ePort),任何iAddr:iPort的包都会通过eAddr:ePort来发送。任何外部主机都可以通过给eAddr:ePort发送网络包来给iAddr:iPort传送信息。
Address-restricted cone(限制型锥形)
一旦一个内网地址(iAddr:iPort)被映射到一个外部网络地址(eAddr:ePort),任何iAddr:iPort的包都会通过eAddr:ePort来发送。但是一个外部的主机(hAddr:any)只有在iAddr:iPort之前给hAddr:any发送过网络包的情况下才可以通过eAddr:ePort给iAddr:iPort发送网络包,any这里指任意端口。(总结下来就是只有内部给外部主机发送过信息,才能通过外部地址端口往内部发送)。
Port-restricted cone(端口限制型锥型)
一旦一个内网地址(iAddr:iPort)被映射到一个外部网络地址(eAddr:ePort),任何iAddr:iPort的包都会通过eAddr:ePort来发送。但是一个外部的主机(hAddr:hPort)只有在iAddr:iPort之前给hAddr:hPort发送过网络包的情况下才可以通过eAddr:ePort给iAddr:iPort发送网络包,any这里指任意端口。和地址限制锥型差不多,只是还多了外部主机的端口的限制。
Symmetric(对称型)
每个从相同内部IP地址和端口到特定目标IP地址和端口的请求都会被映射到一个特殊的外部源IP地址和都端口上,如果相同的内部主机发送了包给相同的源地址和端口,但是是不同的目标,也会使用不同的映射。只有一个外部的主机从内部主机接收到过包,才能发送回去。
什么是STUN
STUN是指Session Traversal Utilities for NAT。是一个被NAT穿越算法用来协助发现网络环境信息的网络协议/包格式(IETF RFC 5389) 。发送方在发送服务器和发送客户端之间传输使用STUN包。
如果端之间的路由器使用了全锥型,限制型锥形、端口限制型锥型,那么就会发现一个单独STUN的直接连接。如果有有路由器使用了对称型NAT,那么只有在其他路由不用对称型或者端口限制型NAT的情况下才能发现一个STUN包的连接。但是不用担心!发送方会自动的发现一个替换TURN的路径。
什么是TURN
TURN是指Traversal Using Relays around NAT。就像STUN,它是一个被NAT穿越算法用来协助发现网络内终端直接连接路径的网络协议/包格式(IETF RFC 5766)。和STUN不同的是它用了一个公网的替换中介提换终端之间的包。当没有其他选择可用的时候,发送方使用TURN来交换流媒体包。因为它定制了服务资源所以也会因为这多的一步产生一定的延迟。
TURN只有在一个端使用了对称型NAT,并且其他的端使用了对称型NAT或者端口限制型NAT的时候才需要。
什么是ICE
ICE是指Interactive Connectivity Establishment。它定义了一个技术来使用SDP,STUN和TURN来发现网络里端之间的路径。发送方实现符合标准的ICE specification(IETF RFC 5245) ,就能兼容其他的端来实现同样的spec。
每个RTP包都有一个7位的payload类型(0-127)和一个二进制payload。payload类型用于区分payload的格式,并且在创建发送方连接的时候需要定义好。IANA留出了一些payload type用于特定的格式。如果你在用一个不被IANA识别的编码格式,那么根据他们的建议,最好用96-127中的数字。
发送方唯一的限制是payload类型72-76是留给RTCP的。这些payload类型不能被使用因为可能影响内部RTCP的处理流程。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。