% !TEX root = ../bachelor-thesis.tex \chapter{跨域云网络传输性能提升研究} \label{chap:跨域云网络传输性能提升研究} % \section{设计目标与总体思路} % 前两章的分析表明,跨域云网络中的核心矛盾在于:专线链路能够提供稳定的传输质量,但使用成本较高;公网链路成本低廉、覆盖灵活,却在部分跨域片段上存在明显的丢包和抖动。若继续沿用“公网质量良好时走公网、质量恶化时切回专线”的以资源调度为中心的策略,系统在用户需求高峰期仍将大量依赖专线,成本优化空间十分有限,而已有的前向纠错编码等链路质量优化类工作则又将传输链路当作不可改变的低质量链路,只进行端到端的冗余添加与丢包恢复,没有考虑网络传输过程中不同分段的网络质量不同,需要不同程度的丢包恢复。因此,本文提出,依靠云网络配置灵活、路由选择多样的特点,通过冗余编码对云网络中的部分低质量链路进行针对性的质量修复,以达到传输性能与运营成本的平衡。 % 在可变的用户包大小下设计FEC编码方案->使用block code % 在网络质量动态变化的情况下,自适应地选择FEC参数->使用markov链估计网络参数 % FEC解码时出现burst造成速率测量不准,干扰CCA决策->使用PI控制器稳定发送速率 % 因此,本研究设计的传输优化系统遵循两项设计原则。第一,云网络节点间的连接全部使用公网链路建立,不再使用专线,从而降低跨域互联的资源使用成本。第二,FEC冗余不在整条端到端路径上无差别启用,而是以链路片段为粒度进行针对性修复。对于质量良好的公网片段,系统保持普通转发,以避免引入额外带宽开销;对于丢包集中、连续丢包显著的低质量片段,系统在该片段的发送端加入冗余编码,并在接收端恢复丢包,从而提升该片段的有效传输质量。 % 为实现上述原则,系统既需保持覆盖网络对应用的透明性,又需在具体链路片段上插入可自适应的编码与恢复逻辑。为此,本文采用集中控制、分布转发的软件定义网络架构实现该目标:控制面负责连接管理、路径配置和编码参数调整,数据面负责按链路片段执行普通转发或FEC优化。 \section{系统总体架构} 为了实现在全公网互联结构下对低质量链路片段进行针对性修复,本工作主要需要解决三个挑战: \textbf{挑战一:如何在用户包大小可变的场景下设计链路片段级FEC编码方案。} 系统作为通用转发平台,承载的上层应用可能产生任意大小的数据包。当用户数据包接近MTU时,若FEC编码产生的冗余信息追加在用户数据包内一同发送,则封装后的数据包可能超出MTU,导致IP层分片或传输失败。因此,FEC编码方案必须能够在不影响用户数据包大小的情况下独立添加冗余信息。同时,由于本文只在低质量公网片段上进行修复,编码方案还需要在单个链路片段上有效应对连续突发丢包,而不是依赖端到端重传。本文在\ref{sec:fec编码}节设计了交织XOR分组编码方案应对此挑战。 \textbf{挑战二:如何判断差链路所需的冗余强度并自适应地选择编码参数。} 全公网方案不能简单地对所有链路长期使用高冗余率,否则低成本公网节省下来的费用会被额外流量开销抵消。系统承载的应用中又包含实时音视频流媒体等对延迟敏感的业务,FEC编码引入的冗余包不仅占用额外带宽,也会引入解码等待延迟。因此,系统需要根据链路片段上的实时丢包统计,在丢包恢复能力、额外带宽开销和恢复延迟之间取得平衡。由于公网链路的丢包率与丢包模式随时间动态变化,固定的编码参数无法同时适应不同质量状态的链路。本文在\ref{sec:参数调整}节通过建立丢包信道模型并据此进行约束搜索来解决此挑战。 \textbf{挑战三:如何消除FEC解码按组突发输出对拥塞控制算法的干扰。} FEC解码器按编码组为单位批量恢复和交付数据包。当一个编码组恢复完成后,组内的所有数据包被一次性连续交付给上层应用。这种突发式的输出模式会使得上游的拥塞控制算法收到密集的ACK确认包,从而错误地估计链路可用带宽,引发发送速率的震荡。速率震荡不仅影响应用的传输性能,还会使FEC编码器的输入节奏不稳定,进一步干扰吞吐量统计和参数估计的准确性。本文在\ref{sec:pacer}节中,在解码端设计了基于PI控制器的输出速率控制器来消除此问题。 本系统的整体架构如图\ref{fig:系统总体架构}所示。系统由一个中心控制器(Coordinator)和多个部署在不同地域的转发节点(Node)组成。中心控制器维护节点和连接状态,为端到端连接分配流标识,向相关节点下发转发表项,并根据解码端上报的丢包统计调整低质量链路片段上的FEC编码参数。转发节点负责数据面的实际转发,在本地根据控制器下发的配置,对不同流分别执行普通转发、FEC编码或FEC解码。 \begin{figure}[htbp] \centering % \fbox{\parbox{0.95\textwidth}{\centering\small\vspace{1.5em}% % 图片内容:系统总体架构。上方Coordinator通过TCP连接(控制面,虚线)连接多个Node。Node之间通过UDP隧道互联(数据面,实线)。标注一条端到端路径:用户A → TUN → Node1(FEC编码器)→ UDP隧道 → Node2(FEC解码器 + Pacer)→ TUN → 用户B。Coordinator标注"FEC参数计算",数据面上标注编码后数据包传输,控制面上标注丢包统计上报与参数下发。% % \vspace{1.5em}}} \caption{系统总体架构} \label{fig:系统总体架构} \end{figure} 每个转发节点上为每条端到端连接创建独立的TUN虚拟网络设备,用户应用只感知到一条普通IP链路,而不需要感知底层覆盖网络和FEC机制。节点之间通过UDP隧道传输数据包,每个数据包的头部携带\texttt{flow\_id}以标识所属的数据流。系统为每个\texttt{flow\_id}创建独立的处理线程,线程中包含入方向解码器和出方向编码器:当流量进入一个需要修复的低质量链路片段时,出方向编码器添加FEC冗余;当流量离开该链路片段时,入方向解码器根据收到的数据包和冗余包恢复丢包。对于不需要修复的链路片段,编码器和解码器退化为普通转发逻辑。 \section{交织XOR前向纠错编码设计} \label{sec:fec编码} % 本节针对挑战一,介绍链路片段级交织FEC编码方案的设计。核心需求是:FEC冗余信息必须以独立包的形式发送,不嵌入用户数据包内部,从而避免影响用户数据包的大小;同时编码方案需能在低质量公网片段上有效应对连续突发丢包。 由于覆盖网络中承载的流量种类多样, 如第二章所述,现有的前向纠错编码方案主要包括简单复制冗余、XOR码、R-S码以及流式编码等。本文选择基于XOR运算的分组编码结合交织技术作为FEC编码方案,其核心考量如下。 分组码天然适应可变包大小的场景。在分组码中,冗余包是独立于数据包的单独包:编码器先将用户数据包逐个作为数据包发出,在编码组填满或超时后再生成独立的冗余包并追加发送。由于冗余信息不嵌入在用户数据包内部,用户数据包的大小不受FEC编码的影响,因此即使数据包本身已接近MTU,也不会因为FEC而产生封装溢出的问题。相比之下,流式编码将同一时刻的冗余信息分散嵌入后续多个数据包中,要求在数据包内部预留冗余空间,在用户包大小不可控的通用转发场景下难以适用。分组码的另一个优势是边界清晰:编码器和解码器可以部署在某一段公网链路的两端,只修复该链路片段,而不会要求整条端到端路径都采用同一种传输机制。 在多种分组码中,本文选择XOR编码而非R-S码,理由是结合交织技术的XOR编码已足以应对公网链路上观察到的丢包模式。根据第一章的分析,公网链路的主要丢包特征是偶发的孤立丢包和有限长度的连续突发丢包。交织技术将连续的突发丢包分散到不同的恢复列中,使得每列至多丢失一个数据包,恰好匹配XOR编码"每列可恢复一个丢包"的能力。同时,XOR编码的编码和解码均只需要按位异或运算,无需有限域上的矩阵运算,计算开销极低,适合高吞吐量的转发场景。 具体地,本文提出的交织FEC编码将数据包组织为一个二维矩阵结构,如图\ref{fig:交织编码矩阵}所示。设交织深度为$d$,保护包数为$k$,则每个编码组包含$d \times k$个数据包和$d$个冗余包。矩阵共有$d$列、$k+1$行,其中前$k$行为数据包,第$k+1$行为冗余包。每个数据包在矩阵中的位置由其组内序列号唯一确定:对于序列号为$s$的数据包,其所在列号为$s \bmod d$,行号为$\lfloor s / d \rfloor$。每个冗余包通过对同一列中所有数据包进行按位异或运算得到。交织技术的关键优势在于:当网络上发生长度不超过$d$的连续丢包时,由于相邻数据包被分配到不同的列中,这些丢失的数据包被分散到最多$d$个不同的列中,每个列至多丢失一个数据包,因此每个列都可以独立恢复。以图\ref{fig:交织编码矩阵}为例,当$d = 4$时,即使出现了连续四个丢包,由于四个丢包位于四个不同的编码组中(图中以虚线框标出),在每个编码组内部只有一个包丢失,因此接收端仍旧可以完全恢复所有的丢包内容。 \nomenclature{$d$}{交织FEC编码的交织深度} \nomenclature{$k$}{交织FEC编码中每列保护的数据包数} \nomenclature{$s$}{数据包在编码组内的序列号} \begin{figure}[htbp] \centering \includegraphics[width=.7\linewidth]{fec_interleave_loss.drawio.pdf} \caption{交织编码矩阵结构示意($d=4, k=3$)} \label{fig:交织编码矩阵} \end{figure} 编码参数($d$和$k$)可以在编码组之间动态切换,编码器在结束当前组时加载最新收到的参数配置,下一编码组立即使用新参数。 \section{基于丢包统计的自适应参数调整} \label{sec:参数调整} 由于不同公网链路的质量差距大,且单个链路的链路质量也会随着时间变化,本文希望仅在差链路上使用足够但不过量的冗余,以达成对公网链路的充分利用。因此,FEC编码参数需要同时满足多种应用的需求,既包括流媒体应用的延迟需求、也包括文件传输等应用的带宽需求、控制额外带宽开销,并适应链路质量的动态变化。本文的解决思路是:首先为公网链路的丢包行为建立一个数学模型,然后从接收端的丢包观测量中估计模型参数,最后在延迟与残余丢包率的约束下搜索最优编码参数。 \subsection{丢包信道模型} 根据第一章中对公网链路丢包特性的分析,公网链路上的丢包行为可以大致分为两类:一类是偶发的孤立丢包,丢失一个包后链路随即恢复正常;另一类是连续的突发丢包,由于链路拥塞等原因连续丢失多个数据包。基于这一观察,本文提出一个简化的三状态丢包信道模型,如图\ref{fig:三状态丢包模型}所示。模型定义三个状态:$S_1$(孤立丢包状态,丢失一个包后立即恢复)、$S_2$(正常状态,当前数据包正常接收)、$S_3$(连续丢包状态,连续丢失多个包)。模型通过三个参数$p_{21}$(孤立丢包触发概率)、$p_{23}$(连续丢包触发概率)和$p_{33}$(突发延续概率)完整描述链路的丢包行为。 \nomenclature{$S_1$}{网络孤立丢包状态} \nomenclature{$S_2$}{网络正常状态} \nomenclature{$S_3$}{网络连续丢包状态} \nomenclature{$p_{21}$}{孤立丢包触发概率} \nomenclature{$p_{23}$}{连续丢包触发概率} \nomenclature{$p_{33}$}{突发延续概率} \begin{figure}[htbp] \centering \includegraphics[width=.6\linewidth]{markov_state.drawio.pdf} \caption{三状态丢包信道模型} \label{fig:三状态丢包模型} \end{figure} \subsection{参数估计与编码参数搜索} 解码端通过全局序列号间隔检测丢包,维护一个滑动窗口统计近期的丢包事件,并将统计量定期上报至中心控制器。中心控制器收到统计量后,首先根据丢包事件的突发长度分布估计三状态模型的参数$p_{21}$、$p_{23}$和$p_{33}$,进而得到丢包事件的总发生率$\lambda = p_{21} + p_{23}$。 \nomenclature{$\lambda$}{丢包事件的总发生率} 在估计出模型参数后,中心控制器在给定的性能约束下搜索最优的编码参数$(d, k)$。算法考虑交织深度$d \in \{1, 2, 3, 4\}$的候选值,对于每个$d$,确定满足以下两个约束的最大保护包数$k$: \begin{enumerate} \item \textbf{延迟约束}:编码组引入的额外等待延迟不应超过阈值,以满足流媒体应用的实时性需求。 \item \textbf{残余丢包率约束}:编码后未被恢复的随机丢包率应低于阈值,确保应用层的丢包率在可接受范围内。 \end{enumerate} 最终在所有可行的$(d, k)$组合中,选择$k$值最大的组合作为最优编码参数,以提供最强的冗余保护。上述参数调整过程构成了一个完整的反馈闭环:解码端持续检测丢包并上报统计信息,中心控制器计算最优参数并下发至编码端,编码端在下一编码组生效新参数。 \section{解码端输出速率控制设计} \label{sec:pacer} 本节针对挑战三,介绍解码端的输出速率控制器(Pacer)设计。如前所述,FEC解码器按编码组为单位批量交付数据包,这种突发输出会使上游CCA收到密集的ACK,导致错误的带宽估计和速率震荡。本文通过在解码端引入PI速率控制器,将突发输出平滑为匀速流来解决此问题,其控制模型如图\ref{fig:pacer控制模型}所示。 \begin{figure}[htbp] \centering \fbox{\parbox{0.85\textwidth}{\centering\small\vspace{1.5em}% 图片内容:Pacer控制模型框图。左侧"数据包输入"(来自FEC解码器,标注"突发式到达")→ 进入"输出缓冲区"(buffer)→ 受控输出paced数据包(标注"匀速输出")。缓冲区下方有一个"PI控制器"模块,输入为error = depth - target,输出为pacing rate。% \vspace{1.5em}}} \caption{Pacer控制模型} \label{fig:pacer控制模型} \end{figure} 输出速率控制器的核心是一个基于缓冲区深度的PI(比例-积分)控制器。FEC解码器恢复后的数据包首先进入一个输出缓冲区,输出速率控制器根据缓冲区的当前深度与目标深度的偏差计算出发包速率,并按照该速率匀速地从缓冲区中取出数据包交付给上层应用。比例项提供快速的瞬态响应:缓冲区超过目标时加快发包消耗积压,低于目标时减慢发包等待新数据。积分项消除稳态误差:即使数据包到达速率发生变化,积分项也能逐步学习新的稳态速率,确保缓冲区深度收敛到目标值。启动时,输出速率控制器先以直通模式运行并测量实际的到达速率,待积累足够的观测后切换到PI控制模式,切换时将测量速率设置为积分项的初始值以实现平滑过渡。 \nomenclature{PI控制器}{比例-积分控制器} 具体来说,控制器内部维护一个目标缓冲区深度$h_0$,它是5个数据包的深度或是按当前释放速率计算\SI{5}{ms}能排空的缓冲区大小,取二者较大者。同时,控制器内部维护了一个积分值$I$,它在从直通模式切换至PI控制模式时初始化为在直通模式下估计的包到来速率。每次有数据包从缓冲区中释放时,控制器计算当前的缓冲区深度$h$与目标深度的差值: \begin{equation} \increment h = h - h_0 \end{equation} 同时记录自从上次释放数据包至当前时刻经历的时间$\increment t$,并由上一时刻的积分值$I_\text{prev}$计算新的积分值: \begin{equation} I = I_\text{prev} + \increment h \increment t \end{equation} 进一步决定当前的输出速率$v$(以包/秒为单位): \begin{equation} v = K_p \increment h + K_i I \end{equation} 其中$K_p$与$K_i$为可以调整的参数。 \nomenclature{$h_0$}{输出速率控制器目标缓冲区深度} \nomenclature{$h$}{输出速率控制器当前的缓冲区深度} \nomenclature{$\increment h$}{当前缓冲区深度与目标缓冲区深度的偏差} \nomenclature{$\increment t$}{相邻两次释放数据包之间的时间间隔} \nomenclature{$I$}{输出速率控制器内部维护的积分值} \nomenclature{$I_\text{prev}$}{输出速率控制器上一时刻的积分值} \nomenclature{$v$}{输出速率控制器计算得到的数据包释放速率} \nomenclature{$K_p$}{PI控制器的比例系数} \nomenclature{$K_i$}{PI控制器的积分系数} 在稳态时,缓冲区中的包到来速度与释放速度相等,缓冲区的长度始终稳定在$h_0$附近,$\increment h$接近0,包的输出速度由稳定的$I$决定;当包的到来速度增长时,包从缓冲的释放速度低于包的到来速度增长,缓冲的长度开始增长,长度超过$h$,使得$\increment h$为正,进而使得$I$增长。这共同使得$v$提升以跟随包到来速度的增长。当包到来速度下降时,类似的机制促使$v$也跟随下降,直到输出速率再次达到平衡。通过此设计,包的从缓冲区的离开速率总能匹配包到来的平均速率。 输出速率控制器与FEC编码的自适应参数调整形成了协同关系。输出速率控制器将突发输出平滑为匀速流,使得拥塞控制算法能够基于稳定的ACK反馈正确估计带宽,维持稳定的发送速率。稳定的发送速率使得FEC编码器以稳定的节奏填满编码组,进而使吞吐量统计值更加准确,提升了参数调整的准确性。 \section{本章小结} 本章围绕全公网互联、差分片修复的总体思路,介绍了本文提出的跨域公网链路传输优化方法。首先明确了本文不依赖专线互联,而是在公网覆盖网络中针对低质量链路片段进行FEC修复;随后介绍了集中控制、分布转发的系统总体架构,并将总体目标细化为三个设计挑战。针对通用转发场景下可变包大小与MTU约束的挑战,本文选择了交织XOR分组编码方案,冗余包作为独立包发送不影响用户数据包大小,交织技术则将连续丢包分散到不同的恢复列中。针对满足实时应用延迟需求的同时自适应选择编码参数的挑战,本文提出了三状态丢包信道模型,介绍了从丢包观测量估计模型参数以及在延迟与残余丢包率约束下搜索最优编码参数的方法。最后,针对FEC解码突发输出干扰拥塞控制算法的挑战,本文设计了解码端PI速率控制器,将突发输出平滑为匀速流,并与FEC参数调整机制形成协同。