ION-DTN-前向纠错编码ECLSA详细介绍
作者:互联网
ION-DTN是NASA提出的针对DTN网络架构的具体实现方案。旨在解决深空通信的高延时、高误码、频繁中断等链路问题。
ION中目前依靠LTP协议进行中断的重传处理。但在深空这种长延时环境中,重传所耗费的时间和资源过于庞大,比如地球与火星的通信,即使的激光通信,最短也需要3分钟,最长则需要33分钟。如此长的重传时间是QoS的灾难。
因此ION在3.6.0版本以后,增加了前向纠错编码ECLSA这个模块。通过纠错编码可恢复部分甚至全部丢失的数据,减少重传。接下来对其详细介绍。
一. ECLSA作为链路服务适配器Link Service Adapter
在DTN架构中,LTP作为收敛层,经过LTP segment分割后,必须将LTP segment转移到相应的较低层的协议;这个协议可以是UDP或者是CCSDS。LSA是这些较低协议的接口。ECLSA (Error Correction Link Service Adapter)是UDPLSA以及其他LSA的一个新的替代品。在将LTP段封装到低层协议(如UDP或其他特定于CCSDS的协议)之前,它使用包级正向纠错来保护LTP段。下图,展示了两个DTN节点的网络堆栈使用UDP之上的ECLSA:
值得注意的是,同一个DTN节点可以使用具有不同LSA的LTP层与不同链接上的不同节点通信。如下图所示,同时存在UDPLSA和ECLSA。在图中,每一个LSA分为导入通道和导出通道,前者用于管理输入数据;后者是数据流出。
理论上,ECLSA对LTP是透明的。这意味着可以以最自然的方式支持LTP块的绿色和红色部分数据。但是,在实际中,红色部分数据的LTP RTO计时器必须考虑到由于使用FEC(前向纠错)而导致的额外延迟。
二. ECLSA的发展历程
在LTP中引入擦除码的想法是由德国宇航局DLR的Tomaso de Cola提出的。LTP允许用户以可靠的方式传输捆绑包,作为LTP块的红色部分的有效负载。但是,在存在损耗的情况下,丢失的LTP段的每个重传周期至少会给传输时间增加一个往返时间(RTT):传播延迟越大,惩罚时间越长。因此,在空间环境中,传播延迟非常长(从地球到月球为1秒,从地球到火星为3到20分钟)
防止重传是非常可取的。这就是ECLSA的目标,它将FEC添加到LTP段中,以减少重传次数和时间。
ECLSA的第一次实施可以追溯到2013年,当时Pietrofrancesco Apollonio是该项目的一名博洛尼亚大学学生。作为他的硕士论文(在DLR的支持下,DLR给了他一笔资助)完成了这项任务。
目前,ECLSA已经迭代到2.0版本,ECLSA 2.0增加了许多新特性,大大扩展了以前的版本。下面是一个简短的列表:
a.在运行时动态选择FEC代码
b.根据要传输的数据量或估计段丢失率,或两者兼备,动态选择FEC代码。
c.目的地提供的反馈
d.将多个ECLSO (LTP源)连接到同一个ECLSI (LTP目的地)的可能性
e.独立于上层和下层协议;它可以在与LTP不同的上层协议下使用,也可以在与UDP不同的底层协议上使用。
三. ECLSA处理逻辑大致描述
CLSA具有引入前向纠错(FEC)的功能,将底层协议的丢包掩盖到上层协议。从现在开始,除非另有规定,否则我们将把LTP作为上层协议,UDP作为下层协议。如前所述,在DTN场景中,ECLSA的目标是最小化LTP段的重传周期,即最小化LTP所看到的损失。
在这里,我们将只进行非常简单的初步描述,提供ECLSA执行的过程的一般框架。如下图所示。
首先要强调的是,这里将通常的FEC概念应用于包而不是位(bit)。我们将从发送方(即ECLSO)开始这个初步描述。
a.矩阵填充(来自LTP segment的数据)
将K个LTP segment传递给ECLSA;每段为一个信息符号(图中为信息包);它们被写成n行矩阵(n符号码字,或编码矩阵)的行。
b.矩阵编码
在矩阵的最后M行中添加M=N-K冗余符号(图中为奇偶校验包)。码率Rc=K/N表示每个码字符号的信息量。码率越低,引入的冗余量就越大。
c.矩阵传输(传输给UDP)
行依次传递给UDP;每一行将封装成一个UDP数据报。
UDP数据报依次传递到底层协议并传输到接收节点。与往常一样,该过程是透明的,因此上层(如UDP)的协议不应该关心底层发生了什么。在实践中,UDP和ECLSA在接收端看到的唯一损害是由拥塞或噪声造成的损失(翻转的位导致底层CRC检查失败,从而导致整个数据包被丢弃)。丢失的包,即丢失的符号用图右侧的叉表示;当然,信息和冗余包都可能丢失,如图右侧所示,丢失的包画了叉。
现在准备描述在接收端发生了什么,即ECLSI执行了哪些步骤。我们可以区分以下三个阶段,这是刚才描述的两个阶段的镜像,但顺序相反(从UDP到LTP):
a.矩阵填充(来自UDP)
设L为丢包数;N-L个UDP数据包到达;它们的有效载荷是在一个N行矩阵(接收端的N个码字)中读取和写入的,在对应丢失的符号时留下间隙(即由零填充的行)。也就是L行都是由零填充的丢失的行。
b.矩阵解码
解码器的目的是从N-L接收的符号中提取K个信息符号(即我们的K个LTP segment)。如果解码成功,所有前K行最终都被填满。即通过利用冗余符号可以恢复丢失的信息符号。因此,要获得成功,必须接收至少K个传输的N个符号,无论它们是什么(信息或冗余)。也就是说,M≥L是必须的。因为N=M+K,而解码成功的必须要求是N-L >K,那么也就是M+K-L>K,即M>L。
c.矩阵传输(传输给LTP)
矩阵的前K行,即信息符号,依次读取并传递给LTP;每一行包含一个LTP segment。
要注意的是,码率越低,每个信息符号引入的冗余越多,因此解码成功的机会就越大,但同时,冗余越高,在没有损耗或信道明显优于预期的情况下浪费的带宽就越大,因此冗余不是越大越好也不是越小越好,需要折中。
四. ECLSO工作机制详细描述
1)矩阵填充(来自LTP)
首先,让我们详细描述“编码矩阵”的组织结构。
如前所述,LTP段由LTP传递给ECLSO;每个段被认为是n符号码字的一个符号。在包编码中,就像这里一样,FECs处理的是包,而不是位,符号由给定的字节数组成,即有一个大小。如果我们把一个符号想象成长度为T的行向量(以字节为单位),那么N个码字就变成了由N行和T列组成的矩阵,也就是T为LTP segment的长度,如下图所示。
但是,描述中需要更复杂一些,因为LTP段可能比其他段更短,这通常发生在LTP块的最后一个段。为了处理这种长度多样性,必须保留符号的前两个字节(图中以黄色突出显示),以指示符号中包含的LTP段的实际大小(蓝色)。如果LTP段比T-2短,我们必须用0填充尾部字节。此外,如果接收的LTP segment数量I小于K,则需要另一种填充,在本例中,K-I空行填充了信息填充(行为白色)。在编码之后,其余M行用冗余符号(绿色)填充。
由于不可能将LTP段分割成两行,所以LTP段的最大长度是T-2。
下面的流程图显示了矩阵填充算法。当接收到第一个LTP段时,启动聚合计时器;然后在第一行中添加线段;这个过程一直持续到K段到达,即矩阵的信息部分已经满了,或者聚合计时器过期。在这两种情况下,矩阵被传递给编码器(矩阵编码阶段),然后传递给UDP(矩阵传递阶段)。
2)矩阵填充
在实际编码矩阵之前,有必要选择代码。如果代码是静态的,这很简单,如果是动态的,就复杂得多。首先介绍下CCSDS桔皮书中,FEC编码的一些规范。如下表所示。
让我们从考虑Rc固定(例如=8/9)开始,并检查不同K值的优缺点。其优点是K值越高,代码的性能就越接近理想。但是缺点也很多,比如需要分配大量内存,编码时间很长,还有当矩阵填充的定时器过期时,I和K之间会有很大的差别。我们将在这里集中讨论最后一个问题,因为它可能导致不必要的冗余。事实上,虽然没有发送K-I信息填充行(它们是空的),但是所有的M (=N-K)冗余符号都是需要真实发送的,因此,如果I<<K,结果是实际的码率(Rc_actual=I/N)可以比名义码率(Rc=K/N)低得多。因此,为了保持大代码和短代码的最佳性能,有必要引入代码的动态选择。在ECLSO设置中,我们可以根据另外两个缺点(内存和延迟)来选择Kspan,如果矩阵没有完全填满(即I<Kspan),则让系统尽可能减少实际选择的K。在考虑的示例中,K=512是最佳选择,因为500<512。简而言之,K的选择看起来像是选择最适合可变维度内容的框。
再来说说Rc,我们首先注意到Rc越小,每个信息符号引入的冗余量就越大,因此代码的擦除恢复性能就越强。例如,假设一个理想的代码,Rc=8/9,我们可以在9个包中平均恢复一个丢失的包,也就是接收到8个包就可以恢复1个包。对于RC=4/5,就可以在接收5个包恢复一个包,RC=2/3,就可以收到3个包恢复一个包。因此,所需要的Rc的选择应该取决于对信道丢包概率的估计。如果信道是平稳的,并且先验已知,那么很容易做出正确的选择。否则,如果通道是平稳的,但事先不知道,或在时间变量,一个可能的选择是选择一个非常保守的Rc。然而,这就导致了过度的保护,即当信道比预期的要好时,对带宽的低效使用。为了解决第二个可能造成带宽浪费的原因,在ECLSA中,可以根据目标码率动态地选择代码,在时间上是可变的。
在详细研究ECLSA中使用的算法之前。,我们需要指出的是,在ECLSA中,代码的动态选择可以指K(“K连续”或“K的自适应选择”选项),也可以指码率(“反馈自适应Rc”),或者两者都指。
默认情况下(没有自适应选项集),代码的选择是静态的,因此K=Kspan和N=Nspan。反之,如果上面提到的3个自适应选项中至少有一个被设置,则选择是动态的,在这种情况下,如果矩阵是满的(I=Kspan),就不需要寻找更低的K,因此K=Kspan和所有动态K选择块都被跳过;相反,如果超时发生(I<K),并且启用了“K的自适应选择”,则在包含填充行的所有可用Ki中选择K作为最小值。如果启用了另一种“连续模式”(仅在OpenFec库中可用),则K取为I,因为代码可以针对每一个小于最大值的K进行裁剪(这就是为什么这个选项称为K Continuous)。为了简单起见,我们暂时不考虑“附加反馈Rc选项”,这样我们就可以跳过绿色块(因为绿色数据没有反馈)。如前所述,K的动态选择有助于尽可能接近目标Rc,当反馈选项关闭时,Rc是静态的(=Kspan/Nspan)。为此,必须选择最合适的N作为最后一步。
下图是ECLSO的矩阵编码流程图
现在让我们介绍Rc动态选择,它的目的是将冗余度与实际的损耗概率匹配,因此需要接收方的反馈。只有当“Feedback Adaptive
Rc”设置时,,它才是活跃的,这反过来也需要启用“Feedback Request”选项。当启动时,唯一的不同在于Rc_trgt原本是静态的,现在必须用一个根据反馈包提供的信息计算出的动态值来代替。
每个矩阵解码后,ECLSI在接收节点上发送的反馈包为发送节点上的ECLSO提供两种信息
a.接收到的符号数和期望的符号数(I+M);它们允许ECLSO更新EPLP,以便选择最佳匹配的代码
b.解码过程的成功或失败;在出现故障时,ECLSO立即用故障消息中报告的实际速率替换旧的EPLP值,从而在损失率没有进一步显著降低的情况下防止进一步的故障。这种情况在试验中证明是非常有效的.
3)矩阵传输(传输给UDP)
码矩阵后,ECLSO执行第三阶段。码字的N个符号(即矩阵的行)从矩阵中读取,并逐个封装到UDP数据报中,跳过信息填充行以节省带宽(出于同样的原因,如果符号比行短,行填充也会被删除)。在将一个符号封装到一个UDP数据报之前,要添加一个ECLSA头。此标头中包含的信息对于接收机上的ECLSI是必要的,以便在接收端正确地用接收到的符号填充编码矩阵,并在解码阶段使用与编码时相同的FEC代码。
ECLSA头文件的当前格式暂时如下(协议处于实验阶段,因此可能会进行修改)
头部包含此信息:
a.版本:该值目前设置为0。
b.ExtCount:扩展数;预留作日后之用。
c.标志:如果b0=1要求解码反馈;如果b1=1,则启用k连续模式。其他的位则留作将来使用。
d.EngineID:这个值包含节点标识符,由上层协议给出。对于LTP,它是对应的引擎ID。
e.矩阵标识符:是由某个EngineID计算的编码矩阵(即码字)的唯一标识符:对[EngineID,MatrixID]是ECLSI的唯一标识符。ECLSI请求这对数据,以知道传入包属于哪个编码矩阵。一旦ECLSI对编码矩阵的精化完成,相应的对[EngineID,MatrixID]被放入黑名单,因此该列表中所有未来到达的包将被忽略(例如,在其矩阵已经解码之后到达的无序包)。
f.SymbolID:为符号索引,即行索引;注意,它在OpenFEC编解码器库中被称为ESI。请注意,对于引用相同矩阵的ECLSA包,这是惟一更改的字段。
g. I (SegAdded):添加到编码矩阵中的LTP段的实际数。必须指定它,以便ECLSI知道矩阵填充的数量(未填充的行)。
h. K:实际用于编码的代码的FEC参数K
i. N:实际用于编码的代码的FEC参数N;为了让ECLSO知道所使用的代码(对于特定的码字,如果是动态的),K和N字段是必要的。
j. 符号大小对于ECLSI知道最大行长度是必要的
下图总结了ECLSO执行的不同级别的封装(ECLSI执行的是相反的级别)。
第一个封装在LTP接收到LTP段时完成,第二个封装在ECLSA包中封装码字符号时完成,最后一个封装在UDP数据报中封装ECLSA包时完成.
五. ECLSI工作流程详述
1)矩阵填充(来自UDP)
ECLSI的第一阶段是ECLSO最后阶段的对偶。ECLSA数据包从传入的UDP数据报中解包,然后读取每个数据包的ECLSA报头,从对[EngineID,MatrixID](惟一标识其所属的编码矩阵(即码字))到SymbolID字段(指定行),始终可以找到传入包的正确位置。这也存在于来自不同节点(即不同引擎)的无序包或并行流。字段I告诉ECLSI编码矩阵中实际存在多少信息符号(作为K-I信息填充行),而N、K和T是用于接收码字的FEC代码的参数。这四个参数与一个编码矩阵相关联,因此对于所有对应的ECLSA包都是相同的。它们被有意地复制到所有的包中,因为在存在丢失的情况下,不可能知道哪些符号到达了,哪些符号丢失了,因此只发送与特定符号关联的信息是不安全的。
在接收端并不是所有发送的符号都到达,因此定义何时可以考虑完成矩阵的编写过程是至关重要的。当下列条件之一发生时,就会发生这种情况:
a.所有的信息符号都已正确接收(这就是为什么我是必要的)。在这种情况下,不需要等待(其他)冗余段,也不需要解码。这种情况通常在信道不引入任何损耗或损耗概率非常低时得到验证。
b.最后一个冗余符号已经到达。这是在出现适度损失时通常发生的情况。
c.由同一引擎生成的符号,属于一个编码矩阵,其序列ID高于当前的ID。这个条件的概率等于丢失概率,因为它要求丢失一个特定的符号,即最后一个冗余符号(通过忽略其无序到达的概率)。
d.timeout。在接收特定码字的每个新符号时,设置一个关闭计时器
(第一个符号)或重置(其他符号);如果没有其他符号到达,则计时器过期,编码矩阵被认为是完整的。这种情况的目的是防止死锁,如果相同的引擎发送的最后一个矩阵的最后一个冗余符号丢失。
下图总结了该算法流程
2)矩阵解码
如果接收到所有的信息符号或矩阵没有编码,则跳过解码。在所有其他情况下,矩阵必须解码。为此,ECLSI必须知道所使用的代码,如前所述,该代码由参数N、K和T指定。
3)矩阵传输(传输给LTP)
解码后,去除2B标头后,将信息符号有序传递给LTP。如果设置了“请求反馈”选项标志,则会将反馈发送到源上的ECLSO引擎(参见下图)。它报告:解码状态(成功或失败,加上其他信息)、期望的符号数量(TotalSegments字段中的I+M)和实际到达的符号数量(I+M- l,接收到的段)。反馈包由ECLSI直接通过UDP发送给ECLSO,不受任何FEC的保护。因此,它可以被复制。
如果解码成功,则恢复所有信息符号,并将包含在同一编码矩阵中的所有LTP段传递给LTP;否则,就会有差距。如果这些缺失的段属于LTP块的红色部分,那么LTP将需要以对ECLSA完全透明的方式重新传输(即ECLSA嵌套在LTP中,所有LTP红色机制都位于ECLSA外部)。
六. ELCSA配置选项
1)ECLSA选项
aAdaptive Encoding.自适应编码:该特性根据添加的段I和对应的N动态选择擦除码的K,以保持所需的码率。
b.Feedback Requested 请求反馈:此功能请求接收方发送解码反馈
c.Feedback Adaptive Rc: 反馈自适应Rc:根据信道的估计丢失率和反馈包所公布的解码故障,选择码率(Rc=K/N)。它需要反馈.
d.Interleaving: 它打乱了编码矩阵行的发送顺序。最后一个永远不会改变,因为它的接收是ECLSI用来声明一个编码矩阵已完成接收的三个条件之一。交叉用于将突发信道的损耗分散到相同的编码矩阵中。
e Static MID 静态MID:设置此特性时,强制将第一个矩阵ID初始化为零。默认行为是从随机数开始的顺序中计数器,以便在ECLSO引擎重新启动时最小化与ECLSI黑名单冲突的概率(请参阅实现章节),而不重新启动对应对上的ECLSI。相比之下,从零开始使用MID可以方便地读取日志。
2)ECLSA在RC文件中的配置
在ION中,LSA的配置与两个指令相关联,分别用于输出和导入,在下面的图中,我们看到一个例子,引用一个.rc配置文件:
#Flag configuration
#MASK_ADAPTIVE_MODE bit 0 (adaptive selection of K)
#MASK_CONTINUOUS_MODE bit 1 (only with OpenFEC codec library)
#MASK_FEEDBACK_REQUEST bit 2 (feedbacks)
#MASK_FEEDBACK_ADAPTIVE_RC bit 3 (adaptive target code rate based on feedbacks)
#MASK_INTERLEAVING bit 4 (interleaving of symbols inside a codeword)
#MASK_STATIC_MID bit 5 (if set ECLSA on the receiver MUST be restarted whenever restarted on the sender)
#Example1: Static code, no feedbaks, no interleaving, random MID -> 000000 -> 0
#Example2: Static code with feedback requested -> 0000100 -> 4
#Example3: Adaptive K, feedback request, feedback adaptive Rc -> 001101 -> 13
#Example4: Continous K, feedback request, feedback adaptive Rc -> 001110 -> 14
# Pay attention to the UDP_Tx rate that MUST include the redundancy (2000000=2Mbit/s);
# Max Tx rate is also limited by usleep value in eclsi.c (interval between consecutive segments readings)
# At present 0.5 ms, i.e. no more than 2000 info segment per second; safe for 10Mbit/s
# ECLSA 2.0 N K AggTime codThr FLAGS Tx/rate (bit/s)
a span 2 15 15 1024 1 1 'eclso 10.0.1.2:1113 576 512 500 1 0 10000000'
#a span 2 8 8 1024 1 1 'udplso 10.0.1.2:1113 2000000'
# The max waiting time is the maximum tolerable interval between reception of consecutive symbols of the same codeword
# If exceeded, the codec matrix is considered completed.
# FeedbackBurst = how many copies of the feedback packet must sent back by ECLSI
# ECLSA 2.0 maxWaitingTime FeedbackBurst MaxT MaxK (opt)
# (ms) (fedback copies) (T=LTPsegmentLenght+2)
s 'eclsi 10.0.1.1:1113 100 1 1026 2048 '
#s 'udplsi 10.0.1.1:1113'
要注意的是,rc文件前面的contact中的速度与这里span中的最后一个参数10Mbit有计算关系,不可随意设置,计算方法在本章第四节。最小值(单位为bit/s)可计算为ContactTxSpeed(单位为B/s)*8/Rc:10Mbit=ContactTxSpeed(单位为B/s)*8/Rc。注意ContactTxSpeed为大B/s,Bytes/s。
LSA输出在“a span”指令中配置。通过比较eclso和udplso的语法可以看出,第一个和最后一个参数是相同的,(IP地址和端口号,Tx速率,单位为bit/s),但是ECLSA有一些新的参数。它们是:
a.N和K的缺省代码(即自适应选项关闭时所使用的代码)
b.maxAggregationTime (ms):编码矩阵发送前的最大等待时间,虽然没有完全填满(I<K);
c.编码阈值:编码所需的最小信息符号数(I);1表示始终执行编码。较高的值对于在特定情况下禁用编码非常有用(例如非常有限的流量和非常低的损失概率)。
d.flags:这是一个用于设置ECLSA选项的一字节整数。flags值是这样找到的:首先必须找到二进制值,所有选项从最重要的位到不那么重要的位(1表示启用,0表示禁用),然后必须将该值从二进制符号转换为十进制符号。让我们以下图所示的选项元组为例。
比如1110二进制对应的是十进制的14,示例中要传递的标志值是14。
而对于ECLSI的参数:
a.MaxT, T的最大大小,符号大小,其中可以是LTP段的最大大小+ 2;
b.关闭计时器(ms),解码开始前最后一个接收包的最大时间;当其他条件不满足时,作为最后的手段开始解码
c.FeedbackCopies反馈副本(整数)ECLSI必须重新发送反馈以处理损失的次数。
3)LTP和ECLSA高级设置:LTP红色定时器的额外延迟
LTP块和编码矩阵(码字)在ECLSA设计中完全解耦。这就是说,一个编码矩阵可以包含多个LTP块,反之,一个LTP块可以扩展到两个(或多个)编码矩阵上。FEC机制对LTP是完全透明的,除了LTP red重传定时器,它必须包含由于两个方向的FEC处理而产生的额外延迟,而这在空间环境中要比RTT低得多。
上行方向(数据)的额外延迟由以下几部分组成:
a.ECLSO聚合时间。这是因为它与接收第一个LTP段到强制关闭填充阶段之间的最大间隔时间一致。它作为ECLSO参数传递。它可以计算为(T-2)*Kspan/contact_Tx speed(单位为B/s)加上一个余量。Kspan越大,延迟越大,因此,如果Tx速度相对较低,则建议在ECLSO配置中不要设置非常大的Kspan,即,一般避免使用目前的K3,真的很大。
b.编码矩阵所需的时间。这取决于使用的代码。即使在这种情况下,矩阵越大,延迟越长。然而,在我们的测试中,相对于其他成分,它总是处于边缘。
c.UDP发送编码矩阵数据包而不是LTP块所需要的额外传输时间。由于LTP块大小不同,根据包的大小和聚合,这个值可以保守地计算为T*Nmax*8/UDP_Tx_rate,即矩阵的传输时间。如果基于反馈的Rc关闭,则Nmax=Nspan,否则Nmax=Kspan*1/Rc3=Kspan*3/2。
反向的额外延迟(报告段使用)由以下几部分组成:
a.ECLSO在接收器上的聚合时间,因为LTP报告段的移动方向相反
b.出于同样的原因,在接收器上编码矩阵所需的时间。
c.发送编码矩阵的额外传输时间。注意,当只有LTP信号出现在相反方向时,I<<Kspan;在这种情况下,要发送的行总数仅略大于冗余符号(M)的数量。
注意,如果通道是不对称的,并且在反向路径上没有损失,则可以跳过反向编码,从而最小化延迟(后两个贡献为null)。
如果只发送绿色块,那么唯一的延迟就是正向延迟。但是,由于没有重新传输计时器,所以它与LTP配置完全无关.
4)LTP和ECLSA高级设置:LTP、ECLSA和UDP参数约束
span指令中给出的设置也有一些内部约束:
a.:UDP有效负载对T有限制。一个ECLSA包必须包含在UDP(或其他较低层)包中。因此,如果我们想避免IP碎片和MTU=1500,我们有大约1460 (20B的IP头加上16B的IP扩展,4B的UDP头)可用的ECLSA包。由于它的头当前是17B,所以一行有1443个字节可用,即Tmax=1443。
b.LTP段必须包含在矩阵行中。由于我们有一个2字节的头,LTP段的最大长度是T-2。这个条件很容易满足,因为LTP段的大小是span指令的一个参数。在上述条件下,LTP段大小<=1441。在我们的测试中,LTP大小=1024,因此T=1026。
c.UDP的最大Tx速度(如果设置)必须足够包含冗余。最小值(单位为bit/s)可计算为ContactTxSpeed(单位为B/s)*8/Rc,其中Rc=Kspan/Nspan为反馈自适应Rc关闭,否则Rc=Rc3。
以上就是ION-DTN中前向纠错编码ECLSA的详细介绍。
标签:编码,UDP,LTP,DTN,符号,矩阵,ION,前向,ECLSA 来源: https://blog.csdn.net/hahachenchen789/article/details/89075951