overview图

This commit is contained in:
2026-05-23 14:37:44 +08:00
parent 613caf3157
commit 76140891bc
9 changed files with 315 additions and 30 deletions

Binary file not shown.

View File

@@ -1,6 +1,6 @@
% !TEX root = ../bachelor-thesis.tex
\chapter{补充内容}
% \chapter{补充内容}
% 附录是与论文内容密切相关、但编入正文又影响整篇论文编排的条理和逻辑性的资料,例如某些重要的数据表格、计算程序、统计表等,是论文主体的补充内容,可根据需要设置。
@@ -9,7 +9,7 @@
% “表~\ref{tab:appendix-table}”,“式\eqref{eq:appendix-equation}”等。
\section{插图}
% \section{插图}
% 附录中的插图示例(图~\ref{fig:appendix-figure})。
@@ -21,7 +21,7 @@
% \end{figure}
\section{表格}
% \section{表格}
% 附录中的表格示例(表~\ref{tab:appendix-table})。
@@ -43,7 +43,7 @@
% \end{table}
\section{数学表达式}
% \section{数学表达式}
% 附录中的数学表达式示例(式\eqref{eq:appendix-equation})。
% \begin{equation}
@@ -52,9 +52,9 @@
% \end{equation}
\section{文献引用}
% \section{文献引用}
% 附录\cite{dupont1974bone}中的参考文献引用\cite{zhengkaiqing1987}示例
% \cite{dupont1974bone,zhengkaiqing1987}。
\printbibliography
% \printbibliography

View File

@@ -54,7 +54,7 @@
\item \textbf{公网链路不同分段质量差异显著,端到端进行网络编码带宽浪费严重。}
\end{enumerate}
云服务商只对专线链路的质量提供服务质量保证Service level agreement, SLA而对公网的具体性能没有任何形式的保证。尽管服务商不对公网的性能做出任何保证所有的公网链路在所有的时间段质量都劣于专线链路。如图\ref{fig:公网片段热力图}所示,部分公网链路有着较低的平均丢包率,质量几乎与专线相当,而只有部分链路,特别是跨域链路的丢包率较高,链路质量较差,与低丢包的专线有较大差距。覆盖网络对用户流量进行转发时,通常将多个不同的网络片段相连组成连接两侧接入网关的路径。由于覆盖网络的内部转发机制通常对端到端的传输透明,两端的客户端只能感知到由多个链路的丢包级联而成的最终丢包率,只要组成转发路径的链路中包含了至少一条丢包率较高的跨域公网链路,端到端感知到的丢包率就会明显上升。这导致在跨域连接的场景下,网络编码类工作只能以感知到的高丢包率对在整个路径上转发的包加入大量的冗余,造成了较大的带宽浪费,造成链路使用成本上升。
云服务商只对专线链路的质量提供服务质量保证Service level agreement, SLA而对公网的具体性能没有任何形式的保证。尽管服务商不对公网的性能做出任何保证所有的公网链路在所有的时间段质量都劣于专线链路。如图~\ref{fig:公网片段热力图} 所示,部分公网链路有着较低的平均丢包率,质量几乎与专线相当,而只有部分链路,特别是跨域链路的丢包率较高,链路质量较差,与低丢包的专线有较大差距。覆盖网络对用户流量进行转发时,通常将多个不同的网络片段相连组成连接两侧接入网关的路径。由于覆盖网络的内部转发机制通常对端到端的传输透明,两端的客户端只能感知到由多个链路的丢包级联而成的最终丢包率,只要组成转发路径的链路中包含了至少一条丢包率较高的跨域公网链路,端到端感知到的丢包率就会明显上升。这导致在跨域连接的场景下,网络编码类工作只能以感知到的高丢包率对在整个路径上转发的包加入大量的冗余,造成了较大的带宽浪费,造成链路使用成本上升。
例如一条端到端的连接可能分别由AB、BC、CD三段链路组成其中三段链路的丢包率分别为$0, 0.2, 0$, 如果使用端到端的冗余,为了应对其中一条高丢包链路带来的丢包,必须在整条链路上加入额外约\SI{20}{\percent}的冗余导致在从A发往D的流量中AB、BC两段都承载了相比有效数据多\SI{20}{\percent}的数据量。在这种场景下AB段网络本身质量优秀但是却由于后段质量较差的网络呃额外承载了流量导致了链路使用成本上升。
\begin{figure}[H]
\centering

View File

