第十二章 多路复用和隧道技术

  • 多路复用的动机
  • 隧道复用压缩 RTP
  • 多路复用的其他方法

多路复用和隧道传输为包头压缩提供了一种替代方案,通过将多个流捆绑在一个传输连接中来提高 RTP 的效率。其目的是通过跨多个流来平摊头部的大小,减少每个流的开销。本章讨论了复用的动机,并概述了用于复用 RTP 流的机制。

多路复用的动机

包头压缩在逐跳的基础上减少单个 RTP 流的包头大小。虽然它提供了非常高效的传输,但是需要网络的协作(因为头压缩是逐跳工作的,而不是端到端的)。由于附加的计算和特定于流的状态,包头压缩增加了路由器上的负载,在必须同时支持数百甚至数千个 RTP 流的系统中,这两种情况都是不可接受的。

对网络内的计算和状态问题的传统解决方案是将复杂性推到边缘,简化网络的中心,但以边缘的额外复杂性为代价:端到端参数。这个解决方案的应用导表明:如果可能的话,应该减少端到端的包头。你可以通过端到端执行包头压缩来减少包头,从而减少每个包头的大小,或者通过在每个包中放置多个有效负载来减少包头的数量。

虽然应用 RTP 头端到端压缩是可能的,但遗憾的是,它的好处很少。即使 RTP 包头被完全删除,UDP/IP 包头仍然存在。因此,对于典型的 IPv4 情况,28 字节的开销仍然存在,当音频帧的负载为 14 字节时,这种大小显然是不可接受的。因此,只有一种可能的端到端解决方案:在每个包中放置多个有效负载,以摊销 UDP/IP 包头带来的开销。

如图 12.1 所示,多个有效负载数据帧可以来自单个流,也可以来自多个流。绑定就是将来自单个流的多个有效负载数据帧放入到每个 RTP 包。如第 4 章,RTP 数据传输协议,所述,绑定是 RTP 的一个固有部分,不需要特殊的支持。它在减少包头开销方面非常有效,但是它给媒体流增加了额外的延迟,因为在所有绑定的数据出现之前不能发送包。

多路复用是将来自不同流的多个有效负载数据帧放入单个数据包进行传输的过程。多路复用避免了绑定中固有的延迟损失,并且在某些情况下可以显著提高效率。然而,不是没有问题,这可能使它不适合许多情况:

  • 多路复用需要许多具有相似特性的流出现在多路复用点上。如果帧的到达时间不一致,多路复用设备将不得不延迟一些帧,等待其他帧的到达。如果帧的大小不可预测,则会出现其他问题,因为多路复用设备事先不知道可以多路复用多少帧。这可能意味着当帧的大小完全不适合多路复用时,将发送部分多路复用包。结果是低效的传输和可变的延迟,两者都不可取。

  • 为 IP 提出的 QoS 服务质量机制(区分服务和集成服务)在 IP 流的粒度上进行操作。由于一个复用器在一个 IP 层流中传输多个流,因此不可能给这些流提供不同的服务质量。这可能会限制多路复用在使用 QoS 的环境中的有效性,因为它要求所有流具有相同的 QoS。另一方面,如果许多流需要相同的增强 QoS,则多路复用可能有助于减少 QoS 方案必须处理的流的数量。

  • 类似地,多路复用意味着多路复用中的所有流都具有相同程度的错误恢复能力。这并不一定是适当的,因为某些流可能被认为比其他流更重要,并且可以从额外的保护中受益。

尽管存在这些问题,但在某些情况下,仍然希望复用 RTP 流。最常见的例子是大量本质上相同的流在两个点之间传输,这种情况经常发生在 IP 电话被用作取代传统电话线的主干“中继线”时。

RTP 不直接支持多路复用。如果需要在 RTP 中使用多路复用流,则必须使用本章中描述的一个扩展。

隧道复用压缩 RTP

IETF 音频/视频传输工作组收到了许多关于 RTP 多路复用解决方案的建议。其中许多是由特定应用程序的需求驱动的,尽管它们可能已经解决了这些应用程序的需求,但它们通常无法提供完整的解决方案。在保留 RTP 语义的为数不多的建议中,有一条是隧道多路复用压缩 RTP (TCRTP),它被作为推荐的“最佳当前实践”解决方案。

TCRTP 的基本概念

TCRTP 规范描述了如何将现有协议组合起来以提供多路复用。它没有定义任何新的机制。RTP 包头压缩、第二层隧道协议 (L2TP) 和 PPP 复用的组合提供了 TCRTP 系统,协议栈如图 12.2 所示。包头压缩用于减少单个 RTP 有效负载的包头开销。隧道技术用于通过多跳 IP 网络传输压缩的包头和有效负载,而不必在每个链接上进行压缩和解码缩。

