% !TEX root = ../bachelor-thesis.tex

\chapter{跨域云网络传输性能提升研究}
\label{chap:跨域云网络传输性能提升研究}

% \section{设计目标与总体思路}

% 前两章的分析表明，跨域云网络中的核心矛盾在于：专线链路能够提供稳定的传输质量，但使用成本较高；公网链路成本低廉、覆盖灵活，却在部分跨域片段上存在明显的丢包和抖动。若继续沿用“公网质量良好时走公网、质量恶化时切回专线”的以资源调度为中心的策略，系统在用户需求高峰期仍将大量依赖专线，成本优化空间十分有限，而已有的前向纠错编码等链路质量优化类工作则又将传输链路当作不可改变的低质量链路，只进行端到端的冗余添加与丢包恢复，没有考虑网络传输过程中不同分段的网络质量不同，需要不同程度的丢包恢复。因此，本文提出，依靠云网络配置灵活、路由选择多样的特点，通过冗余编码对云网络中的部分低质量链路进行针对性的质量修复，以达到传输性能与运营成本的平衡。

% 在可变的用户包大小下设计FEC编码方案->使用block code

% 在网络质量动态变化的情况下，自适应地选择FEC参数->使用markov链估计网络参数

% FEC解码时出现burst造成速率测量不准，干扰CCA决策->使用PI控制器稳定发送速率

% 因此，本研究设计的传输优化系统遵循两项设计原则。第一，云网络节点间的连接全部使用公网链路建立，不再使用专线，从而降低跨域互联的资源使用成本。第二，FEC冗余不在整条端到端路径上无差别启用，而是以链路片段为粒度进行针对性修复。对于质量良好的公网片段，系统保持普通转发，以避免引入额外带宽开销；对于丢包集中、连续丢包显著的低质量片段，系统在该片段的发送端加入冗余编码，并在接收端恢复丢包，从而提升该片段的有效传输质量。

% 为实现上述原则，系统既需保持覆盖网络对应用的透明性，又需在具体链路片段上插入可自适应的编码与恢复逻辑。为此，本文采用集中控制、分布转发的软件定义网络架构实现该目标：控制面负责连接管理、路径配置和编码参数调整，数据面负责按链路片段执行普通转发或FEC优化。

\section{系统总体架构}

跨域云网络中的公网链路并非整体全部低质，而是不同链路片段之间质量差异显著，并且单条链路的丢包率和连续丢包模式也会随时间变化。因此，本文不再依赖专线链路或端到端统一冗余来保证传输质量，而是在全公网覆盖网络中对各个链路片段进行独立监控，并只在低质量片段上执行针对性的丢包修复。为了使这种片段级优化能够服务于不同类型的上层应用，系统还需要保持对传输两端透明，避免改变端到端协议语义或破坏原有的数据包到达节奏。围绕这一目标，本文的系统设计需要解决以下两个挑战。

\textbf{挑战一：如何应对各个链路片段频繁且不可预测的链路质量变化。}
全公网方案不能简单地对所有链路长期使用高冗余率，否则低成本公网节省下来的费用会被额外流量开销抵消，且会造成部分可用带宽的浪费。系统承载的应用中又包含实时音视频流媒体等对延迟敏感的业务，FEC编码引入的冗余包不仅占用额外带宽，也会引入解码等待延迟。因此，系统需要根据链路片段上的实时丢包统计，在丢包恢复能力、额外带宽开销和恢复延迟之间取得平衡。由于公网链路的丢包率与丢包模式随时间动态变化，固定的编码参数无法同时适应不同质量状态的链路。本文在~\ref{sec:参数调整} 节通过建立丢包信道模型并据此进行约束搜索，动态判断链路片段是否需要启用冗余以及应使用的编码参数。

