计算机网络技术与服务/VoIP
语音 over IP (VoIP) 是一套通过 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 的分组交换网络
- 电话 over IP(ToIP)网络:网络边缘的终端仍然以电路交换的方式工作,但网络骨干基于 IP,并在内部执行分组化→由于 VoIP 使用对用户是隐藏的,因此最终用户无法使用其他多媒体服务。
新的电信运营商可以将其电话网络构建为基于 ToIP 的网络→电信运营商可以通过构建和维护单个集成基础设施来节省资金; - 混合网络:一些终端是 VoIP,另一些仍然是传统的;
- IP 网络:所有终端都是 VoIP,但智能网络服务(例如免费电话号码)仍然是传统的,因为它们运行良好,网络运营商不愿对其进行现代化改造;
- 仅 IP 网络:所有终端都是 VoIP,所有智能网络服务都通过 IP 工作。
网关是一种允许将 POTS 网络连接到 IP 网络的设备。它由三个组件组成
- 媒体网关:它能够将来自 POTS 网络的语音样本转换为 IP 网络的数据包,反之亦然;
- 信令网关:它能够将来自 POTS 网络的信令音转换为 IP 网络的信令数据包,反之亦然;[1]
- 网关控制器:负责监督和监控整个网关,通过控制流量质量、执行授权、执行身份验证(计费)、查找目标等。
- 网关控制器本身在仅 IP 网络中仍然有用。
接收方应执行以下步骤
- 采样
- 编码
- 分组化
- 排队
- 传输
采样允许将语音从模拟信号转换为数字样本。采样以灵敏度(比特)、采样频率(赫兹=1/秒)和理论比特率(比特/秒)为特征。
编码技术可以降低比特率,但由于编码算法可能会引入额外的延迟。
主要的编码技术包括:
- 差分编码:每个样本的编码基于其与前一个样本和/或后一个样本的差异;
- 加权编码:在视频通话过程中,应以比周围环境更高的比特率对通话者的图像进行编码;
- 有损编码:一些音频和视频信息被不可逆地去除(可能质量损失不会被人感官察觉)。
当编码算法需要在移动终端(例如嵌入式系统或性能不佳的低功耗设备)上执行时,复杂度是一个重要问题。此外,一些服务不支持有损压缩编码的数据:例如,传真不支持质量损失。这就是电信运营商仍然更喜欢使用 PCM64 编解码器,其比特率恒定为 64 Kbps 的原因:它所需的处理能力较低,并且也受传真和其他使用电话网络的服务支持。
说话者的声音,在离开接收器扬声器后,可能会通过接收器麦克风返回到发射器扬声器,并产生称为往返延迟的延迟,如果延迟时间较长,可能会干扰说话者本人 → 回声消除旨在避免说话者听到自己的声音。
分组化延迟取决于插入每个数据包的样本数量,这需要在延迟和效率之间进行权衡。
- 延迟:如果在一个数据包中放入太多样本,则该数据包必须等待最后一个样本到达才能发送 → 如果将太多样本分组在一起,则第一个样本将以较大的延迟到达;
- 效率:每个 IP 数据包由于其报头而导致大小开销 → 如果将太少的样本分组在一起,则由于报头开销,比特率将显著增加。
可以考虑一些基于冗余的纠错技术:每个数据包除了携带新样本外,还携带前一个样本,因此如果前一个数据包丢失,仍然可以恢复其样本。
当输入流量超过输出链路容量时,路由器应存储等待传输的数据包(缓冲)→ 这会增加延迟和抖动。优先级队列管理解决了这些问题: 计算机网络技术和服务/服务质量。
为了减少传输延迟,有一些可能的解决方案:
- 增加带宽,但 ADSL 提供商通常更感兴趣的是仅增加下行带宽;
- 使用 PPP 交错,即将一个大帧分成几个较小的 PPP 帧,但提供商并不总是实现 PPP 交错;
- 避免在语音通话期间使用其他应用程序(例如数据传输)。
接收方应执行以下步骤
- 抖动消除:抖动消除模块应以与生成它们相同的速率播放数据包;
- 重新排序:由于网络是分组交换的,因此可能会乱序交付数据包 → 需要一个模块进行重新排序;
- 解码:解码算法应实现一些技术:
- 丢失的数据包应通过使用预测技术、插入白噪声或播放来自最后一个接收到的数据包的样本进行管理;
- 静音抑制:接收器在对话暂停期间引入白噪声,因为完美的静音会被用户感知为呼叫故障。重要的是能够在说话者恢复说话时立即停止白噪声。
实时传输协议(RTP)用于通过 UDP 传输 VoIP 流。
- 原生组播传输
RTP 允许在不支持组播的网络上进行组播传输。
实际上,IP 确实支持组播,但其使用需要网络提供商配置其网络设备以创建每个 VoIP 流的组播组 → RTP 允许在应用层以即插即用的方式进行数据组播,而无需网络提供商的干预。
- 仅基本特性
RTP 没有指定应该由底层管理的特性,例如数据包分片和传输错误检测(校验和)。
- 数据格式独立性
RTP 只包含“有效负载类型”字段来指定数据包内容的类型和使用的编解码器,但它没有指定如何编码数据以及使用哪些编解码器(此信息由“音频视频配置文件”文档单独指定)。
不可能将世界上每个编解码器都与一个代码关联 → 发射机和接收机应在会话建立期间商定要使用的代码以识别编解码器,并且这些代码仅在会话内有效。
- 实时数据传输
允许丢失数据包 → “序列号”和“时间戳”字段结合起来,以便在数据包丢失的情况下在正确的时间点重新启动音频/视频播放。
- 流区分
多媒体会话需要为每个多媒体流(音频、视频、白板等)打开一个 RTP 会话,即一个 UDP 连接。
- RTP 控制协议 (RTCP)
它执行连接监视和控制:目标收集一些统计信息(有关丢失、延迟等的信息),并定期将其发送到源,以便后者可以降低或提高多媒体流的质量,以使服务尽可能根据当前网络功能工作。例如,接收器可以理解某个编解码器的比特率过高,网络不支持,因此可以更改为比特率较低的编解码器。
- 非标准端口
RTP 没有定义标准端口 → 防火墙和服务质量难以检测 RTP 数据包。但是,某些实现使用静态端口范围,以避免在防火墙上打开太多端口,并使服务质量标记更容易。
没有 RTP 混合器的传统解决方案始终需要所有主机都具有高带宽能力。在 WebRTC 上下文中,此模式称为选择性转发单元 (SFU)。
RTP 混合器是一种能够操作 RTP 流以进行组播传输的设备:例如,在视频会议中,每个主机的混合器接收来自其他主机的流,并将它们混合成一个流发送到该主机。
每个主机发送和接收一个单一的数据流 → 混合器有助于节省带宽:即使是带宽较低的主机也可以加入视频会议。混合器应该是具有最高带宽容量的主机,以便能够接收来自其他所有主机的流并将其发送到其他所有主机。在 WebRTC 中,这种模式被称为多点会议单元 (MCU)。
RTP 头部具有以下格式
2 | 3 | 4 | 8 | 9 | 16 | 32 |
V | P | X | CC | M | 有效载荷类型 | 序列号 |
时间戳 | ||||||
同步源标识符 (SSRC) | ||||||
贡献源标识符 (CSRC) :: |
其中最重要的字段是
- CSRC 计数 (CC) 字段 (4 位):它指定“CSRC”字段中标识符的数量;
- 标记 (M) 标志 (1 位):用于将数据包标记为高优先级或低优先级以进行服务质量;
- 有效载荷类型 (PT) 字段 (7 位):它指定数据包有效载荷的类型;它通常包含与所用编解码器相对应的代码;
- 同步源标识符 (SSRC) 字段 (32 位):它标识 RTP 混合器(以下示例中的混合器 M);
- 贡献源标识符 (CSRC) 字段(可变长度):它标识对多播流有贡献的多个源(以下示例中的源 S1、S2、S3)。
H.323 是 ITU 标准化的应用层信令协议套件。这是一个非常复杂的标准,因为它继承了电话运营商的逻辑。
H.323 最初是为了允许连接到公司局域网[2]的主机与连接到传统电路交换网络 (PSTN) 的远程设备之间的通信(音频、视频、共享白板等)而开发的。
- 网守:它实现了网关控制器,负责用户身份验证和定位、跟踪已注册用户等;[3]
- 代理网守:客户端通过代理网守间接联系网守 → 这减少了低功耗客户端设备的工作量,但不是强制性的;
- 多点控制单元 (MCU):它实现了RTP 混合器;
- 网关:它实现了信令网关和媒体网关,在局域网和 PSTN 之间转换数据通道、控制通道和信令过程,并且在局域网中被视为 H.323 终端,在 PSTN 中被视为电话终端。
后来,H.323 标准扩展到广域网 (WAN),允许通过互联网与远程用户通信。
网守的区域由它管理的终端集合组成。一个区域可能涉及不同的网络层,例如由路由器分隔的多个局域网。
H.323 协议栈非常复杂,因为它由多个协议组成
- 数据平面:它由位于 UDP 上的RTP 和 RTCP 协议组成;
- 控制平面:它由位于 TCP/UDP 上的信令协议组成
- RAS 控制器:它允许终端与网守交换控制消息
- 注册消息:终端要求网守加入区域;
- 准入消息:终端要求网守联系另一个终端;
- 状态消息:终端告诉网守它是否处于活动状态;
- 带宽消息:即使在通话过程中,RAS 控制器也会通知网守带宽的变化,以便网守能够在链路过载时拒绝新的通话;
- 呼叫控制器:它允许终端直接与另一个终端交换控制消息;
- H.245 控制器:它允许一对终端就编解码器等参数达成一致;
- 数据:它允许终端发送用于桌面共享或其他多媒体数据流的控制消息。
- RAS 控制器:它允许终端与网守交换控制消息
最后,H.225 层将所有消息组合在一起:它允许创建一种可靠的虚拟隧道,以便在不可靠的 IP 网络上发送 H.323 消息,模拟电路的可靠性。
每个终端都由一个 (IP 地址,TCP/UDP 端口) 对唯一标识,因此它可以通过其地址/端口对直接联系,而无需网守。
如果存在网守,则地址/端口对可以映射到用户更容易记住的别名(例如 [email protected]、E-164 电话号码、昵称)。由于它们与用户帐户相关联,因此别名支持漫游:即使用户移动并更改其 IP 地址,他仍然可以被访问。
H.323 呼叫发生在六个主要步骤中
- 注册:呼叫方终端在其区域内搜索网守,并使用 RAS 控制打开 RAS 通道;
- 呼叫建立:呼叫方终端使用呼叫控制建立到被叫方终端的通道;
- 协商:使用 H.245 控制协商带宽和编解码器等参数;
- 数据传输:语音由 RTP 传输;
- 关闭:使用 H.245 控制关闭数据通道;
- 拆除:使用 RAS 控制关闭 RAS 通道。
网守可以扮演两个角色
- 网守路由呼叫:呼叫始终通过网守 → 这可能对 NAT 穿越很有用:网守充当中继服务器;
- 网守直接端点:呼叫直接转到端点,但呼叫方和被叫方客户端应首先与网守执行准入步骤,以进行计费和带宽管理目的。[4]
- H.323 标准没有提供任何容错辅助,因为它只考虑了一个网守 → 供应商开发了自己的提供此功能的自定义功能,这些功能在彼此之间不兼容;
- H.323 标准不提供对不同区域之间通信的支持 → 公司无法将其区域与另一家公司的区域“合并”;
- 消息使用ASN.1格式编码:这不是文本格式,因此调试非常困难,并且需要处理机器的低级细节(例如小端序);
- 协议栈由许多协议组成,每个功能一个。
会话发起协议 (SIP) 是 IETF 通过 RFC 标准化的应用层信令协议。如今,SIP 的发展速度远远快于 H.323,这主要归功于其遵循互联网理念(“保持简单”)的方法:例如,它使用文本方法(如 HTTP),因此编码易于理解。交互是客户端-服务器。
SIP协议栈比H.323协议栈更简单,因为SIP是控制平面中的一个通用层。SIP仅覆盖信令:它将与信令无关的方面(例如带宽管理)委托给其他已存在的协议,从而降低了其设计的复杂性。
- RTP/RTCP:用于传输和控制多媒体流;
- SDP:用于通知有关多媒体流的控制信息;
- RTSP(实时流协议):类似于RTP的协议,用于处理实时流和其他类型的资源(例如,语音邮箱的录制语音消息快进);
- RSVP:用于在IP网络上预留资源,尝试[5]在分组交换网络上构建某种电路交换网络。
SIP可以在三种可能的传输层之一上运行
- UDP:无需保持TCP连接活跃→适用于低功耗设备;
- TCP:它保证了更高的可靠性,并且对于NAT遍历和穿越防火墙很有用;
- TLS(带SSL的TCP):消息被加密以确保安全,但文本消息的优势会丢失。
SIP提供带有一些主要服务的语音呼叫
- 用户定位:定义要联系的呼叫目标终端;
- 用户能力:定义要使用的媒体(音频、视频等)和参数(编解码器);
- 用户可用性:定义被叫方是否愿意接听呼叫;
- 呼叫建立:建立具有所有参数的连接;
- 呼叫管理.
除了语音呼叫之外,SIP信令还可以用于多种其他服务:电子出席(用户状态:可用、忙等)、即时消息、白板共享、文件传输、互动游戏等等。SIP支持漫游:每个用户都关联一个帐户,因此即使他移动并更改IP地址,他仍然可以被访问。
- 终端:每个主机都需要是客户端和服务器二合一(为了能够被访问,需要作为服务器)。
- 注册服务器:负责跟踪主机和IP地址之间的映射关系。
- 它实现了网关守护器:主机必须注册才能进入SIP网络。
- 代理服务器:管理主机和其他服务器之间消息的交换。
- 主机可以选择仅与代理服务器通信,并将SIP呼叫所需的所有任务委托给它。
- 重定向服务器:用于重定向传入呼叫(例如,用户只想在工作时间才能通过其工作手机被访问)。
- 媒体服务器:用于存储增值内容(例如语音邮箱)。
- 媒体代理:可以用作防火墙穿越的中继服务器。
- 位置服务器:用于定位用户。
- 当主机想要拨打电话时,它会请求位置服务器查找目标用户的地址。
- AAA服务器(身份验证、授权、计费):注册服务器与AAA服务器交换消息以检查用户(例如,用户是否有权进入网络)。
- 网关:通过将SIP数据包转换为样本,反之亦然,连接IP网络和PSTN网络。
- 多点控制单元(MCU):实现RTP混合器,与H.323中的功能相同。
在许多情况下,一台称为SIP服务器(或SIP代理)的机器实现了注册服务器、代理服务器、重定向服务器、媒体代理的功能。此外,位置服务器通常位于DNS服务器中,AAA服务器通常位于公司AAA服务器中。
每个用户都有一个SIP帐户,因此即使他移动并更改IP地址,他仍然可以被访问(漫游)。帐户地址采用以下格式[email protected];电话终端也可以具有以下格式的SIP地址telephone_number@gateway.
SIP网络具有分布式架构:每个SIP服务器负责一个SIP域(相当于H.323区域),并且所有引用同一SIP服务器的主机都属于同一SIP域,并且其帐户地址具有相同的域名。与H.323相比,用户可以联系属于另一个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记录:指定传输协议有多个注册服务器可用,“首选项”字段指定顺序优先级;
- 多个SRV记录:指定域有多个传输协议可用,“优先级”字段指定顺序优先级(按顺序:TLS/TCP、TCP、UDP);
或者可能不包含任何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头:包含有关多媒体流的信息;
- 空行(类似于HTTP的行为);
- SDP消息(有效负载):包含有关多媒体流的控制信息。
SIP消息可以是以下几种类型之一,包括
- REGISTER消息:用于向域注册自己,并且可以通过多播发送到所有注册服务器;
- INVITE消息:用于建立电话呼叫;
- ACK消息:是RTP流开始前最后一条SIP消息。[6]
- BYE消息:用于结束电话呼叫;
- CANCEL消息:用于取消待处理的呼叫建立请求;
- SUBSCRIBE、NOTIFY、MESSAGE消息:用于电子出席和即时消息;
- 代码消息:包括
- 1xx = 临时代码:它们指正在进行的操作(例如100 Trying, 180 Ringing);
- 2xx = 成功代码:它们是成功代码(例如200 OK);
- 4xx = 客户端错误代码:它们是错误代码(例如401 Unauthorized).
SIP头可以包含多个字段,包括
- From字段:包含想要发起呼叫的终端的SIP地址;
- To字段:包含呼叫方终端想要联系的终端的SIP地址;
- Contact字段:SIP服务器使用它来指定被叫终端的IP地址,呼叫方终端可以使用该地址直接联系被叫终端;
- Via 字段:用于跟踪消息需要经过的所有SIP服务器(例如,出站代理服务器);
- Record Routing 字段:指定所有SIP消息是否应通过代理服务器,这对于NAT遍历很有用;
- Subject 字段:包含SIP连接的主题;
- Content-Type、Content-Length、Content-Encoding 字段:包含有关有效负载类型(以类似MIME的格式,例如SDP)、长度(以字节为单位)和编码的信息。
SDP(会话描述协议)是一种基于文本的协议,用于描述多媒体会话:多媒体流的数量、媒体类型(音频、视频等)、编解码器、传输协议(例如RTP/UDP/IP)、带宽、地址和端口、每个流的开始/结束时间、源标识。
SDP包含在SIP数据包的有效负载中,以通知有关多媒体流的控制信息(例如,承载呼叫邀请消息的SIP消息也需要通知使用哪个编解码器)。由于SDP是在一段时间前设计的,因此它具有一些对于SIP来说无用的功能(例如每个流的开始/结束时间),但SIP只是采用了SDP而没有进行任何更改,以便重复使用现有的软件。
- SDP消息格式
每个SDP消息都由一个会话部分和一个或多个媒体部分(每个多媒体流一个)组成
- 会话部分:以一行开头v=,它包含当前会话中所有多媒体流的参数;
- 媒体部分:以一行开头m=,它包含当前多媒体流的参数。
SIP呼叫分4个步骤进行
- 注册:呼叫方终端向域注册自身;
- 邀请:呼叫方终端请求建立呼叫;
- 数据传输:语音由 RTP 传输;
- 拆除:呼叫结束。
用户代理A想要通过联系其SIP代理向域A注册自身:[7]
- 1. 2. DNS查询和回复(NAPTR、SRV、A/AAA):A向DNS服务器查询SIP代理IP地址;
- 3. REGISTER消息:A请求SIP代理进行注册,此处不插入其密码;
- 4. 401 Unauthorized消息:SIP代理请求身份验证,并插入一个挑战,该挑战在每次注册时都会更改;
- 5. REGISTER消息:A根据挑战和密码计算哈希函数,并将结果字符串发送到SIP代理;
- 6. 200 OK消息:注册服务器检查对挑战的回复,并授予用户访问权限。
用户代理A想要通过B的SIP代理与用户代理B建立呼叫
- 1. A请求其SIP代理通过发送INVITE消息与B联系;
- 2. 3. A的SIP代理执行DNS查询以查找B的SIP代理IP地址(NAPTR、SRV、A/AAA);
- 4. A的SIP代理向B的SIP代理发送INVITE消息。
- 5. B的SIP代理向B发送INVITE消息;
- 6. 7. 8. B通过SIP代理向A发送RINGING消息,使A的电话响起;
- 9. 10. 11. B通过SIP代理发送OK消息,使A的电话响起;
- 消息,接受呼叫;12. A根据Record RoutingOK字段值,通过SIP代理或直接通知B它已收到
消息。
拆除步骤在呼叫结束时,关闭RTP流后
- 1. BYE消息:B通知A它想要结束呼叫;
- 2. OK消息:A通知B它已收到BYE字段值,通过SIP代理或直接通知B它已收到