多路复用是通过在多个 RTP 有效负载上分摊一个隧道包头,从而来减少隧道包头的开销。

TCRTP 的第一阶段是压缩包头,它以平常的方式进行,通过 PPP 链接协商 CRTP 或 ROHC 的使用。不同之处在于 PPP 链接是一个表示隧道的虚拟接口,而不是一个真实的链接。隧道对包头压缩是不可见的,其存在的唯一表现是其损失和延迟特性。这个概念与 RTP 实现在虚拟专用网 (VPN) 链接上运行非常相似,只是目的是提供更高效的传输,而不是更安全的传输。

与单个物理链路相比,隧道通常有更长的往返时间,可能有更高的包丢失率,并可能重新排序包。如第 11 章包头压缩所讨论的,与这些属性的链接对 CRTP 包头压缩有不利影响,并可能导致较差的性能。正在开发的 CRTP 的增强功能将减少这个问题。ROHC 不是一个很好的选择,因为它需要按顺序交付,而不能通过隧道来保证。

隧道是通过 L2TP 创建的,它为 IP 网络上的 PPP 会话提供了一个通用的封装。这是一个自然的选择,因为 CRTP 和 ROHC 通常都映射到 PPP 连接上,而 L2TP 允许透明地协商任何类型的 PPP 会话。如果 PPP 层的接口正确实现,CRTP/ROHC 实现将不知道 PPP 链接是一个虚拟通道。

不幸的是,当将隧道包头的开销添加到单个压缩 RTP 有效负载时,与未压缩的 RTP 流传输相比,节省的带宽非常少。需要多路复用来分摊许多 RTP 有效负载上的隧道头开销。因此,TCRTP 规范建议使用 PPP 多路复用。PPP 多路复用将连续的 PPP 帧组合成一个传输帧。它是在 PPP 连接设置过程中协商的一个选项,并且它支持可变大小和 PPP 帧类型的多路复用,如图 12.3 所示。

PPP 为点对点的比特流增加了帧,这样它就可以传输上层数据包的序列。至少有四个八位字节的帧被添加到每个上层数据包:一个标志位表示 PPP 帧的开始,紧随其后的是一个协议标识符,作为负载数据对上层数据包的映射,和两位的校验码(可能存在其他帧头,这取决于频道设置时的配置)。通过将多个帧复用为一个,PPP 开销从每个包 4 个字节减少到 2 个字节。

当考虑到隧道开销时,TCRTP 需要包括多路复用就变得很明显了。当 PPP 帧通过 L2TP 在 IP 上通过隧道传输时,每帧有 36 字节的开销 (L2TP 包头压缩可以将这个数字减少到每帧 20 字节)。除非帧在隧道化之前进行多路复用,否则这些开销将抵消包头压缩带来的收益。

实现 TCRTP

TCRTP 的优点是对上层协议不可见。生成 RTP 包的应用程序不能判断这些包是否被多路复用,而且应该可以在不更改现有应用程序的情况下将多路复用添加到现有应用程序中。

多路复用的通用性使 TCRTP 的使用具有很大的灵活性。例如,TCRTP 可以实现为主机上的虚拟网络接口,以多路复用本地生成的数据包,或者在路由器上实现为在两个公共中间点之间流动的多路复用数据包,或者作为独立网关的一部分,从 PSTN(公共交换电话网络)到 IP,在电话系统中多路复用语音呼叫。

根据不同的场景,可以以多种方式实现 TCRTP。一种可能的实现是将 TCRTP 堆栈作为标准的 PPP 网络接口呈现给系统的其余部分,该接口允许协商 RTP 包头压缩。在内部,它将实现 PPP 多路复用和 L2TP 隧道,但这种实现对应用程序是透明的。

TCRTP 接口的透明性主要取决于操作系统。如果 IP 协议实现只是松散地耦合到第二层接口,那么应该可以相对容易和透明地添加一个新的接口—TCRTP。如果 IP 层与第二层接口紧密耦合,就像在嵌入式系统中 TCP/IP 实现根据特定链接的特性进行调优一样,那么这个过程可能会更加困难。