\textbf{挑战二：如何在对传输两端透明的前提下提升部分链路的传输质量。}
覆盖网络承载的上层业务类型多样，传输两端通常并不了解中间覆盖网络的转发细节，也难以配合覆盖网络内部的链路优化。因此，片段级质量修复不能依赖修改应用报文、改变端到端协议语义或要求发送端与接收端协同，而需要由覆盖网络内部的相邻节点独立完成。本文通过集中控制、分布转发的系统架构，在控制面为连接下发路径和链路修复配置，在数据面由相邻转发节点完成冗余编码、解码和普通转发的切换。同时，由于FEC解码可能造成数据包集中输出，系统还需要在完成丢包恢复后保持端到端数据包的正常传输节奏。本文在~\ref{sec:pacer} 节中设计了解码端输出速率控制器，对恢复后的数据包进行平滑交付，避免中间节点处理干扰上层拥塞控制和实时应用体验。

本系统的整体架构如图~\ref{fig:系统总体架构} 所示。系统由一个中心控制器（Coordinator）和多个部署在不同地域的转发节点（Node）组成。中心控制器维护节点和连接状态，为端到端连接分配流标识，向相关节点下发转发表项，并根据解码端上报的丢包统计调整低质量链路片段上的FEC编码参数。转发节点负责数据面的实际转发，在本地根据控制器下发的配置，对不同流分别执行普通转发、FEC编码或FEC解码。

\begin{figure}[H]
    \centering
    \includegraphics[width=.9\linewidth]{system_overview.drawio.pdf}
    \caption{系统总体架构}
    \label{fig:系统总体架构}
\end{figure}

每个转发节点上为每条端到端连接创建独立的TUN虚拟网络设备，用户应用只感知到一条普通IP链路，而不需要感知底层覆盖网络和FEC机制。节点之间通过UDP隧道传输数据包，当流量进入一个需要修复的低质量链路片段时，出方向编码器添加FEC冗余；当流量离开该链路片段时，入方向解码器根据收到的数据包和冗余包恢复丢包。对于不需要修复的链路片段，编码器和解码器退化为普通转发逻辑。

\section{交织XOR前向纠错编码设计}
\label{sec:fec编码}

现有的前向纠错编码方案主要包括简单复制冗余、XOR码、R-S码以及流式编码等。本文选择基于XOR运算的分组编码结合交织技术作为FEC编码方案，其核心考量如下。

分组码天然适应可变包大小的场景。在分组码中，冗余包是独立于数据包的单独包：编码器先将用户数据包逐个作为数据包发出，在编码组填满或超时后再生成独立的冗余包并追加发送。由于冗余信息不嵌入在用户数据包内部，用户数据包的大小不受FEC编码的影响，因此即使数据包本身已接近MTU，也不会因为FEC而产生封装溢出导致IP分片的问题。相比之下，流式编码将同一时刻的冗余信息分散嵌入后续多个数据包中，要求在数据包内部预留冗余空间，在用户包大小不可控的通用转发场景下难以适用。分组码的另一个优势是边界清晰：编码器和解码器可以部署在某一段公网链路的两端，只修复该链路片段，而不会要求整条端到端路径都采用同一种传输机制。

在多种分组码中，本文选择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}[H]
    \centering
    \includegraphics[width=.6\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}[H]
    \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}[H]
    \centering
    % \fbox{\parbox{0.85\textwidth}{\centering\small\vspace{1.5em}%
    % 图片内容：Pacer控制模型框图。左侧"数据包输入"（来自FEC解码器，标注"突发式到达"）→ 进入"输出缓冲区"（buffer）→ 受控输出paced数据包（标注"匀速输出"）。缓冲区下方有一个"PI控制器"模块，输入为error = depth - target，输出为pacing rate。%
    % \vspace{1.5em}}}
    \includegraphics[width=\linewidth]{pacer_design.drawio.pdf}
    \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修复；随后介绍了集中控制、分布转发的系统总体架构，并将总体目标细化为两个设计挑战。针对链路片段质量频繁变化的问题，本文提出了三状态丢包信道模型，介绍了从丢包观测量估计模型参数以及在延迟与残余丢包率约束下搜索最优编码参数的方法。针对对传输两端透明地提升部分链路质量的问题，本文通过覆盖网络内部相邻节点完成片段级编码与解码，并设计了解码端PI速率控制器，将FEC解码后的突发输出平滑为匀速流，避免片段级修复干扰上层拥塞控制和实时应用体验。
