FLUTE通信协议的基本架构
在正式开始谈 FLUTE 之前,在此先跟读者们介绍一下 DVB-IPDC 的CDP 标准,所规范的网络架构与通信协议, DVB-H 广播网络 (单向 IP 网络) 是必备的,至于双向的点对点 IP 网络,则仅是一种非必备的选择性功能。由于 TCP 通信协议无法在仅具备单向 IP 网络的环境下运作,因此在 DVB-H 广播网络上的通信协议,如负责传送影音串流的 RTP (Real-time Transport Protocol,实时传输协议),以及 FLUTE,均是建构在 UDP 通信协议之上的。在 DVB-IPDC 标准的服务平台上,FLUTE 通信协议除了传送一般的使用者档案之外,同时也负责传送 ESG 的数据。
FLUTE 原本是由 IETF (Internet Engineering Task Force) 所制订的一套通信协议 (RFC 3926 - File deLivery over Unidirectional Transport),可将档案由传送端 (sender) 以多点传送方式,透过 Internet 传送至多个接收端 (receiver) 上。和传统的多点传送通信协议不同的是,FLUTE 在运作时并不需要任何由接收端回传至发送端的回馈信息 (feedback),因此,接收端的数量几乎可以说是没有限制的,不管是数10万个或是数100万个都没有问题。FLUTE 不需要接收端回馈的运作特性,是它后来会被应用在 DVB-H 单向 IP 网络上的主因。
FLUTE是建构于另一个 IETF 通信协议 - ALC (Asynchronous Layered Coding,异步分层编码) 之上发展的; 而且,甚至我们可以说,ALC 通信协议才是 FLUTE 通信协议的主体。两者的主要差别在于,ALC 是一套单向的 “对象” (object) 多点传送通信协议,而FLUTE 则是一套单向的 “档案” 多点传送通信协议。由于 ALC 所传送的对象本身,并不具任何的属性 (attribute),因此,FLUTE 通信协议针对 ALC 的最主要扩充,就是将 ALC 传送的对象视为档案,并为每个对象加上档案所需要的属性,例如文件名称、档案长度及档案类型。为此,FLUTE 额外定义了一种叫 FDT (File Description Table,档案描述表) 的数据结构,里面记录了 ALC 对象的档案属性。
ALC是以IP multicast通信协议 (即多点传送的 UDP 通信协议)为基础发展的。基本上,IP multicast只是一种 “尽最大所能传送” (best effort delivery)的多点传送通信协议,本身并没有对话管理 (session management)、壅塞控制 (congestion control)、以及提供可靠传输 (reliable transmission) 的能力。ALC 通信协议建构于 IP multicast 之上,同时也填补了 IP multicast 前述的3个缺点。而且,ALC通信协议可同时适用于 IPv4 与 IPv6 这两种不同版本的 IP 通信协议。
LCT 是可以说是 ALC 通信协议的主体,负责提供前述的 session 管理的功能。CC 则是一个选择性的组成组件,负责 ALC 在 Internet 上的壅塞控制。不过,因为在 DVB-H 广播网络上并不会发生壅塞的问题,所以 CC 在 DVB-IPDC 标准内是不会被使用到的。至于 FEC 则是与 ALC 可靠传输功能相关的组成组件。由于 ALC 在运作时,不需要来自接收端的回馈信息,因此,ALC 主要依靠 FEC 组成组件所提供的前向纠错功能,来弥补 ALC 封包在传送时所发生的遗失或错误。而且,ALC 在设计时,已保留未来可采用各种不同的 FEC 算法的弹性。因此,FEC 组成组件的实际格式,主要是由采用 ALC 的标准 (如 DVB-IPDC CDP 标准),依其所选择的 FEC 算法而决定的。
在目前的 DVB-IPDC CDP 标准中,仅定义了两种 FEC 组成组件,第一种是必备的 Compact No-Code FEC (意即没有 FEC),第二种则是非必备的 Raptor FEC。DVB-IPDC CDP 标准将 Compact No-Code FEC 纳入标准的必备功能,笔者猜测可能有以下3点原因: 1、便于进行 FLUTE 通信协议的兼容性测试。2、在 DVB-H 标准中,由于 MAC 层已提供 MPE-FEC 的前向纠错功能,因此,DVB-H 的 IP 封包传送错误率,以数据传送的角度来说,尚在可接受的范围内。3、由于 Raptor FEC 是 Digital Fountain 公司所拥有的专利技术,除非真的非常必要,不然不会被纳入标准的必备功能。
FLUTE 通信协议的运作原理
在此,我们先跟读者们介绍 FLUTE session 的观念。基本上,一个 FLUTE session 所代表的是一个 FLUTE 的传送端,在一段指定的时间区间内,透过 FLUTE 通信协议传送一群对象的行为。因此,代表一个 FLUTE session 的 ID,是由 FLUTE session 传送端的 IP 地址,再加上 FLUTE session 的 TSI (Transport Session Identifier) 所组成。在一个 FLUTE session 内,会包含一个或多个 FLUTE channel (频道)。基本上,这些 FLUTE channel 的来源 IP 地址就是 FLUTE session 传送端的 IP 地址。另外,不同的 FLUTE channel 会有各自的目的 IP 地址及通信阜 (port)。在一个 FLUTE channel 中所传送的每一个 FLUTE 封包,其来源 IP 地址、目的 IP 地址及通信阜的值,都会与其所属的 FLUTE channel 相同。FLUTE 接收端可选择加入一个 FLUTE channel,以接收 FLUTE channel 内所传送的 FLUTE 封包。基本上,FLUTE 接收端加入或离开一个 FLUTE channel 的方法,跟加入或离开一个 IP multicast 群组 (group) 是完全相同的。
在一个 FLUTE session 内所传送的每个档案,基本上都是一个 ALC 对象 .而且,FLUTE session 中的每个 ALC 对象,都会有一个独一无二的 TOI (Transport Object ID)。每个 ALC 对象在传送前,都会经过分割及加入 FEC 信息的流程,然后才会被放入 FLUTE 封包中被传送。而且,每个 ALC 对象均可以自由实行不同的FEC 算法。在计算 FEC 信息之前,ALC 对象会被分割成一到数个 source block (来源区块)。基本上,FEC 信息是针对每个 source block 独立计算的。首先,一个 source block 会被分割成大小相同的 source symbol (来源符号)。接着,FEC 算法再由这些 source symbol,计算出该 source block 的 parity symbol (检查码符号)。因为 source symbol 与 parity symbol 的大小是一致的,因此,它们也被统称为 encoding symbol (编码符号)。
在一个 FLUTE 封包内,可装入一个到数个属于同一个 ALC 物件的 encoding symbol。至于 encoding symbol 如何被装入 FLUTE 封包内的实际方式,则与 ALC 对象所实行的 FEC 算法有关。例如,若 ALC 对象未经 FEC 编码 (Compact No-Code FEC),则一个 FLUTE 封包内,可装入一个到数个连续的 encoding symbol。在该 FLUTE 封包的标头 (header) 内,会记录该 ALC 对象的 TOI,以及传送该 ALC 对象之 FLUTE session 的 TSI。此外,该 FLUTE 封包的标头内也会记录被传送的第一个 encoding symbol 的 source block number (SBN,来源区块编号) 及 encoding symbol identifier (ESI,编码符号 ID)。
至于将 ALC 对象分割成 source block 的区块化算法 (blocking algorithm),也是由 ALC 对象所实行的 FEC 算法决定的。因此,针对每一个 ALC 对象,会有一份 FEC-OTI (FEC Object Transmission Information,FEC 对象传递信息),里面记录了该 ALC 对象所实行的 FEC 算法 (称作 FEC encoding ID,FEC 编码 ID),以及其它区块化算法所需要的参数。例如,若 ALC 对象未经 FEC 编码 (Compact No-Code FEC),则该对象的 FEC-OTI 包括了: ALC 对象的原始长度、FEC encoding ID (值为 零)、encoding symbol 的大小、以及一个 source block 所能包含的 encoding symbol 的最大数量。因此,一旦 FLUTE 接收端收到一个 ALC 对象的 FEC-OTI 后,即可得知该 ALC 对象会被分割成几个 source block、每个 source block 内包含了几个 source symbol、以及 source symbol (encoding symbol) 的大小。这些信息可协助 FLUTE 接收端,解码与重组属于该 ALC 物件的 encoding symbol。