更严重的问题可能是两层接口和网络堆栈其他部分之间的交互。TCRTP 是一个隧道协议,其中压缩 RTP/UDP/IP 层在多路复用 PPP 和 L2TP 之上,然后在 UDP/IP 之上。如果操作系统不支持隧道接口的概念,这种 IP-over-something-over-IP 的分层可能会有问题,需要大量的工作。如果系统将隧道接口隐藏在普通网络接口的抽象中,这也很有帮助,否则隧道接口的不同 API 会增加应用程序与 TCRTP 不兼容的可能性。

在 TCRTP 接口中,必须仔细控制多路复用的程度以限制延迟,同时确保在多路复用中包含足够多的包,以将包头开销保持在可接受的范围内。如果复用的包太少,每个包的包头就会变大,复用的好处就会被抵消。我们可以通过延迟发送多路复用包来避免这个问题,直到它们积累了足够的数据使包头开销可接受;但是,由于交互式应用程序需要的端到端总延迟小于 150 毫秒,所以多路复用不能插入太多的延迟。

非 RTP 流量可以通过 TCRTP 隧道发送,但会导致压缩效率显著降低,因此最好将其与 RTP 流量分离。如果实现协作确保只将 RTP 包发送到特定的目的地,或者可以使用对包头的更广泛的检查(例如,检查这些包是否是针对特定端口范围的 UDP 包),则可以使用目标地址来分离这两种类型的流量。因为 RTP 不使用固定的端口,所以没有直接的方法来区分 RTP 流和非 RTP 流;因此,除非生成这些包的应用程序以某种方式与多路复用进行合作,否则多路复用不能确定只传输 RTP 包。

性能

使用 TCRTP 节省的带宽取决于几个因素,包括多路复用增益、隧道内的预期丢包率和多路复用 RTP 和 IP 包头内字段的变化率。

多路复用减少了由于 PPP 和 L2TP 包头而造成的开销,并且随着越来越多的流被多路复用到每个 PPP 帧中,这种减少会更大。当更多的流被复用在一起时,性能总是会提高,尽管每个流的增量增益随着复用中的流总数的增加而减少。

丢包率和包头字段的变化率会对包头压缩效率产生不利影响。丢包将导致上下文失效,这将导致在刷新上下文时,压缩切换到效率较低的操作模式。如果使用标准的 CRTP,问题尤其严重;增强的 CRTP 执行得更好。头字段中的更改也可能导致压缩转换为效率较低的操作模式,发送一阶增量,而不是完全压缩的二阶增量。对此我们无能为力,只能参考在第 11 章标题为 RTP 应用程序注意事项的章节。包头压缩也与 TCRTP 相关。

TCRTP 规范包括一个简单的性能模型,该模型试图预测 IP 上的语音流(给定增强的 CRTP 压缩)使用的带宽、数据包大小和持续时间、平均通话长度、可复用的数据包数量,以及由于压缩的 RTP 和 IP 包头的变化而导致的开销估计。该模型预测,对于一个 G.729 流,TCRTP 将达到 14.4 Kbps 的速率,该流包含 20 毫秒的数据包、三个多路复用的数据包和平均 1500 毫秒的对话并发长度。这与逐跳 CRTP 实现的 12Kbps 和没有包头压缩或多路复用的标准 RTP(所有数字都包括由于 PPP-in-HDLC[高级数据链路控制] 帧造成的第二层开销)的 25.4 Kbps 形成了鲜明的对比。

当然,性能在很大程度上取决于媒体和网络的特性,但是我们相信,在这个例子中看到的相对性能并不是不现实的。如果有足够的流量进行多路复用,TCRTP 的性能将显著优于标准 RTP,但略低于逐跳包头压缩。

多路复用的其他方法

在 IETF 内部,多路复用一直是存在一些争议和大量讨论的领域。虽然 TCRTP 是当前推荐的最佳实践,但还有其他一些建议值得进一步讨论。这包括通用的 RTP 多路复用 (GeRM),它是 TCRTP 的少数几个保持 RTP 语义的备选方案之一,以及几个特定于应用程序的多路复用。

GeRM

通用 RTP 多路复用 (GeRm) 在 1998 年 8 月芝加哥的 IETF 会议上被提出,但是一直没有发展成一个完整的协议规范。GeRM 使用 RTP 包头压缩的思想,但它不是压缩包之间的包头,而是将压缩应用于单个包内复用的多个有效负载。在每个新的包中,所有的压缩状态都被重新初始化,因此,GeRM 可以有效地端到端的工作。

概念和包格式

图 12.4 显示了 GeRM 的基本操作。一个 RTP 包被创建,多个 RTP 包(称为子包)在其中进行多路复用。每个 GeRM 包都有一个外部 RTP 包头,其中包含第一个子包的包头字段,但是 RTP 有效负载类型字段被设置为一个值,表示这是 GeRM 包。