@@ -3,7 +3,9 @@
\chapter{相关工作}
\label{chap:相关工作}
本章主要介绍一些与本文工作相关的已有工作。\ref{sec:隧道技术介绍} 节主要介绍了当前在工业界得到较为广泛使用的用于构建覆盖网络的几种隧道技术,\ref{sec:链路质量优化相关工作} 节介绍了多种常用于进行网络编码的前项纠错编码技术,并比较了他们的异同。最后,\ref{sec:SDN相关工作} 节介绍了与覆盖网络紧密联系的软件定义网络Software defined network, SDN的概念以及与其相关的一些工作。
本章主要介绍一些与本文工作相关的已有工作。\ref{sec:隧道技术介绍} 节主要介绍了当前在工业界得到较为广泛使用的用于构建覆盖网络的几种隧道技术,\ref{sec:链路质量优化相关工作} 节介绍了多种常用于进行网络编码的前项纠错编码技术,并比较了他们的异同。最后,\ref{sec:SDN相关工作} 节介绍了与覆盖网络紧密联系的软件定义网络Software Defined Network, SDN的概念以及与其相关的一些工作。
\nomenclature{SDN}{软件定义网络Software Defined Network}
\section{云网络、覆盖网络与隧道技术}
\label{sec:隧道技术介绍}
@@ -55,7 +57,7 @@ GeneveGeneric Network Virtualization Encapsulation通用虚拟化网络封
\subsection{分组冗余码}
通过重复发送数据包的方式添加冗余虽然简单但是会带来较高的冗余开销为了提高冗余信息的恢复效率研究者们进一步提出了基于分组冗余码的前项纠错机制。XOR码和R-S码是较为主要的冗余纠错恢复机制。如图\ref{fig:分组码示意},这两种编码都是线性分组码,将原始数据分为$n$个数据包一组,对于每一组数据再加入$k$个冗余数据包并将$n + k$个数据一并发送,接收端同样以组为单位进行丢包的恢复。
通过重复发送数据包的方式添加冗余虽然简单但是会带来较高的冗余开销为了提高冗余信息的恢复效率研究者们进一步提出了基于分组冗余码的前项纠错机制。XOR码和R-S码是较为主要的冗余纠错恢复机制。如图~\ref{fig:分组码示意},这两种编码都是线性分组码,将原始数据分为$n$个数据包一组,对于每一组数据再加入$k$个冗余数据包并将$n + k$个数据一并发送,接收端同样以组为单位进行丢包的恢复。
\begin{figure}[H]
\centering
@@ -68,7 +70,7 @@ GeneveGeneric Network Virtualization Encapsulation通用虚拟化网络封
为应对XOR编码的缺点在1960年Reed与Solomon提出了R-S编码\cite{reed1960rscode}。R-S编码保证对于$n$个数据包和$k$个在有限域上计算出的冗余包共$n + k$个数据包,接收端只要接收到了其中的任意$n$就能完整地恢复出所有的原始数据包。相较于XOR编码R-S编码的恢复能力有较大的提升能够在同一个编码组里出现较多的丢包的恶劣情况下进行恢复从能承受最多1个丢包增加至能承受最多$k$个丢包。RS编码被广泛用于传输音视频流媒体Lin等人\cite{lin2012apfec}通过在无线局域网链路上对数据包进行FEC编码提升了视频传输的效果。更多的其他研究者选择结合视频编码自身以帧和画面组Group of Pictures, GOP进行编码的特性进行FEC编码以提升视频传输质量。Shih等人\cite{shih2016framefec}通过对视频中的关键帧进行FEC保护提升了关键帧以及后续多个依赖关键帧的画面质量有效提升了视频传输质量。Xiao等人\cite{xiao2012subgopfec}使用贪心算法动态决定每个冗余组需要包含的帧数量及冗余度在不牺牲延迟的情况下提升了视频质量。Yang等人\cite{yang2003qualitygopfec}通过估算不同的数据包丢包后对解码视频的影响时间动态选择FEC参数以提升用户的视频观看体验。Kurdoglu等人\cite{kurdoglu2017fecwithquantation}则将FEC冗余率与编码帧率、编码量化参数及编码方式等联合优化以最佳化用户观看体验而非追求更高的单一量化指标。总体而言XOR码和R-S编码相比简单复制冗余具有更高的冗余恢复效率因此被广泛应用于实时音视频传输等场景。
然而R-S编码通常以数据组为单位进行编码与恢复其恢复能力依赖于单个编码组中的丢包数量不超过冗余包数量$k$。实际网络上的丢包并不是独立的在部分链路上可能由于链路拥塞、无线信号衰减等原因出现连续的突发丢包。在这些场景下如果使用R-S编码进行丢包恢复为了能成功恢复数据必须按照最差的可能情况决定$n$$k$的相对取值,而这通常使得算法对网络的状况产生过于悲观的估计,为了应对短暂出现的连续丢包而将$k$的值始终维持在较高水平。这导致在其他未遭遇连续丢包的数据组中大量的冗余包被浪费占用了传输带宽而未能有效地提升传输质量。为解决此问题研究者们提出了交织Interleave技术。如图\ref{fig:交织示意图}所示,交织技术将多个编码组交替地在网络上发出,使得当传输过程中出现了连续丢包时,丢包被分散在多个不同的编码组中分别应对,使得单个编码组需要应对的丢包比例大大下降,从而降低了整体需要的冗余率。
然而R-S编码通常以数据组为单位进行编码与恢复其恢复能力依赖于单个编码组中的丢包数量不超过冗余包数量$k$。实际网络上的丢包并不是独立的在部分链路上可能由于链路拥塞、无线信号衰减等原因出现连续的突发丢包。在这些场景下如果使用R-S编码进行丢包恢复为了能成功恢复数据必须按照最差的可能情况决定$n$$k$的相对取值,而这通常使得算法对网络的状况产生过于悲观的估计,为了应对短暂出现的连续丢包而将$k$的值始终维持在较高水平。这导致在其他未遭遇连续丢包的数据组中大量的冗余包被浪费占用了传输带宽而未能有效地提升传输质量。为解决此问题研究者们提出了交织Interleave技术。如图~\ref{fig:交织示意图} 所示,交织技术将多个编码组交替地在网络上发出,使得当传输过程中出现了连续丢包时,丢包被分散在多个不同的编码组中分别应对,使得单个编码组需要应对的丢包比例大大下降,从而降低了整体需要的冗余率。
\begin{figure}[H]
\centering
@@ -83,7 +85,7 @@ Liu等人\cite{liu2017opticalinterleave}提出了一种在开放光通信场景
\subsection{流式冗余码Streaming码}
XOR、R-S等分组码结合交织已经能较好地应对网络中的丢包问题但是这些编码仍旧不能满足一些实时性需求高的应用。如图\ref{fig:RS编码等待恢复延迟},由于分组码的冗余包通常是通过对所有的组内的数据包进行计算得到,因此冗余信息必须在所有数据包已经发出后才能够计算并在网络中发出,这导致如果接收端在接收数据包时如果检测到了丢包且需要利用冗余信息进行恢复,为了保证数据包数据包按发送顺序连续交付至上层应用,接收端通常需要暂停后续数据的解码输出,直至对应的冗余包到达并完成恢复。由此产生的恢复等待时间会显著增加端到端时延。对于实时性要求较高的应用,即使最终能够恢复出丢失数据,其对应的视频帧或音频数据也可能已经错过播放时限,从而无法有效改善用户体验。
XOR、R-S等分组码结合交织已经能较好地应对网络中的丢包问题但是这些编码仍旧不能满足一些实时性需求高的应用。如图~\ref{fig:RS编码等待恢复延迟},由于分组码的冗余包通常是通过对所有的组内的数据包进行计算得到,因此冗余信息必须在所有数据包已经发出后才能够计算并在网络中发出,这导致如果接收端在接收数据包时如果检测到了丢包且需要利用冗余信息进行恢复,为了保证数据包数据包按发送顺序连续交付至上层应用,接收端通常需要暂停后续数据的解码输出,直至对应的冗余包到达并完成恢复。由此产生的恢复等待时间会显著增加端到端时延。对于实时性要求较高的应用,即使最终能够恢复出丢失数据,其对应的视频帧或音频数据也可能已经错过播放时限,从而无法有效改善用户体验。
\begin{figure}[H]
\centering
@@ -101,7 +103,7 @@ XOR、R-S等分组码结合交织已经能较好地应对网络中的丢包问
\section{软件定义网络与网络调度}
\label{sec:SDN相关工作}
软件定义网络Software defined networking, SDN指的是将网络中各个转发设备的数据平面与控制平面解耦集中进行控制的网络。SDN网络大大简化了网络的管理和控制流程。对于跨域云网络及其中部署的虚拟网络尽管有部分的网络设备由SDN统一控制但是各个设备间的跨域互联通常仍仍旧由传统的网络设备提供连接形成了混合形软件定义网络hybrid SDN network如图\ref{fig:混合SDN网络}\cite{amin2018hybridsdnsurvey}
软件定义网络Software defined networking, SDN指的是将网络中各个转发设备的数据平面与控制平面解耦集中进行控制的网络。SDN网络大大简化了网络的管理和控制流程。对于跨域云网络及其中部署的虚拟网络尽管有部分的网络设备由SDN统一控制但是各个设备间的跨域互联通常仍仍旧由传统的网络设备提供连接形成了混合形软件定义网络hybrid SDN network如图~\ref{fig:混合SDN网络}\cite{amin2018hybridsdnsurvey}
\begin{figure}[H]
\centering

