aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/api/webrtc_api/protocols/index.html
blob: a4304e290bfc9367c03bf503a1f5d129753bd3ca (plain)
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
---
title: WebRTC 协议介绍
slug: Web/API/WebRTC_API/Protocols
tags:
  - API
  - ICE
  - NAT
  - SDP
  - STUN
  - WebRTC
  - 初学者
  - 向导
  - 媒体
  - 视频
  - 音频
translation_of: Web/API/WebRTC_API/Protocols
---
<p>{{WebRTCSidebar}}{{draft}}</p>

<p>本文介绍了基于WebRTC API构建的协议。</p>

<h2 id="ICE">ICE</h2>

<p>交互式连接设施<a href="http://en.wikipedia.org/wiki/Interactive_Connectivity_Establishment">Interactive Connectivity Establishment (ICE)</a> 是一个允许你的浏览器和对端浏览器建立连接的协议框架。在实际的网络当中,有很多原因能导致简单的从A端到B端直连不能如愿完成。这需要绕过阻止建立连接的防火墙,给你的设备分配一个唯一可见的地址(通常情况下我们的大部分设备没有一个固定的公网地址),如果路由器不允许主机直连,还得通过一台服务器转发数据。ICE通过使用以下几种技术完成上述工作。</p>

<h2 id="STUN">STUN</h2>

<p>NAT的会话穿越功能<a href="http://en.wikipedia.org/wiki/STUN">Session Traversal Utilities for <u>NAT</u> (STU<u>N</u>)</a> (缩略语的最后一个字母是NAT的首字母)是一个允许位于NAT后的客户端找出自己的公网地址,判断出路由器阻止直连的限制方法的协议。</p>

<p>客户端通过给公网的STUN服务器发送请求获得自己的公网地址信息,以及是否能够被(穿过路由器)访问。</p>

<p><img alt="An interaction between two users of a WebRTC application involving a STUN server." src="https://mdn.mozillademos.org/files/6115/webrtc-stun.png" style="display: block; height: 378px; margin: 0px auto; width: 259px;"></p>

<h2 id="NAT">NAT</h2>

<p>网络地址转换协议<a href="http://en.wikipedia.org/wiki/NAT">Network Address Translation (NAT)</a> 用来给你的(私网)设备映射一个公网的IP地址的协议。一般情况下,路由器的WAN口有一个公网IP,所有连接这个路由器LAN口的设备会分配一个私有网段的IP地址(例如192.168.1.3)。私网设备的IP被映射成路由器的公网IP和唯一的端口,通过这种方式不需要为每一个私网设备分配不同的公网IP,但是依然能被外网设备发现。</p>

<p>一些路由器严格地限定了部分私网设备的对外连接。这种情况下,即使STUN服务器识别了该私网设备的公网IP和端口的映射,依然无法和这个私网设备建立连接。这种情况下就需要转向TURN协议。</p>

<h2 id="TURN">TURN</h2>

<p>一些路由器使用一种“对称型NAT”的NAT模型。这意味着路由器只接受和对端先前建立的连接(就是下一次请求建立新的连接映射)。</p>

<p>NAT的中继穿越方式<a href="http://en.wikipedia.org/wiki/TURN">Traversal Using Relays around NAT (TURN)</a> 通过TURN服务器中继所有数据的方式来绕过“对称型NAT”。你需要在TURN服务器上创建一个连接,然后告诉所有对端设备发包到服务器上,TURN服务器再把包转发给你。很显然这种方式是开销很大的,所以只有在没得选择的情况下采用。</p>

<p><img alt="An interaction between two users of a WebRTC application involving STUN and TURN servers." src="https://mdn.mozillademos.org/files/6117/webrtc-turn.png" style="display: block; height: 297px; margin: 0px auto; width: 295px;"></p>

<h2 id="SDP">SDP</h2>

<p>会话描述协议<a href="http://en.wikipedia.org/wiki/Session_Description_Protocol">Session Description Protocol (SDP)</a> 是一个描述多媒体连接内容的协议,例如分辨率,格式,编码,加密算法等。所以在数据传输时两端都能够理解彼此的数据。本质上,这些描述内容的元数据并不是媒体流本身。</p>

<p>从技术上讲,SDP并不是一个真正的协议,而是一种数据格式,用于描述在设备之间共享媒体的连接。</p>

<p>记录SDP远远超出了本文档的范围。但是,这里有几件事值得注意。</p>



<h3 id="结构体">结构体</h3>

<p>SDP由一行或多行UTF-8文本组成,每行以一个字符的类型开头,后跟等号(“ =”),然后是包含值或描述的结构化文本,其格式取决于类型。以给定字母开头的文本行通常称为“字母行”。例如,提供媒体描述的行的类型为“ m”,因此这些行称为“ m行”。</p>

<h3 id="获取更多信息">获取更多信息</h3>

<p>要了解有关SDP的更多信息,请参见以下有用的资源:</p>

<ul>
 <li>规范: {{RFC(4566, "SDP: Session Description Protocol")}}</li>
 <li><a href="https://www.iana.org/assignments/sip-parameters/sip-parameters.xhtml">IANA registry of SDP parameters</a></li>
</ul>



<div id="gtx-trans" style="position: absolute; left: 428px; top: 2741px;">
<div class="gtx-trans-icon"></div>
</div>