除了有效负载类型字段和长度之外,第一个子包包头将被完全压缩,因为完整的 RTP 包头和子包包头只在有效负载类型上不同。然后,根据第二个子包的原始 RTP 包头与第一个子包的原始 RTP 包头之间预测的差异对第二个子包包头进行编码。然后,第三个子包包头基于其原始 RTP 包头与第二个子包的原始 RTP 包头编码,以此类推。每个子包包头由一个强制的八字节组成,后面跟着几个扩展八字节,如图 12.5 所示。

强制八位中的位的含义如下:

B0: 0 表示原始 RTP 包头的第一个八位组与前一个子包中的原始 RTP 包头保持不变(如果此包中没有前一个子包,则为外 RTP 包头)。也就是说,V CC P 不变。1 表示原始 RTP 包头的第一个八位元紧接在 GeRM 包头之后。

B1: 这位包含子数据包 RTP 包头的标记位。

B2:0 表示负载类型保持不变。1 表示有效负载类型字段跟在 GeRM 头和任何可能出现的包头首字节之后。虽然 PT 是一个 7 位字段,但它是作为一个 8bit 字段添加的。这个字段的第 0 位总是 0。

B3:0 表示序列号保持不变。1 表示 16bit 序列号字段位于 GeRM 包头和可能存在的任何包头首字节或 PT 包头之后。

B4:0 表示时间戳保持不变。1 表示 32bit 的时间戳字段位于 GeRM 包头和可能存在的任何包头首字节、PT 或序列号包头之后。

B5:0 表示 SSRC 的最高有效的 24 位保持不变。1 表示 SSRC 最高有效的 24 位位于 GeRM 头和可能存在的任何首八位、PT、序列号或时间戳字段之后。

B6:0 表示 SSRC 的最低有效 8bit 比前一个 SSRC 高 1 位。1 表示 SSRC 的最低有效的 8bit 位于源包头和可能存在的首八位、PT、序列号、时间戳或 MSB SSRC 包头字段之后。

B7:0 表示以字节为单位的子包长度(忽略子包包头)与前面的子包相同。1 表示子包长度(忽略子包包头)遵循所有其他 GeRM 包头作为一个 8bit 无符号整数长度字段。一个 8bit 长度的字段就足够了,因为较大的数据包通过多路复用可以获得的增益很少。

原始 RTP 包头中存在的 CSRC 字段,跟随在原始包头。接下来的是 RTP 有效负载。

应用场景

由于 GeRM 而节省的带宽取决于多路复用包之间的包头的相似性。考虑两个场景:任意的包和协作应用程序生成的包。

如果要对任意的 RTP 包进行多路复用,则多路复用的增益很小。如果包之间没有相关性,那么所有可选字段都将出现,并且子包包头的长度为 14 字节。与非多路复用的 RTP 相比,这里仍然有一个优势,因为一个 14 字节的 RTP/UDP/IP 包头比 40 字节的 RTP/UDP/IP 包头要小,但是与标准包头压缩相比,节省的带宽相对较小。

如果要进行多路复用的包是通过协作应用程序产生的,则由 GeRM 节省的带宽可能要大得多。在最简单的情况下,所有要复用的包都具有相同的有效负载类型、长度和 CSRC 列表;除了第一个子数据包包头外,所有的字节都被删除了 3 个 8bit 字节。如果生成包的应用程序相互协作,它们可以合作以确保子包中的序列号和时间戳匹配,从而节省额外的 6 个字节。如果应用生成具有连续同步源标识符的分组,也允许移除 SSRC,则可以实现更多的节省。

当然,实现之间的这种相互协作扩展了合法 RTP 的范围。特别是,生成非随机 SSRC 标识符的应用程序可能会在与使用标准 RTP 的发送端的会话中造成严重问题。这种非随机 SSRC 的使用在两种情况下是可以接受的:

  1. 当使用 RTP 和 GeRM 在两个网关之间传输媒体数据时。在这种情况下,数据的发送端和接收端意识不到 RTP 和 GeRM 被用来传输数据也算是一种幸运。例如,一个系统可以生成 ip 上的语音数据包,作为两个 PSTN 交换之间的网关的一部分。

  2. 当复用设备在被包含进 GeRM 之前重新映射 SSRC 时,用多路复用设备重新生成原始的 SSRC。在这种情况下,SSRC 标识符映射必须在带外发出信号,但这可以作为调用设置过程的一部分。