View File

@@ -22,21 +22,19 @@
为了实现在全公网互联结构下对低质量链路片段进行针对性修复,本工作主要需要解决三个挑战:
\textbf{挑战一如何在用户包大小可变的场景下设计链路片段级FEC编码方案。}
系统作为通用转发平台承载的上层应用可能产生任意大小的数据包。当用户数据包接近MTU时若FEC编码产生的冗余信息追加在用户数据包内一同发送则封装后的数据包可能超出MTU导致IP层分片或传输失败。因此FEC编码方案必须能够在不影响用户数据包大小的情况下独立添加冗余信息。同时由于本文只在低质量公网片段上进行修复编码方案还需要在单个链路片段上有效应对连续突发丢包而不是依赖端到端重传。本文在\ref{sec:fec编码}节设计了交织XOR分组编码方案应对此挑战。
系统作为通用转发平台承载的上层应用可能产生任意大小的数据包。当用户数据包接近MTU时若FEC编码产生的冗余信息追加在用户数据包内一同发送则封装后的数据包可能超出MTU导致IP层分片或传输失败。因此FEC编码方案必须能够在不影响用户数据包大小的情况下独立添加冗余信息。同时由于本文只在低质量公网片段上进行修复编码方案还需要在单个链路片段上有效应对连续突发丢包而不是依赖端到端重传。本文在~\ref{sec:fec编码} 节设计了交织XOR分组编码方案应对此挑战。
\textbf{挑战二:如何判断差链路所需的冗余强度并自适应地选择编码参数。}
全公网方案不能简单地对所有链路长期使用高冗余率否则低成本公网节省下来的费用会被额外流量开销抵消。系统承载的应用中又包含实时音视频流媒体等对延迟敏感的业务FEC编码引入的冗余包不仅占用额外带宽也会引入解码等待延迟。因此系统需要根据链路片段上的实时丢包统计在丢包恢复能力、额外带宽开销和恢复延迟之间取得平衡。由于公网链路的丢包率与丢包模式随时间动态变化固定的编码参数无法同时适应不同质量状态的链路。本文在\ref{sec:参数调整}节通过建立丢包信道模型并据此进行约束搜索来解决此挑战。
全公网方案不能简单地对所有链路长期使用高冗余率否则低成本公网节省下来的费用会被额外流量开销抵消。系统承载的应用中又包含实时音视频流媒体等对延迟敏感的业务FEC编码引入的冗余包不仅占用额外带宽也会引入解码等待延迟。因此系统需要根据链路片段上的实时丢包统计在丢包恢复能力、额外带宽开销和恢复延迟之间取得平衡。由于公网链路的丢包率与丢包模式随时间动态变化固定的编码参数无法同时适应不同质量状态的链路。本文在~\ref{sec:参数调整} 节通过建立丢包信道模型并据此进行约束搜索来解决此挑战。
\textbf{挑战三如何消除FEC解码按组突发输出对拥塞控制算法的干扰。}
FEC解码器按编码组为单位批量恢复和交付数据包。当一个编码组恢复完成后组内的所有数据包被一次性连续交付给上层应用。这种突发式的输出模式会使得上游的拥塞控制算法收到密集的ACK确认包从而错误地估计链路可用带宽引发发送速率的震荡。速率震荡不仅影响应用的传输性能还会使FEC编码器的输入节奏不稳定进一步干扰吞吐量统计和参数估计的准确性。本文在\ref{sec:pacer}节中在解码端设计了基于PI控制器的输出速率控制器来消除此问题。
FEC解码器按编码组为单位批量恢复和交付数据包。当一个编码组恢复完成后组内的所有数据包被一次性连续交付给上层应用。这种突发式的输出模式会使得上游的拥塞控制算法收到密集的ACK确认包从而错误地估计链路可用带宽引发发送速率的震荡。速率震荡不仅影响应用的传输性能还会使FEC编码器的输入节奏不稳定进一步干扰吞吐量统计和参数估计的准确性。本文在~\ref{sec:pacer} 节中在解码端设计了基于PI控制器的输出速率控制器来消除此问题。
本系统的整体架构如图\ref{fig:系统总体架构}所示。系统由一个中心控制器Coordinator和多个部署在不同地域的转发节点Node组成。中心控制器维护节点和连接状态为端到端连接分配流标识向相关节点下发转发表项并根据解码端上报的丢包统计调整低质量链路片段上的FEC编码参数。转发节点负责数据面的实际转发在本地根据控制器下发的配置对不同流分别执行普通转发、FEC编码或FEC解码。
本系统的整体架构如图~\ref{fig:系统总体架构} 所示。系统由一个中心控制器Coordinator和多个部署在不同地域的转发节点Node组成。中心控制器维护节点和连接状态为端到端连接分配流标识向相关节点下发转发表项并根据解码端上报的丢包统计调整低质量链路片段上的FEC编码参数。转发节点负责数据面的实际转发在本地根据控制器下发的配置对不同流分别执行普通转发、FEC编码或FEC解码。
\begin{figure}[htbp]
\begin{figure}[H]
\centering
% \fbox{\parbox{0.95\textwidth}{\centering\small\vspace{1.5em}%
% 图片内容系统总体架构。上方Coordinator通过TCP连接控制面虚线连接多个Node。Node之间通过UDP隧道互联数据面实线。标注一条端到端路径用户A → TUN → Node1FEC编码器→ UDP隧道 → Node2FEC解码器 + Pacer→ TUN → 用户B。Coordinator标注"FEC参数计算",数据面上标注编码后数据包传输,控制面上标注丢包统计上报与参数下发。%
% \vspace{1.5em}}}
\includegraphics[width=\linewidth]{system_overview.drawio.pdf}
\caption{系统总体架构}
\label{fig:系统总体架构}
\end{figure}
@@ -56,13 +54,13 @@ 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$时,即使出现了连续四个丢包,由于四个丢包位于四个不同的编码组中(图中以虚线框标出),在每个编码组内部只有一个包丢失,因此接收端仍旧可以完全恢复所有的丢包内容。
具体地本文提出的交织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]
\begin{figure}[H]
\centering
\includegraphics[width=.7\linewidth]{fec_interleave_loss.drawio.pdf}
\caption{交织编码矩阵结构示意($d=4, k=3$}
@@ -78,7 +76,7 @@ FEC解码器按编码组为单位批量恢复和交付数据包。当一个编
\subsection{丢包信道模型}
根据第一章中对公网链路丢包特性的分析,公网链路上的丢包行为可以大致分为两类:一类是偶发的孤立丢包,丢失一个包后链路随即恢复正常;另一类是连续的突发丢包,由于链路拥塞等原因连续丢失多个数据包。基于这一观察,本文提出一个简化的三状态丢包信道模型,如图\ref{fig:三状态丢包模型}所示。模型定义三个状态:$S_1$(孤立丢包状态,丢失一个包后立即恢复)、$S_2$(正常状态,当前数据包正常接收)、$S_3$(连续丢包状态,连续丢失多个包)。模型通过三个参数$p_{21}$(孤立丢包触发概率)、$p_{23}$(连续丢包触发概率)和$p_{33}$(突发延续概率)完整描述链路的丢包行为。
根据第一章中对公网链路丢包特性的分析,公网链路上的丢包行为可以大致分为两类:一类是偶发的孤立丢包,丢失一个包后链路随即恢复正常;另一类是连续的突发丢包,由于链路拥塞等原因连续丢失多个数据包。基于这一观察,本文提出一个简化的三状态丢包信道模型,如图~\ref{fig:三状态丢包模型} 所示。模型定义三个状态:$S_1$(孤立丢包状态,丢失一个包后立即恢复)、$S_2$(正常状态,当前数据包正常接收)、$S_3$(连续丢包状态,连续丢失多个包)。模型通过三个参数$p_{21}$(孤立丢包触发概率)、$p_{23}$(连续丢包触发概率)和$p_{33}$(突发延续概率)完整描述链路的丢包行为。
\nomenclature{$S_1$}{网络孤立丢包状态}
\nomenclature{$S_2$}{网络正常状态}
@@ -87,7 +85,7 @@ FEC解码器按编码组为单位批量恢复和交付数据包。当一个编
\nomenclature{$p_{23}$}{连续丢包触发概率}
\nomenclature{$p_{33}$}{突发延续概率}
\begin{figure}[htbp]
\begin{figure}[H]
\centering
\includegraphics[width=.6\linewidth]{markov_state.drawio.pdf}
\caption{三状态丢包信道模型}
@@ -112,9 +110,9 @@ FEC解码器按编码组为单位批量恢复和交付数据包。当一个编
\section{解码端输出速率控制设计}
\label{sec:pacer}
本节针对挑战三介绍解码端的输出速率控制器Pacer设计。如前所述FEC解码器按编码组为单位批量交付数据包这种突发输出会使上游CCA收到密集的ACK导致错误的带宽估计和速率震荡。本文通过在解码端引入PI速率控制器将突发输出平滑为匀速流来解决此问题其控制模型如图\ref{fig:pacer控制模型}所示。
本节针对挑战三介绍解码端的输出速率控制器Pacer设计。如前所述FEC解码器按编码组为单位批量交付数据包这种突发输出会使上游CCA收到密集的ACK导致错误的带宽估计和速率震荡。本文通过在解码端引入PI速率控制器将突发输出平滑为匀速流来解决此问题其控制模型如图~\ref{fig:pacer控制模型} 所示。
\begin{figure}[htbp]
\begin{figure}[H]
\centering
% \fbox{\parbox{0.85\textwidth}{\centering\small\vspace{1.5em}%
% 图片内容Pacer控制模型框图。左侧"数据包输入"来自FEC解码器标注"突发式到达")→ 进入"输出缓冲区"buffer→ 受控输出paced数据包标注"匀速输出")。缓冲区下方有一个"PI控制器"模块输入为error = depth - target输出为pacing rate。%

View File

@@ -3,12 +3,12 @@
\chapter{实验验证与分析}
\label{chap:实验验证与分析}
本章主要介绍系统的实现情况及实验结果。\ref{sec:试验环境}节介绍本文提出的设计方案的实现情况及实验环境与实验设置等基本信息,\ref{sec:实验结果}节展示了实验结果,并对其进行了简要的分析。
本章主要介绍系统的实现情况及实验结果。\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:实验拓扑}在实验中共使用三台虚拟机记作ABC作为转发以及用户接入客户端使用另外一台虚拟机作为控制器。利用控制器建立A经由B到达C的链路其中AB间的链路为模拟低质量链路存在丢包往返时延\SI{50}{ms}BC间的链路为模拟高质量链路为不丢包的链路往返时延\SI{50}{ms}。两条链路的带宽均为\SI{100}{Mbps}。通过调整AB间链路的丢包率并测量AC之间的传输性能可以测量本文提出的方法与直接进行转发的基准方案的性能并进行对比。
本文作者使用Rust语言实现了设计的分布式转发与控制系统实现了动态FEC编解码、丢包统计及参数自动计算等所有核心设计要点。本文实验在一台配备两颗Intel Xeon E5-2620 v3处理器的服务器上进行整机共提供12个物理核心、24个逻辑CPU。服务器共搭载\SI{64}{GiB}运行内存。本文中的实验使用Rattan\cite{wang2025rattan}对网络上的丢包延迟及带宽限速进行模拟。在实验中多台不同的虚拟机通过虚拟交换机互联并在每台虚拟机的虚拟出口使用Rattan对网络流量进行处理以达成对链路延迟、丢包带宽等不同性质的模拟。如图~\ref{fig:实验拓扑}在实验中共使用三台虚拟机记作ABC作为转发以及用户接入客户端使用另外一台虚拟机作为控制器。利用控制器建立A经由B到达C的链路其中AB间的链路为模拟低质量链路存在丢包往返时延\SI{50}{ms}BC间的链路为模拟高质量链路为不丢包的链路往返时延\SI{50}{ms}。两条链路的带宽均为\SI{100}{Mbps}。通过调整AB间链路的丢包率并测量AC之间的传输性能可以测量本文提出的方法与直接进行转发的基准方案的性能并进行对比。
实验时分别选取丢包率取从0至2\%的不同值分别使用本文提出的动态链路优化算法与直接进行转发的方法在A、C间使用iperf3进行测速持续\SI{60}{s},并记录收端的接收速率。
@@ -22,7 +22,7 @@
\section{实验结果与分析}
\label{sec:实验结果}
实验结果如图\ref{fig:实验结果图}所示。图\ref{fig:吞吐绝对值}展示了不同丢包率下两种方法的端到端吞吐量,图\ref{fig:吞吐相对提升}展示了本文方法相对于直接转发基准方案的吞吐提升程度。
实验结果如图~\ref{fig:实验结果图}所示。图~\ref{fig:吞吐绝对值} 展示了不同丢包率下两种方法的端到端吞吐量,图~\ref{fig:吞吐相对提升} 展示了本文方法相对于直接转发基准方案的吞吐提升程度。
\begin{figure}[H]
\centering
@@ -41,5 +41,5 @@
值得注意的是虽然从本方法的吞吐量从无丢包至有丢包有较大下降但是随着丢包率的增高吞吐量的下降程度明显小于直接转发行为这是由于本方法的动态FEC参数决定算法动态根据测量得到的丢包率参数决定了合适的冗余度从而有效地将修复后的丢包率维持在较为固定的范围内因而尽管底层链路的丢包率持续恶化但是上层TCP连接感知的丢包率却始终稳定使得最终的吞吐量也稳定在较为稳定的范围内。
在丢包率为零的场景下使用直接转发能达到比使用本方法略高的性能这主要是由于本方法所使用的FEC算法在不启用冗余时也仍旧需要在数据包中传输少量额外的包头导致吞吐量相比直接转发有大约1\%的下降,相比于存在丢包场景下的性能提升较小。
在丢包率为零的场景下使用直接转发能达到比使用本方法略高的性能这主要是由于本方法所使用的FEC算法在不启用冗余时也仍旧需要在数据包中传输少量额外的包头导致吞吐量相比直接转发有大约\SI{1}{\percent}的下降,相比于存在丢包场景下的性能提升较小。

