VoIP
Section outline
-
///////////////////////////////////////
基于IP的语音(VoIP)
VoIP(Voice over IP,语音传输协议)是指通过IP网络传输语音电话和多媒体数据的技术。
电路交换与分组交换
电路交换电话网络 在传统的电路交换电话网络(POTS)中,语音是通过分配静态电路传输的,语音以64 Kbps的比特率进行采样(根据采样定理)。使用这种网络存在一些限制:
- 无压缩:由于每个电话通话分配了64千比特的带宽,压缩数据是没有意义的;
- 必须分配整数个电路:以支持多媒体或多信道通信;
- 无静音抑制:即使在停顿时,语音样本也会被传输,电路继续占用;
- 无统计复用:无法根据多个通话的当前需求动态共享带宽;
- 信令程序:需要用于电路分配(例如响铃音、忙音、空闲音等)。
分组交换数据网络 在分组交换数据网络(IP网络)中,语音通过数据包动态传输,这使得一些新特性成为可能:
- 更好的压缩:减少数据包的数量;
- 高质量通信:比特率不再限制为64 Kbps;
- 静音抑制:停顿期间不会传输数据包;
- 统计复用:带宽分配更为灵活;
- 无需静态资源分配:信令程序不再分配静态资源;
- 灵活性:用户在移动时,仍可以通过相同的电话号码或账户联系。
然而,引入了一个新问题:在分组交换网络中,无法真正保留资源 → 很难保证语音通话的服务质量,因为数据包可能会有延迟或丢失:
- 延迟:国际电信联盟(ITU)定义了一些端到端延迟的参考值:
- 0-150毫秒:对人耳来说是可以接受的;
- 150-400毫秒:仅对跨洲通话可接受;
-
400毫秒:不可接受,会影响通话质量;
- 丢包:人耳可以容忍最多5%的丢包率而不会有明显问题。
TCP与UDP
UDP和TCP数据包(理论上)会同时到达接收方,唯一的区别是TCP必须等待确认数据包 → 因此UDP是最自然的选择。实际上,Skype通常使用TCP,因为它能够更容易穿越NAT和防火墙,尽管有时会因滑动窗口机制发生短暂的静音。
从电路交换到分组交换的迁移
传统的电路交换网络(POTS)可以逐步迁移到基于IP的分组交换网络:
- 基于电话的IP网络(ToIP):网络边缘的终端仍以电路交换方式工作,但网络骨干基于IP并内部执行数据包化处理 → VoIP的使用对用户是透明的,额外的多媒体服务对终端用户不可用。
- 新的电信运营商可以将其电话网络建设为ToIP网络 → 电信运营商可以通过构建和维护单一的集成基础设施节省成本;
- 混合网络:部分终端为VoIP,部分仍为传统终端;
- IP网络:所有终端均为VoIP,但智能网络服务(例如免付费电话)仍为传统形式,因为它们工作得非常好,网络运营商不愿意进行现代化改造;
- 仅IP网络:所有终端均为VoIP,所有智能网络服务也都通过IP工作。
网关
网关是一种设备,用于将POTS网络与IP网络连接起来。它由三个组件组成:
- 媒体网关:能够将POTS网络中的语音样本转换为IP网络中的数据包,反之亦然;
- 信令网关:能够将POTS网络中的信号音转换为IP网络中的信令数据包,反之亦然;
- 网关控制器:负责监督和监控整个网关,控制流量质量,执行授权和认证(如计费),定位目的地等。仅网关控制器在仅IP网络中仍然有用。
VoIP流程的创建步骤
发送端:
接收端应该执行以下步骤:
- 采样
- 编码
- 数据包化
- 排队
- 传输
采样 采样将模拟信号的语音转换为数字样本。采样具有灵敏度(比特数)、采样频率(赫兹=1/秒)和理论比特率(比特/秒)等特征。
编码 编码技术用于减少比特率,但它们可能由于编码算法引入额外的延迟。
主要的编码技术有:
- 差分编码:每个样本是基于与前一个样本或后一个样本的差异来编码的;
- 加权编码:在视频通话中,与周围环境相比,应该对说话者的图像使用更高的比特率进行编码;
- 有损编码:一些音频和视频信息会被不可逆地移除(可能质量的损失不会被人耳察觉)。
当编码算法必须在移动终端(如嵌入式系统或低功耗设备)上执行时,复杂性是一个重要问题。此外,一些服务不支持有损压缩编码的数据:例如,传真不支持质量损失。因此,电信运营商仍然倾向于使用PCM64编解码器,它具有恒定的64 Kbps比特率:这种方式需要较少的处理功率,并且传真和其他电话网络服务也支持这种方式。
说话者的声音,在通过接收端扬声器后,可能会通过接收端麦克风反向传回,并在经过一段时间的延迟后传输到发射端扬声器,这种延迟叫做回程延迟,如果延迟显著,可能会干扰说话者本人 → 回声消除技术旨在避免说话者听到自己的声音。
数据包化
数据包化延迟取决于每个数据包插入的样本数,这是延迟与效率之间的权衡:
- 延迟:如果在一个数据包中插入太多样本,数据包就需要等到最后一个样本才会发送 → 如果太多样本被打包在一起,第一个样本的到达将会有显著延迟;
- 效率:每个IP数据包都有由其头部带来的大小开销 → 如果数据包中插入的样本过少,头部开销将显著增加比特率。
一些基于冗余的错误校正技术可能会被采用:每个数据包不仅携带当前样本,还携带前一个样本,这样如果前一个数据包丢失,仍然可以恢复该样本。
排队
当输入流量超过输出链路的容量时,路由器应该存储等待传输的数据包(缓冲) → 这会增加延迟和抖动。优先级队列管理可以解决这些问题:计算机网络技术与服务/服务质量。
传输
为减少传输延迟,可以考虑以下解决方案:
- 增加带宽,但ADSL提供商通常更关注增加下行带宽;
- 使用PPP交织,即将一个大帧拆分为多个小的PPP帧,但并非所有提供商都实现了PPP交织;
- 在语音通话期间避免使用其他应用程序(如数据传输)。
接收端
接收端应该执行以下步骤:
- 去抖动:去抖动模块应以生成语音时使用的相同速度播放数据包;
- 重新排序:由于是分组交换,网络可能会传递乱序的数据包 → 需要一个模块来重新排序;
- 解码:解码算法应实施一些技术:
- 丢失的数据包应使用预测技术进行处理,通过插入白噪声或播放最后一个接收到的数据包的样本来填补;
- 静音抑制:接收方在对话的停顿期间引入白噪声,因为完美的静音会被用户感知为通话故障。重要的是,能够在说话者恢复讲话时立即停止白噪声。
RTP(实时传输协议)
RTP用于通过UDP传输VoIP流。
特性
-
本地多播传输
RTP允许即使在不支持多播的网络上进行多播传输。实际上,IP支持多播,但它要求网络提供商配置其网络设备以创建每个VoIP流的多播组 → RTP允许在应用层上以即插即用的方式进行数据多播,而无需网络提供商干预。 -
只包含基本特性
RTP不指定应该由底层协议管理的特性,如数据包碎片化和传输错误检测(校验和)。 -
数据格式独立性
RTP只包括“Payload Type”(有效负载类型)字段,以指定数据包内容的类型和所使用的编解码器,但不指定如何编码数据以及使用哪些编解码器(这些信息由“音视频配置文件”文档单独指定)。不能将世界上每个编解码器与一个代码关联 → 发送方和接收方应在会话设置期间就使用的编解码器代码达成一致,并且这些代码仅在该会话内有效。 -
实时数据传输
丢包是允许的 → “序列号”和“时间戳”字段组合在一起,以便在丢包的情况下,在正确的时间点重新启动音频/视频的播放。 -
流区分
多媒体会话需要为每个多媒体流(音频、视频、白板等)打开一个RTP会话,即一个UDP连接。
RTP控制协议(RTCP)
RTCP用于执行连接监控和控制:接收端收集一些统计数据(例如丢包、延迟等信息),并定期将其发送给源端,以便源端根据当前网络能力调节多媒体流的质量,从而尽可能确保服务的正常运行。例如,接收方可以判断某个编解码器的比特率过高,超出了网络的支持能力,因此可以切换到比特率较低的编解码器。
非标准端口
RTP没有定义标准端口 → 由于没有固定的端口,RTP数据包很难被防火墙和服务质量管理工具检测到。然而,一些实现使用静态端口范围,以避免在防火墙上打开过多端口,并简化服务质量的标记。
多播传输
传统方案
单播主机:
发送方:N-1流;接收方:N-1流;多播主机:
发送方:1流;接收方:N-1流。没有RTP混音器的传统解决方案始终需要所有主机具有较高的带宽能力。在WebRTC上下文中,这种模式称为选择性转发单元(SFU)。
RTP混音器
RTP混音器是一种能够操控RTP流进行多播传输的设备:例如,在视频会议中,混音器会将来自其他主机的流混合成一条流,发送给每个主机。
带有混音器的单播主机:
发送方:1流;接收方:1流。每个主机传输和接收单一流
每个主机仅传输和接收一个流 → 混音器用于节省带宽:即使是带宽较低的主机也可以加入视频会议。混音器应该是具有最高带宽能力的主机,以便能够接收来自其他主机的所有流,并将所有流传输给其他主机。在WebRTC中,这种模式被称为多点控制单元(MCU)。
RTP头部
RTP头部具有以下格式:
2 3 4 8 9 16 32 V P X CC M Payload Type Sequence Number Timestamp Synchronization source identifier (SSRC) Contributing source identifier (CSRC) ::: 其中,最重要的字段是:
- CSRC Count (CC) 字段(4位):指定“CSRC”字段中的标识符数量;
- Marker (M) 标志(1位):用于标记数据包的优先级,表示高优先级或低优先级,以便进行服务质量管理;
- Payload Type (PT) 字段(7位):指定数据包有效负载的类型,通常包含与所使用编解码器对应的代码;
- Synchronization source identifier (SSRC) 字段(32位):标识RTP混音器(例如,下面的混音器M);
- Contributing source identifier (CSRC) 字段(可变长度):标识为多播流做出贡献的多个源(例如,下面的源S1、S2、S3)。
示例:来自源S1、S2、S3的语音被混合成一个流,传送到目标D。
H.323
H.323是由ITU标准化的一种应用层信令协议套件。它是一个非常复杂的标准,因为它继承了电信运营商的逻辑。
H.323网络组件
H.323网络示例。H.323最初是为了允许连接到公司局域网(LAN)的主机与通过传统电路交换网络(PSTN)连接的远程设备进行通信(音频、视频、共享白板等)而开发的:
- Gatekeeper:实现网关控制器,负责认证和定位用户,记录注册用户等;
- Proxy Gatekeeper:客户端通过代理网关与网关联系 → 这减少了低功耗客户端设备的工作量,但不是强制性的;
- Multipoint Control Unit (MCU):实现RTP混音器;
- Gateway:实现信令网关和媒体网关,翻译数据通道、控制通道和信令程序,连接局域网和PSTN,且在局域网中视为H.323终端,在PSTN中视为电话终端。
后来,H.323标准被扩展到广域网(WAN),使得通过互联网与远程用户的通信成为可能。
Gatekeeper的区域
Gatekeeper的区域由它管理的终端集合组成。一个区域可能涉及多个网络层,例如多个通过路由器隔开的局域网。
H.323协议架构
H.323 protocol stack.Block diagram of an H.323 terminal.H.323协议栈比较复杂,因为它由多个协议组成:
- 数据平面:包括RTP和RTCP协议,位于UDP上;
- 控制平面:包括位于TCP/UDP上的信令协议:
- RAS控制器:允许终端与Gatekeeper交换控制消息:
- 注册消息:终端请求Gatekeeper加入区域;
- 许可消息:终端请求Gatekeeper联系另一个终端;
- 状态消息:终端告诉Gatekeeper自己是否处于活动状态;
- 带宽消息:RAS控制器通知Gatekeeper带宽变化,以便在链路过载时拒绝新的呼叫;
- Call控制器:允许终端与另一个终端交换控制消息;
- H.245控制器:允许两个终端协商编解码器等参数;
- 数据控制:允许终端发送控制消息用于桌面共享或其他多媒体数据流。
- RAS控制器:允许终端与Gatekeeper交换控制消息:
最终,H.225层将所有消息组合在一起:它创建一种可靠的虚拟隧道,允许通过不可靠的IP网络发送H.323消息,模拟电路的可靠性。
地址分配
每个终端通过一个**(IP地址, TCP/UDP端口)**对唯一标识,因此可以通过地址/端口对直接联系,无需通过Gatekeeper。
如果存在Gatekeeper,地址/端口对可以映射为更容易记住的别名(例如,name@domain.com、E-164电话号码、昵称)。由于这些别名与用户账户相关联,它们启用了便携性:用户即使更改IP地址,仍然可以通过同一号码联系到他。
H.323呼叫的主要步骤
H.323呼叫包括六个主要步骤:
- 注册:呼叫方终端在其区域内查找Gatekeeper,并通过RAS控制建立RAS通道;
- 呼叫设置:呼叫方终端通过Call控制与被呼叫方终端建立通道;
- 协商:使用H.245控制协议协商带宽和编解码器等参数;
- 数据传输:通过RTP传输语音;
- 关闭:使用H.245控制协议关闭数据通道;
- 拆除:使用RAS控制协议关闭RAS通道。
Gatekeeper可以扮演两个角色:
- Gatekeeper路由呼叫:呼叫总是通过Gatekeeper进行 → 这对于NAT穿越很有用:Gatekeeper充当中继服务器;
- Gatekeeper直接端点:呼叫直接到达端点,但首先呼叫方和被呼叫方客户端应与Gatekeeper进行许可步骤,用于计费和带宽管理。
主要问题与批评
- H.323标准未提供容错支持,因为它仅考虑了单一的Gatekeeper → 各个厂商开发了自己的定制功能来提供此类功能,但它们彼此之间不兼容;
- H.323标准不支持不同区域之间的通信 → 一家公司无法与另一家公司合并其区域;
- 消息使用ASN.1格式进行编码:这种格式非文本,因此调试非常困难,并且需要处理低级别的机器细节(例如,小端存储);
- 协议栈由多个协议组成,每个功能对应一个协议。
SIP(会话发起协议)
SIP(Session Initiation Protocol)是一个由IETF通过RFC标准化的应用层信令协议。如今,SIP的普及速度远超过H.323,主要得益于其遵循互联网哲学(“保持简单”)的方式:例如,它使用基于文本的方式(如HTTP),因此编码容易理解。SIP的交互方式是客户端-服务器。
特性
SIP protocol stack.SIP协议栈。
SIP协议栈比H.323的协议栈更简洁,因为SIP在控制平面中只有一个通用层。SIP仅涵盖信令功能:它将与信令无关的方面,如带宽管理,交给其他已有协议,从而减少了设计的复杂性:
- RTP/RTCP:用于传输和控制多媒体流;
- SDP:用于通知多媒体流的控制信息;
- RTSP(实时流协议):类似RTP的协议,用于处理实时流和其他类型的资源(例如,为语音邮件快速转发已录制的语音消息);
- RSVP:用于在IP网络上保留资源,尝试在分组交换网络上构建类似电路交换网络的机制。
SIP可以在以下三种可能的传输层中运行:
- UDP:无需维持TCP连接,适用于低功耗设备;
- TCP:提供更多可靠性,适用于NAT穿越和穿越防火墙;
- TLS(带SSL的TCP):消息加密以提高安全性,但会丧失文本消息的优点。
SIP为语音通话提供一些主要服务:
- 用户定位:定义呼叫的目标终端;
- 用户容量:定义所使用的媒体(音频、视频等)和参数(编解码器);
- 用户可用性:定义被呼叫方是否愿意接听电话;
- 呼叫设置:建立连接并设置所有参数;
- 呼叫管理。
SIP信令不仅可用于语音呼叫,还可用于多种附加服务:电子出席(用户状态:可用、忙碌等)、即时消息、白板共享、文件传输、互动游戏等。SIP支持便携性:每个用户都有一个与其关联的帐户,因此即使用户移动并更改IP地址,仍然可以联系到他。
SIP网络组件
- 终端:每个主机既是客户端又是服务器(为了使其可达)。
- 注册服务器:负责跟踪主机与IP地址之间的映射。它实现了Gatekeeper:主机必须注册才能进入SIP网络。
- 代理服务器:管理主机与其他服务器之间消息的交换。主机可以选择仅与代理服务器通信,将SIP呼叫所需的所有任务委托给代理服务器。
- 重定向服务器:用于重定向来电(例如,用户只希望在工作时间接听工作手机)。
- 媒体服务器:用于存储增值内容(例如,语音信箱)。
- 媒体代理:可以作为防火墙穿越的中继服务器。
- 位置服务器:用于定位用户。当主机想要拨打电话时,首先请求位置服务器查找目标用户地址。
- AAA服务器(认证、授权、计费):注册服务器与AAA服务器交换消息以验证用户(例如,检查用户是否有权限进入网络)。
- 网关:连接IP网络和PSTN网络,通过转换SIP数据包和样本,进行双向通信。
- Multipoint Control Unit (MCU):实现RTP混音器,功能与H.323中的相同。
在许多情况下,一台机器(称为SIP服务器或SIP代理)实现了注册服务器、代理服务器、重定向服务器和媒体代理的功能。此外,位置服务器通常位于DNS服务器中,AAA服务器通常位于企业的AAA服务器中。
计费和域
每个用户都有一个SIP帐户,因此即使他移动并更改IP地址,仍然可以联系到他(便携性)。帐户地址的格式为
username@domain.com
;电话终端也可以具有SIP地址,格式为telephone_number@gateway
。SIP网络具有分布式架构:每个SIP服务器负责一个SIP域(相当于H.323中的区域),所有引用同一SIP服务器的主机属于同一SIP域,并且在其帐户地址中具有相同的域名。与H.323不同,SIP用户可以联系属于其他SIP域的用户:他们的SIP服务器将负责与另一个用户的SIP服务器进行通信。
假设一个属于Verizon域的美国用户移居意大利并连接到Telecom Italia网络。为了保持可达性,他需要联系Verizon SIP服务器进行注册,但他正在使用Telecom Italia的网络基础设施 → 他需要通过Telecom Italia SIP服务器(作为出站代理服务器)进行漫游服务,从而Telecom Italia可以跟踪该用户的通话进行计费。
域间互联
为了互联不同的域,需要确保所有的注册服务器可以被找到,因为它们存储着账户别名和IP地址之间的映射 → 在DNS服务器中需要两个附加记录来定位注册服务器:
- NAPTR记录:定义指定域可以使用的传输协议,指定用于SRV查询的别名;
- SRV记录:指定注册服务器的别名,用于A/AAAA查询,并指定指定传输协议的端口;
- A/AAAA记录:指定指定注册服务器别名的IPv4/IPv6地址。
DNS记录表可能包含多个SRV/NAPTR记录:
- 多个NAPTR记录:指定传输协议可用的多个注册服务器,“Preference”字段指定首选顺序;
- 多个SRV记录:指定可用的多个传输协议,“Priority”字段指定顺序(优先顺序为:TLS/TCP、TCP、UDP)。
SIP协议相关内容
可能不包含SRV/NAPTR记录:
- 没有NAPTR记录:主机仅尝试SRV查询(通常是UDP),并使用第一个SRV响应对应的传输协议;
- 没有SRV记录:注册服务器的地址必须静态配置在主机上,主机将使用标准端口5060。
ENUM标准
如何在传统电话上输入账户地址以联系SIP用户?每个SIP账户默认关联一个称为E.164地址的电话号码:
- 用户在传统电话上输入电话号码;
- POTS网络与SIP网络之间的网关将电话号码转换为带有固定域名
e164.arpa
的别名,并查询DNS以检查是否存在NAPTR记录:- 如果DNS服务器找到NAPTR记录,则电话号码与SIP账户相关联,呼叫将被转发到目标SIP代理;
- 如果DNS服务器未找到NAPTR记录,则该电话号码对应POTS网络中的用户。
SIP消息
每个SIP消息具有以下文本格式:
- 消息类型(一行):指定消息类型;
- SIP头:包含有关多媒体流的信息;
- 空行(类似HTTP的行为);
- SDP消息(有效载荷):包含有关多媒体流的控制信息。
主要消息类型
SIP消息可以是以下几种类型之一,包括:
- REGISTER消息:用于向域注册,可以通过多播发送到所有注册服务器;
- INVITE消息:用于建立电话呼叫;
- ACK消息:这是SIP消息中的最后一条消息,标志着RTP流的开始;
- BYE消息:用于结束电话呼叫;
- CANCEL消息:用于取消挂起的呼叫设置请求;
- SUBSCRIBE, NOTIFY, MESSAGE消息:用于电子出席和即时消息;
- 代码消息:包括:
- 1xx = 临时代码:指示操作正在进行中(例如,100 Trying,180 Ringing);
- 2xx = 成功代码:指示成功的操作(例如,200 OK);
- 4xx = 客户端错误代码:指示错误的操作(例如,401 Unauthorized)。
SIP头中的主要字段
SIP头可以包含多个字段,包括:
- From字段:包含希望发起呼叫的终端的SIP地址;
- To字段:包含呼叫者希望联系的终端的SIP地址;
- Contact字段:SIP服务器用于指定被呼叫方终端的IP地址,呼叫者终端可以直接联系被呼叫方终端;
- Via字段:用于跟踪消息应该通过的所有SIP服务器(例如,出站代理服务器);
- Record Routing字段:指定是否所有SIP消息都应该通过代理服务器,这对于NAT穿越非常有用;
- Subject字段:包含SIP连接的主题;
- Content-Type、Content-Length、Content-Encoding字段:包含关于有效载荷类型(例如SDP的MIME格式)、长度(以字节为单位)和编码的信息。
SDP
SDP(会话描述协议)是一种基于文本的协议,用于描述多媒体会话:包括多媒体流的数量、媒体类型(音频、视频等)、编解码器、传输协议(例如RTP/UDP/IP)、带宽、地址和端口、每个流的开始/结束时间、源标识等。
SDP包含在SIP数据包的有效载荷中,用于通知有关多媒体流的控制信息(例如,携带电话呼叫邀请消息的SIP消息也需要通知使用哪个编解码器)。由于SDP设计于较早时,因此它包含一些对于SIP来说没有用的特性(例如每个流的开始/结束时间),但是SIP只是直接采用了SDP,而没有对其做任何修改以便重用现有软件。
SDP消息格式
每个SDP消息由一个会话部分和一个或多个媒体部分(每个多媒体流一个)组成:
- 会话部分:以
v=
开始,包含当前会话中所有多媒体流的参数; - 媒体部分:以
m=
开始,包含当前多媒体流的参数。
SIP呼叫过程的步骤
SIP呼叫分为四个步骤:
- 注册:呼叫者终端向域进行注册;
- 邀请:呼叫者终端请求建立呼叫;
- 数据传输:通过RTP传输语音;
- 拆除:结束呼叫。
注册步骤
用户代理A希望通过联系其SIP代理将自己注册到域A:
- DNS查询与回复(NAPTR、SRV、A/AAA):A向DNS服务器查询SIP代理的IP地址;
- REGISTER消息:A请求SIP代理进行注册,但此时未插入密码;
- 401 Unauthorized消息:SIP代理要求进行身份验证,插入一个每次注册都会变化的挑战;
- REGISTER消息:A基于挑战和密码计算哈希值,并将结果发送到SIP代理;
- 200 OK消息:注册服务器检查挑战的回复并授予用户访问权限。
邀请步骤
用户代理A希望通过B的SIP代理与用户代理B建立呼叫:
- A请求其SIP代理联系B,向其发送INVITE消息;
- A的SIP代理执行DNS查询以查找B的SIP代理IP地址(NAPTR、SRV、A/AAA);
- A的SIP代理向B的SIP代理发送INVITE消息;
- B的SIP代理向B发送INVITE消息;
- B通过SIP代理发送RINGING消息给A,使A的电话响铃;
- B接受呼叫,通过SIP代理发送OK消息给A;
- A通过SIP代理或直接根据Record Routing字段的值,通知B其已收到OK消息。
拆除步骤
通话结束后,在关闭RTP流后:
- BYE消息:B通知A希望结束通话;
- OK消息:A通知B已收到BYE消息。