在最好的情况下,GeRM 可以生成每个多路复用数据包带有两个八位字节标头的数据包,与非多路复用 RTP 相比,这可节省大量带宽。与非多路复用 RTP 相比,GeRM 将始终减少包头开销。

GeRM 的未来

GeRM 不是一个标准的协议,目前也没有计划完成它的规范。这样做有几个原因,其中最主要的原因是,如果在网络中应用了 GeRM,应用程序在生产 RTP 包头时协作的要求将限制协议的范围并导致互操作性问题。此外,带宽节省相对较小,除非这种协作发生,这可能使 GeRM 不那么有吸引力。

作为特定于应用程序的多路复用器,GeRM 的概念非常有用,它位于两个网关之间,这两个网关使用相同的编解码器对多个 RTP 流进行发送和接收,并且愿意为这些流协作生成 RTP 包头。典型的例子是 IP- PSTN 网关,其中 IP 网络充当两个 PSTN 交换机之间的长途中继电路。GeRM 允许这样的系统维护大多数 RTP 语义,同时提供一个高效的多路复用,但只能在应用层实现。

特定于应用程序的多路复用

除了 TCRTP 和 GeRM 等通用多路复用协议外,还提出了各种特定于应用的多路复用协议。这些多路复用的绝大多数都是针对 IP 到 PSTN 网关的,其中 IP 网络充当两个 PSTN 交换之间的长途中继电路。这些网关之间有许多并发的语音连接,可以通过多路复用来提高效率,支持使用低比特率的语音编解码器,并提高可伸缩性。

这种网关通常使用 RTP 协议特性的一个非常有限的子集。所有要进行多路复用的流通常使用相同的有效负载格式和编解码器,它们可能不采用静音抑制。此外,每个流表示单个会话,因此不需要 RTP 的混流功能。结果是 RTP 包头的 CC、CSRC、M、P 和 PT 字段是冗余的,序列号和时间戳之间有一个常量关系,可以省略其中一个。删除这些字段后,只剩下序列号/时间戳和同步源 (SSRC) 标识符。鉴于 RTP 的使用如此有限,显然有必要在这些场景中使用特定于应用程序的多路复用。

特定于电话的多路复用可以定义为对 RTP 包的操作,将多个 RTP 流转换为一个减少包头的单一多路复用。简单地说,这样的多路复用可能只将序列号和同步源(可能减少)的包连接到 UDP 包中,使用带外信令定义这些减少的头和完整的 RTP 头之间的映射。根据应用程序的不同,多路复用可以对实际的 RTP 包进行操作,也可以是将 PSTN 包直接转换为多路复用包的逻辑操作。这种特定于应用程序的多路复用没有标准的解决方案。

作为一种替代方案,可以为 TDM(时分多路复用)有效负载定义一种 RTP 有效负载格式,这将允许直接传输 PSTN 语音,而无需首先将其映射到 RTP。结果是一种“电路仿真”格式,定义为传输整个电路而不关心其内容。

在这种情况下,RTP 头将涉及到电路。SSRC、序列号和时间戳与电路有关,而与在该电路中进行的任何单个会话无关;有效负载类型识别,例如,“T1 仿真”; 混流功能 (CC 和 CSRC 列表)没有使用,标记位和填充也没有使用。图 12.6 显示了该过程如何工作,每个 T1 帧形成一个 RTP 包。

当然,由于 RTP 开销很大,对 T1 线路的直接模拟收益很少。但是,在每个 RTP 包中包含几个连续的 T1 帧是完全合理的,或者模拟一个更高速率的电路,这两者都可以显著降低 RTP 开销。

IETF 有一个伪线边缘到边缘仿真工作组,该工作组正在开发电路仿真标准,包括 PSTN(公共交换电话网)、SONET(同步光网络)和 ATM(异步传输模式)电路。这些标准还没有完成,但 RTP 负载格式的电路仿真是一个建议的解决方案。

用于 ip - pstn 网关设计的电路仿真方法比特定于应用程序的多路复用解决方案更符合 RTP 原理。强烈建议将电路仿真作为此特定应用程序的解决方案。

总结

多路复用通常是不可取的。它强制所有媒体流使用单一传输,阻止接收端根据需要对其进行优先级排序,并使其难于应用错误纠正。在几乎所有情况下,包头压缩都提供了更合适、更高效的解决方案。

然而,在某些有限的情况下,多路复用可能是有用的,主要是当许多本质上相同的流在两个点之间传输时,这种情况经常发生在 ip 电话被用作取代传统电话线的主干“中继线”时。