View File

@@ -0,0 +1,281 @@
<mxfile host="app.diagrams.net" pages="2">
<diagram id="Ld0PZ8iOJT0iBC0hIplM" name="Page-2">
<mxGraphModel dx="933" dy="648" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="1rsUc46_5Y9y6vJJpw89-23" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontFamily=Microsoft YaHei;" value="" vertex="1">
<mxGeometry height="225" width="120" x="650" y="237.5" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontFamily=Microsoft YaHei;" value="" vertex="1">
<mxGeometry height="225" width="120" x="420" y="237.5" as="geometry" />
</mxCell>
<mxCell id="4KGLoNyMlWUnwfG8zy26-1" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontFamily=Microsoft YaHei;" value="" vertex="1">
<mxGeometry height="180" width="120" x="210" y="260" as="geometry" />
</mxCell>
<mxCell id="4KGLoNyMlWUnwfG8zy26-2" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=25;fontFamily=Microsoft YaHei;" value="Node 1" vertex="1">
<mxGeometry height="30" width="105" x="217.5" y="270" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-5" edge="1" parent="1" source="4KGLoNyMlWUnwfG8zy26-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeWidth=2;" target="4KGLoNyMlWUnwfG8zy26-4">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="4KGLoNyMlWUnwfG8zy26-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;fontFamily=Microsoft YaHei;" value="TUN" vertex="1">
<mxGeometry height="40" width="95" x="222.5" y="310" as="geometry" />
</mxCell>
<mxCell id="4KGLoNyMlWUnwfG8zy26-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=20;fontFamily=Microsoft YaHei;" value="FEC编码" vertex="1">
<mxGeometry height="40" width="95" x="222.5" y="390" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-7" edge="1" parent="1" source="4KGLoNyMlWUnwfG8zy26-4" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=2;" target="1rsUc46_5Y9y6vJJpw89-6">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-9" connectable="0" parent="1rsUc46_5Y9y6vJJpw89-7" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontFamily=Microsoft YaHei;fontSize=20;" value="公网链路" vertex="1">
<mxGeometry relative="1" x="-0.064" y="-3" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="4KGLoNyMlWUnwfG8zy26-6" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=20;fontFamily=Microsoft YaHei;" value="用户" vertex="1">
<mxGeometry height="30" width="50" x="140" y="315" as="geometry" />
</mxCell>
<mxCell id="Brhk0VF70q9vH42PsAyj-1" edge="1" parent="1" source="4KGLoNyMlWUnwfG8zy26-6" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=2;" target="4KGLoNyMlWUnwfG8zy26-3" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="510" y="460" as="sourcePoint" />
<mxPoint x="560" y="410" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-2" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=25;fontFamily=Microsoft YaHei;" value="Node 2" vertex="1">
<mxGeometry height="30" width="105" x="427.5" y="247.5" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-26" edge="1" parent="1" source="1rsUc46_5Y9y6vJJpw89-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeWidth=2;" target="1rsUc46_5Y9y6vJJpw89-12">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-6" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=20;fontFamily=Microsoft YaHei;" value="FEC解码&lt;div&gt;丢包统计&lt;/div&gt;" vertex="1">
<mxGeometry height="60" width="95" x="432.5" y="287.5" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-11" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;fontFamily=Microsoft YaHei;" value="速率控制" vertex="1">
<mxGeometry height="40" width="95" x="432.5" y="357.5" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-12" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=20;fontFamily=Microsoft YaHei;" value="FEC编码" vertex="1">
<mxGeometry height="40" width="95" x="432.5" y="413" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-14" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=25;fontFamily=Microsoft YaHei;" value="Node N" vertex="1">
<mxGeometry height="30" width="105" x="657.5" y="247.5" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-27" edge="1" parent="1" source="1rsUc46_5Y9y6vJJpw89-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeWidth=2;" target="1rsUc46_5Y9y6vJJpw89-25">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-18" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=20;fontFamily=Microsoft YaHei;" value="FEC解码&lt;div&gt;丢包统计&lt;/div&gt;" vertex="1">
<mxGeometry height="60" width="95" x="662.5" y="287.5" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-19" edge="1" parent="1" source="1rsUc46_5Y9y6vJJpw89-12" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=2;" target="1rsUc46_5Y9y6vJJpw89-18">
<mxGeometry relative="1" as="geometry">
<mxPoint x="648" y="432" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-22" connectable="0" parent="1rsUc46_5Y9y6vJJpw89-19" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=20;fontFamily=Microsoft YaHei;" value="若干次转发" vertex="1">
<mxGeometry relative="1" x="-0.0056" y="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-24" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=20;fontFamily=Microsoft YaHei;" value="速率控制" vertex="1">
<mxGeometry height="40" width="95" x="662.5" y="357.5" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-29" edge="1" parent="1" source="1rsUc46_5Y9y6vJJpw89-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=2;" target="1rsUc46_5Y9y6vJJpw89-28">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-25" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=20;fontFamily=Microsoft YaHei;" value="TUN" vertex="1">
<mxGeometry height="40" width="95" x="662.5" y="413" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-28" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=20;fontFamily=Microsoft YaHei;" value="用户" vertex="1">
<mxGeometry height="30" width="50" x="790" y="418" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-30" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontSize=25;fontFamily=Microsoft YaHei;" value="" vertex="1">
<mxGeometry height="100" width="230" x="380" y="100" as="geometry" />
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-31" edge="1" parent="1" source="1rsUc46_5Y9y6vJJpw89-18" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=0;exitDx=0;exitDy=0;strokeColor=#FF9933;strokeWidth=2;dashed=1;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" target="4BOI32kT3DeUbctDIWOm-3">
<mxGeometry relative="1" as="geometry">
<mxPoint x="510" y="100" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-32" edge="1" parent="1" source="1rsUc46_5Y9y6vJJpw89-6" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0;exitDx=0;exitDy=0;strokeColor=#FF9933;strokeWidth=2;dashed=1;entryX=0.6;entryY=0.979;entryDx=0;entryDy=0;entryPerimeter=0;" target="4BOI32kT3DeUbctDIWOm-3">
<mxGeometry relative="1" as="geometry">
<mxPoint x="852" y="378" as="sourcePoint" />
<mxPoint x="440" y="100" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-34" edge="1" parent="1" source="4BOI32kT3DeUbctDIWOm-3" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.846;entryY=0.071;entryDx=0;entryDy=0;strokeColor=#FF9933;strokeWidth=2;dashed=1;entryPerimeter=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;" target="4KGLoNyMlWUnwfG8zy26-4">
<mxGeometry relative="1" as="geometry">
<mxPoint x="353" y="100" as="sourcePoint" />
<mxPoint x="540" y="230" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-35" edge="1" parent="1" source="4BOI32kT3DeUbctDIWOm-3" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.144;entryY=-0.004;entryDx=0;entryDy=0;strokeColor=#FF9933;strokeWidth=2;dashed=1;entryPerimeter=0;exitX=0.407;exitY=0.958;exitDx=0;exitDy=0;exitPerimeter=0;" target="1rsUc46_5Y9y6vJJpw89-12">
<mxGeometry relative="1" as="geometry">
<mxPoint x="380" y="70" as="sourcePoint" />
<mxPoint x="540" y="220" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="4BOI32kT3DeUbctDIWOm-1" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=25;fontFamily=Microsoft YaHei;" value="控制器" vertex="1">
<mxGeometry height="30" width="105" x="445" y="110" as="geometry" />
</mxCell>
<mxCell id="OVRyA5cAgbwWEsEiYZpN-1" edge="1" parent="1" source="4BOI32kT3DeUbctDIWOm-2" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;strokeWidth=2;fillColor=#a0522d;strokeColor=#6D1F00;" target="4KGLoNyMlWUnwfG8zy26-1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="4BOI32kT3DeUbctDIWOm-2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=20;fontFamily=Microsoft YaHei;" value="连接管理" vertex="1">
<mxGeometry height="40" width="95" x="390" y="150" as="geometry" />
</mxCell>
<mxCell id="4BOI32kT3DeUbctDIWOm-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=20;fontFamily=Microsoft YaHei;" value="编码管理" vertex="1">
<mxGeometry height="40" width="95" x="505" y="150" as="geometry" />
</mxCell>
<mxCell id="OVRyA5cAgbwWEsEiYZpN-2" edge="1" parent="1" source="4BOI32kT3DeUbctDIWOm-2" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;strokeWidth=2;fillColor=#a0522d;strokeColor=#6D1F00;" target="1rsUc46_5Y9y6vJJpw89-1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="473" y="220" as="sourcePoint" />
<mxPoint x="330" y="330" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="OVRyA5cAgbwWEsEiYZpN-3" edge="1" parent="1" source="4BOI32kT3DeUbctDIWOm-2" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;strokeWidth=2;fillColor=#a0522d;strokeColor=#6D1F00;" target="1rsUc46_5Y9y6vJJpw89-23">
<mxGeometry relative="1" as="geometry">
<mxPoint x="593" y="190" as="sourcePoint" />
<mxPoint x="450" y="300" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="1rsUc46_5Y9y6vJJpw89-36" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Microsoft YaHei;fontSize=20;" value="&lt;div&gt;收取丢包率信息&lt;/div&gt;下发编码参数" vertex="1">
<mxGeometry height="60" width="150" x="612.5" y="140" as="geometry" />
</mxCell>
<mxCell id="7D4wQrk56QkGn_iMHcGr-1" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontFamily=Microsoft YaHei;fontSize=20;" value="&lt;div&gt;下发转发策略&lt;/div&gt;" vertex="1">
<mxGeometry height="30" width="126.5" x="253.5" y="155" as="geometry" />
</mxCell>
<mxCell id="7D4wQrk56QkGn_iMHcGr-2" edge="1" parent="1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeWidth=2;">
<mxGeometry relative="1" as="geometry">
<mxPoint x="200" y="90" as="sourcePoint" />
<mxPoint x="270" y="90" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="7D4wQrk56QkGn_iMHcGr-3" edge="1" parent="1" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=0;exitDx=0;exitDy=0;strokeColor=#FF9933;strokeWidth=2;dashed=1;">
<mxGeometry relative="1" as="geometry">
<mxPoint x="200" y="120" as="sourcePoint" />
<mxPoint x="270" y="120" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="7D4wQrk56QkGn_iMHcGr-4" edge="1" parent="1" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;strokeWidth=2;fillColor=#a0522d;strokeColor=#6D1F00;">
<mxGeometry relative="1" as="geometry">
<mxPoint x="200" y="130" as="sourcePoint" />
<mxPoint x="270" y="130" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="7D4wQrk56QkGn_iMHcGr-5" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=20;fontFamily=Microsoft YaHei;" value="数据流量" vertex="1">
<mxGeometry height="30" width="87.5" x="272.5" y="70" as="geometry" />
</mxCell>
<mxCell id="7D4wQrk56QkGn_iMHcGr-6" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=20;fontFamily=Microsoft YaHei;" value="控制指令" vertex="1">
<mxGeometry height="30" width="87.5" x="273" y="110" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram name="GPT" id="system-overview">
<mxGraphModel dx="1119" dy="777" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="title" parent="1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;fontFamily=Microsoft YaHei;fontSize=20;fontStyle=1;" value="系统总体架构" vertex="1">
<mxGeometry height="30" width="170" x="330" y="60" as="geometry" />
</mxCell>
<mxCell id="coord" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontFamily=Microsoft YaHei;fontSize=14;fontStyle=1;" value="Coordinator&lt;div&gt;中心控制器&lt;/div&gt;" vertex="1">
<mxGeometry height="70" width="210" x="310" y="110" as="geometry" />
</mxCell>
<mxCell id="coord_path" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#6c8ebf;fontFamily=Microsoft YaHei;fontSize=12;" value="连接管理 / 路径配置&lt;div&gt;flow_id 分配&lt;/div&gt;" vertex="1">
<mxGeometry height="50" width="160" x="220" y="210" as="geometry" />
</mxCell>
<mxCell id="coord_fec" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#6c8ebf;fontFamily=Microsoft YaHei;fontSize=12;" value="FEC 参数计算&lt;div&gt;搜索 (d, k)&lt;/div&gt;" vertex="1">
<mxGeometry height="50" width="160" x="450" y="210" as="geometry" />
</mxCell>
<mxCell id="coord_to_path" edge="1" parent="1" source="coord" style="endArrow=classic;html=1;rounded=0;strokeColor=#6c8ebf;" target="coord_path">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="coord_to_fec" edge="1" parent="1" source="coord" style="endArrow=classic;html=1;rounded=0;strokeColor=#6c8ebf;" target="coord_fec">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="user_a" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontFamily=Microsoft YaHei;fontSize=13;" value="用户 A" vertex="1">
<mxGeometry height="40" width="70" x="30" y="520" as="geometry" />
</mxCell>
<mxCell id="tun_a" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#666666;fontFamily=Microsoft YaHei;fontSize=12;" value="TUN" vertex="1">
<mxGeometry height="40" width="55" x="125" y="520" as="geometry" />
</mxCell>
<mxCell id="node_a" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontFamily=Microsoft YaHei;fontSize=13;fontStyle=1;" value="Node A&lt;div&gt;转发节点&lt;/div&gt;" vertex="1">
<mxGeometry height="170" width="130" x="210" y="430" as="geometry" />
</mxCell>
<mxCell id="a_thread" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#9673a6;fontFamily=Microsoft YaHei;fontSize=12;" value="per-flow 线程" vertex="1">
<mxGeometry height="32" width="100" x="225" y="475" as="geometry" />
</mxCell>
<mxCell id="encoder" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontFamily=Microsoft YaHei;fontSize=12;" value="FEC 编码器&lt;div&gt;低质量片段启用&lt;/div&gt;" vertex="1">
<mxGeometry height="50" width="100" x="225" y="525" as="geometry" />
</mxCell>
<mxCell id="node_b" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontFamily=Microsoft YaHei;fontSize=13;fontStyle=1;" value="Node B&lt;div&gt;修复片段出口&lt;/div&gt;" vertex="1">
<mxGeometry height="210" width="150" x="410" y="410" as="geometry" />
</mxCell>
<mxCell id="decoder" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontFamily=Microsoft YaHei;fontSize=12;" value="FEC 解码器&lt;div&gt;丢包恢复 / 统计&lt;/div&gt;" vertex="1">
<mxGeometry height="55" width="120" x="425" y="450" as="geometry" />
</mxCell>
<mxCell id="pacer" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;fontFamily=Microsoft YaHei;fontSize=12;" value="Pacer&lt;div&gt;PI 匀速输出&lt;/div&gt;" vertex="1">
<mxGeometry height="55" width="120" x="425" y="535" as="geometry" />
</mxCell>
<mxCell id="node_c" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontFamily=Microsoft YaHei;fontSize=13;fontStyle=1;" value="Node C&lt;div&gt;转发节点&lt;/div&gt;" vertex="1">
<mxGeometry height="100" width="110" x="630" y="450" as="geometry" />
</mxCell>
<mxCell id="tun_b" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#666666;fontFamily=Microsoft YaHei;fontSize=12;" value="TUN" vertex="1">
<mxGeometry height="40" width="55" x="765" y="520" as="geometry" />
</mxCell>
<mxCell id="user_b" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontFamily=Microsoft YaHei;fontSize=13;" value="用户 B" vertex="1">
<mxGeometry height="40" width="70" x="845" y="520" as="geometry" />
</mxCell>
<mxCell id="data_label" parent="1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;fontFamily=Microsoft YaHei;fontSize=13;" value="数据面TUN 虚拟网卡 + UDP 隧道转发" vertex="1">
<mxGeometry height="30" width="290" x="320" y="650" as="geometry" />
</mxCell>
<mxCell id="control_label" parent="1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;fontFamily=Microsoft YaHei;fontSize=13;" value="控制面:统计上报与参数 / 转发表下发" vertex="1">
<mxGeometry height="30" width="280" x="300" y="300" as="geometry" />
</mxCell>
<mxCell id="u_to_tun" edge="1" parent="1" source="user_a" style="endArrow=classic;html=1;rounded=0;" target="tun_a">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tun_to_a" edge="1" parent="1" source="tun_a" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.65;entryDx=0;entryDy=0;" target="node_a">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="a_to_b" edge="1" parent="1" source="node_a" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;strokeColor=#b85450;exitX=1;exitY=0.65;exitDx=0;exitDy=0;entryX=0;entryY=0.55;entryDx=0;entryDy=0;" target="node_b" value="公网 UDP 隧道&lt;div&gt;低质量链路片段&lt;/div&gt;">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="b_to_c" edge="1" parent="1" source="node_b" style="endArrow=classic;html=1;rounded=0;strokeWidth=2;strokeColor=#82b366;exitX=1;exitY=0.55;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="node_c" value="公网 UDP 隧道&lt;div&gt;普通转发&lt;/div&gt;">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="c_to_tun" edge="1" parent="1" source="node_c" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.7;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="tun_b">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="tun_to_user" edge="1" parent="1" source="tun_b" style="endArrow=classic;html=1;rounded=0;" target="user_b">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="fec_internal" edge="1" parent="1" source="decoder" style="endArrow=classic;html=1;rounded=0;strokeColor=#666666;" target="pacer">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="flow_config_a" edge="1" parent="1" source="coord_path" style="endArrow=classic;html=1;rounded=0;dashed=1;strokeColor=#6c8ebf;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="node_a" value="转发表 / flow_id / (d,k)">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="flow_config_b" edge="1" parent="1" source="coord_path" style="endArrow=classic;html=1;rounded=0;dashed=1;strokeColor=#6c8ebf;exitX=1;exitY=0.8;exitDx=0;exitDy=0;entryX=0.3;entryY=0;entryDx=0;entryDy=0;" target="node_b" value="转发表 / 解码配置">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="stats_to_coord" edge="1" parent="1" source="decoder" style="endArrow=classic;html=1;rounded=0;dashed=1;strokeColor=#b85450;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" target="coord_fec" value="丢包统计上报">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="param_to_encoder" edge="1" parent="1" source="coord_fec" style="endArrow=classic;html=1;rounded=0;dashed=1;strokeColor=#b85450;exitX=0;exitY=0.8;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="encoder" value="FEC 参数下发">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="legend_control" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#6c8ebf;dashed=1;fontFamily=Microsoft YaHei;fontSize=12;" value="虚线:控制面" vertex="1">
<mxGeometry height="32" width="110" x="55" y="690" as="geometry" />
</mxCell>
<mxCell id="legend_data" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#666666;fontFamily=Microsoft YaHei;fontSize=12;" value="实线:数据面" vertex="1">
<mxGeometry height="32" width="110" x="180" y="690" as="geometry" />
</mxCell>
<mxCell id="legend_fec" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontFamily=Microsoft YaHei;fontSize=12;" value="红色:修复链路" vertex="1">
<mxGeometry height="32" width="120" x="305" y="690" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 345 KiB