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

\chapter{实验验证与分析}
\label{chap:实验验证与分析}

本章主要介绍系统的实现情况及实验结果。\ref{sec:试验环境} 节介绍本文提出的设计方案的实现情况及实验环境与实验设置等基本信息，\ref{sec:实验结果} 节展示了实验结果，并对其进行了简要的分析。

\section{实验环境}
\label{sec:实验环境}

本文作者使用Rust语言实现了设计的分布式转发与控制系统，实现了动态FEC编解码、丢包统计及参数自动计算等所有核心设计要点。本文实验在一台配备两颗Intel Xeon E5-2620 v3处理器的服务器上进行，整机共提供12个物理核心、24个逻辑CPU。服务器共搭载~\SI{64}{GiB} 运行内存。本文中的实验使用Rattan\cite{wang2025rattan}对网络上的丢包，延迟及带宽限速进行模拟。在实验中，多台不同的虚拟机通过虚拟交换机互联，并在每台虚拟机的虚拟出口使用Rattan对网络流量进行处理，以达成对链路延迟、丢包带宽等不同性质的模拟。如图~\ref{fig:实验拓扑}，在实验中，共使用三台虚拟机（记作A，B，C）作为转发以及用户接入客户端，使用另外一台虚拟机作为控制器。利用控制器建立A经由B到达C的链路，其中AB间的链路为模拟低质量链路，存在丢包，往返时延~\SI{50}{ms}；BC间的链路为模拟高质量链路，为不丢包的链路，往返时延~\SI{50}{ms}。两条链路的带宽均为~\SI{100}{Mbps}。通过调整AB间链路的丢包率并测量AC之间的传输性能，可以测量本文提出的方法与直接进行转发的基准方案的性能，并进行对比。

实验时，分别选取丢包率取从0至2\%的不同值，分别使用本文提出的动态链路优化算法与直接进行转发的方法在A、C间使用iperf3进行测速，持续~\SI{60}{s}，并记录收端的接收速率。

\begin{figure}[H]
    \centering
    \includegraphics[width=.8\linewidth]{exp_topology.drawio.pdf}
    \caption{实验建立的网络拓扑}
    \label{fig:实验拓扑}
\end{figure}

\section{实验结果与分析}
\label{sec:实验结果}

实验结果如图~\ref{fig:实验结果图}所示。图~\ref{fig:吞吐绝对值} 展示了不同丢包率下两种方法的端到端吞吐量，图~\ref{fig:吞吐相对提升} 展示了本文方法相对于直接转发基准方案的吞吐提升程度。

\begin{figure}[H]
    \centering
    \subcaptionbox{不同丢包率下的端到端吞吐量\label{fig:吞吐绝对值}}
      {\includegraphics[width=0.48\linewidth]{thpt_absolute.pdf}}
    \hspace{0.02\linewidth}
    \subcaptionbox{相对于基准方案的吞吐提升\label{fig:吞吐相对提升}}
      {\includegraphics[width=0.48\linewidth]{thpt_speedup.pdf}}
    \caption{不同丢包率下本文方法的吞吐性能提升}
    \label{fig:实验结果图}
\end{figure}

与基线方法相比，本文方法在较高丢包率下仍旧保持了较高的总体带宽，并达到了最高3.6倍带宽提升。通过查阅控制器日志可以发现，本方法正确识别了两条链路中的不同丢包率，并在丢包严重的AB段链路上启用了FEC，在没有丢包的链路上则始终使用普通转发。

尽管本方法使用了FEC方法对链路丢包进行了恢复，并有效提升了整体吞吐量，但是相比无丢包时仍旧有较大的吞吐性能差距。这一方面是由于添加冗余信息占用了一部分带宽，导致理想状态下应用可用的带宽下降；另一方面是由于由于冗余参数的选取较为保守，即使添加了FEC也有一定概率会出现丢包，导致发送端仍旧不能保证没有丢包发生，这些丢包会导致发送端丢包降低发送速率。最终，冗余带宽占用和残余丢包两种因素叠加导致即使使用了本方法，传输速率仍旧有所下降。

值得注意的是，虽然从本方法的吞吐量从无丢包至有丢包有较大下降，但是随着丢包率的增高，吞吐量的下降程度明显小于直接转发行为，这是由于本方法的动态FEC参数决定算法动态根据测量得到的丢包率参数决定了合适的冗余度，从而有效地将修复后的丢包率维持在较为固定的范围内，因而尽管底层链路的丢包率持续恶化，但是上层TCP连接感知的丢包率却始终稳定，使得最终的吞吐量也稳定在较为稳定的范围内。

在丢包率为零的场景下，使用直接转发能达到比使用本方法略高的性能，这主要是由于本方法所使用的FEC算法在不启用冗余时也仍旧需要在数据包中传输少量额外的包头，导致吞吐量相比直接转发有大约~\SI{1}{\percent} 的下降，与存在丢包场景下的性能提升相比影响较小。

