webrtc一些笔记

基础框架

组成部分:

  1. Signalling,客户端session控制,网络和多媒体信息同步的机制。不是RTCPerrConnection API的一部分,用户可以根据需求自己定义和实现signalling,signalling主要用于三种类型的信息:

    • session控制消息:初始化或关闭 会话,还可以上报错误
    • 网络配置:通过signalling告诉 第三方(想和自己连接的Peer)自己的IP和Port
    • 多媒体文件处理能力:决定双方的多媒体文件的编码、解码格式。
  2. ICE framework 用于连接Peer(端点)间的互相连接.

  3. STUN 和 STUN协议的扩展 TURN协议,这个主要是ICE framework 用来支持 NAT穿透,使得 RTCPeerConnection 能够应对变幻莫测的网络环境。

stunlong-term credential mechanism 的key 可以通过coturnturnadmin -a -u username -p password -k获得,也就是说如果通过udp连接到coturn server则需要通过 long-term credential mechanism 来认证,下面的例子:

server:

1
turnserver  --user=ninefingers:0xbc807ee29df3c9ffa736523fb2c4e8ee --user=gorst:hero -r north.gov --cert=turn_server_cert.pem  --pkey=turn_server_pkey.pem --log-file=stdout -v --mobility --cipher-list=ALL $@

client 使用udp:

1
turnutils_uclient  -z 5 -n 10 -s -m 1 -l 170 -e 127.0.0.1 -X -g -u ninefingers -w youhavetoberealistic   $server_ip -v

client 使用tcp:

1
turnutils_uclient  -z 5 -n 10 -s -m 1 -l 170 -e 127.0.0.1 -X -g -u gorst -W hero  $server_ip -v

注意在server命令中 --user=ninefingers:0xbc807ee29df3c9ffa736523fb2c4e8ee--user=gorst:hero的不同。

简单的来说,stun 用来告诉client自身穿透nat之后的公网ip和端口是多少,而turn则是扩展了中继转发功能,turn具体流程如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
                                                            Peer A
                                       Server-Reflexive    +---------+
                                       Transport Address   |         |
                                       192.0.2.150:32102   |         |
                                           |              /|         |
                         TURN              |            / ^|  Peer A |
   Client’s              Server            |           /  ||         |
   Host Transport        Transport         |         //   ||         |
   Address               Address           |       //     |+---------+
  10.1.1.2:49721       192.0.2.15:3478     |+-+  //     Peer A
           |               |               ||N| /       Host Transport
           |   +-+         |               ||A|/        Address
           |   | |         |               v|T|     192.168.100.2:49582
           |   | |         |               /+-+
+---------+|   | |         |+---------+   /              +---------+
|         ||   |N|         ||         | //               |         |
| TURN    |v   | |         v| TURN    |/                 |         |
| Client  |----|A|----------| Server  |------------------|  Peer B |
|         |    | |^         |         |^                ^|         |
|         |    |T||         |         ||                ||         |
+---------+    | ||         +---------+|                |+---------+
               | ||                    |                |
               | ||                    |                |
               +-+|                    |                |
                  |                    |                |
                  |                    |                |
            Client’s                   |            Peer B
            Server-Reflexive    Relayed             Transport
            Transport Address   Transport Address   Address
            192.0.2.1:7000      192.0.2.15:50000     192.0.2.210:49191

在上图中,左边的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,这和上述规则是并不矛盾的。

通信过程:

参考:
P2P通信标准协议(二)之TURN
the-basic-p2p-communication-process