1.概述
基础恢复功能位于排序功能中。它评估从较低层向上传递的一个或多个成员流的数据包的sequence_number子参数,以丢弃重复的数据包。基本恢复功能的给定实例化可以作为序列恢复功能或单个恢复功能。
序列恢复功能有两种序列恢复算法,因此它既可用于间歇流,也可用于批量流。只要给定序列恢复功能所服务的成员流所采取的所有路径中飞行中的数据包数量的最大差异不超过SequenceHistory变量的大小,数据包就可以无重复地传递,但也可以乱序传递。如果差值超过此值,则可以传递重复的数据包。
FRER恢复功能不得处理数据包,除非已成功完成较低级别的数据包有效性检查(例如IEEE Std 802.3[B2],帧校验序列)。
简单描述:参考sequence_number子参数,判断是否为重复的数据包,丢弃重复数据包。
2.基础恢复功能
2.1 VRA
VRA(Vector Recovery Algorithm):在调用SequenceRecoveryReset后,VectorRecoveryAlgorith立即接受接收到的第一个数据包为有效数据包。在第一个数据包被接受后,窗口中最后一个数据包编号接受±frerSeqRcvyHistoryLength的所有后续数据包都将被接受,序列号值超出该范围的数据包将被丢弃。每个被接受并向上传递到堆栈的数据包都会重置计时器变量RemainingTicks。如果该变量向下勾选为0,这意味着在frerSeqRcvyResetMSec毫秒内没有接受任何数据包,则SequenceRecoveryReset会再次重置算法,并接受下一个接收到的数据包。
如果托管对象frerSeqRcvyHistoryLength包含值1,则此算法适用于间歇流。在这种情况下,SequenceHistory变量仅记录RecovSeqNum是否记录了接收到的数据包的sequence_number子参数。如果frerSeqRcvyHistoryLength包含大于1的值,则VectorRecoveryAlgorith将作为适用于批量流的更复杂的算法。
VRA通过构建向量来存储最大可以转发的sequence number,并且保存了一个已经转发的number的历史记录。这种算法不仅考虑了最新的sequence number,还追踪了帧的传输历史,从而能够在更复杂的网络环境中准确地判断和处理帧的重复与丢失问题。
简单描述:在一个窗口内判断序列号是否重复,丢弃重复的数据包。
2.2 MRA
MRA(Match Recovery Algorithm):这种算法存储了最后一个访问的sequence number。当接收到一个新的帧时,如果其sequence number与存储的最后一个访问的sequence number不同,则进行转发;如果相同,则表示该帧为副本,因此进行丢弃。这种机制有助于消除重复的数据帧,确保数据的唯一性和有效性。
MatchRecoveryAlgority立即接受收到的第一个数据包为有效数据包。在第一个数据包被接受后,所有后续数据包要么与最后一个被接受的数据包编号匹配,因此被丢弃,要么不匹配,在这种情况下,它们被接受。每个被接受并向上传递到堆栈的数据包都会重置计时器变量RemainingTicks。如果该变量向下勾选为0,这意味着在frerSeqRcvyResetMSec毫秒内没有接受任何数据包,则SequenceRecoveryReset会再次重置算法,并接受下一个接收到的数据包。
简单描述:2.1中的窗口值为1。
3.独立恢复功能
定义了个体恢复功能,以满足稳健性目标。它通过删除从卡住的发射机接收到的重复序列号数据包来实现这一点。Individual恢复功能的实例化由Base恢复功能的实例化组成,其frerSeqRcvyPindividualRecovery对象设置为True,配置为应用于单个成员流。[序列恢复功能在复合流的所有成员流上运行。]单个恢复功能的实例化不包括潜在错误检测功能的实例。个体恢复功能的实例化可以采用矢量恢复算法或匹配恢复算法。
这里建议使用匹配恢复算法。
4.Latent error detection function
4.1 概述
潜在错误检测功能的每个实例都是序列恢复功能的一部分。它监视与Base恢复功能的单个实例关联的受管对象,以检测该功能丢弃的数据包相对较少的情况。潜在错误检测基于以下假设进行操作:在使用n条路径进入当前系统的功能正常的复合流中,通过基础恢复功能的每个数据包都会丢弃n-1个数据包。当违反该假设时,潜在错误检测功能会发出信号警报。
每个端口每个stream_handle值每个方向(面向内或面向外)最多有一个潜在的错误检测功能,如通过控制这两个功能的管理对象所指定的。对于配置的每个基本恢复功能,只能有零个或一个相关的潜在错误检测功能。任何支持基础恢复功能的实现都应支持潜在错误检测功能。
潜在错误检测由两个周期函数完成。第一个(LatentErrorTest,7.4.4.4)检查通过和丢弃的数据包数量,如果这些计数器之间的差异超过设定的阈值,则报告潜在错误。另一个周期性函数(LatentErrorReset,7.4.4.3)重置第一个函数使用的变量,这样偶尔的随机数据包丢失就不会永远累积。这些功能是由计时器驱动的,而不是由数据包的接收或传输驱动的。
4.2 参数说明
4.2.1 CurBaseDifference
CurBaseDifference 变量是一个无符号整数,其大小与计算其值的计数器(例如 frerCpsSeqRcvyPassedPackets,10.8.5)相同。它包含上次调用 LatentErrorReset 函数(7.4.4.3)时预期丢弃数据包数量与实际丢弃数据包数量之间的偏移量。
计算预期丢弃数据包数量与实际丢弃数据包数量之间的偏移量
4.2.2 LatentErrorReset
每当发生 BEGIN 事件或 RESET_LATENT_ERROR事件时,都会调用 LatentErrorReset。
它会根据 frerCpsSeqRcvyPassedPackets、frerSeqRcvyLatentErrorPaths和 frerCpsSeqRcvyDiscardedPackets重新计算 CurBaseDifference变量,并增加 frerCpsSeqRcvyLatentErrorResets。
void LatentErrorReset ()
{ CurBaseDifference = (frerCpsSeqRcvyPassedPackets *
(frerSeqRcvyLatentErrorPaths - 1)) - frerCpsSeqRcvyDiscardedPackets;
frerCpsSeqRcvyLatentErrorResets = frerCpsSeqRcvyLatentErrorResets +1;
}
frerCpsSeqRcvyPassedPackets:对于通过VectorRecoveryAlgority或MatchRecoveryAlgrithm向上传递的每个数据包递增一次。
- 通过包的数量 A
frerSeqRcvyLatentErrorPaths: FRER在此基础恢复功能和潜在错误检测功能的实例中运行的路径的整数。
- 路径数量 B
frerCpsSeqRcvyDiscardedPackets: 对于矢量恢复算法或匹配恢复算法因序列号重复而丢弃的每个数据包,frerCpsSeqRcvyDiscardedPackets计数器递增一次
- 丢弃数据包的数量 C
偏移量 D =A*(B-1)-C
4.2.3 LatentErrorTest
每当发生 TRIGGER_LATENT_ERROR_TEST 事件时,就会调用 LatentErrorTest。它使用 CurBaseDifference、frerCpsSeqRcvyPassedPackets、frerSeqRcvyLatentErrorPaths、frerCpsSeqRcvyDiscardedPackets、frerSeqRcvyLatentErrorPeriod和 frerSeqRcvyLatentErrorDifference来测试序列恢复函数丢弃的数据包数量是否大约为预期数量,如果不是,则触发事件。
void LatentErrorTest () {
int diff = CurBaseDifference - ((frerCpsSeqRcvyPassedPackets *
(frerSeqRcvyLatentErrorPaths - 1)) -frerCpsSeqRcvyDiscardedPackets);
if (frerSeqRcvyLatentErrorPaths > 1 && // 有多条路径
frerSeqRcvyLatentErrorPeriod > 0 ) // LE 检测已开启
{
if (diff < 0)
diff = - diff;
if (diff > frerSeqRcvyLatentErrorDifference)
{ SIGNAL_LATENT_ERROR; }
}
}
frerSeqRcvyLatentErrorPeriod: LatentErrorTest 函数运行实例之间经过的整数毫秒数(7.4.4.4)。默认值为 2000(2 秒)。可以设置 frerSeqRcvyLatentErrorPeriod 的最小值,低于该值则无法设置,但该最小值不得大于 1000 毫秒(1 秒)。
frerSeqRcvyLatentErrorDifference: 一个整数,指定 frerCpsSeqRcvyDiscardedPackets 与 frerCpsSeqRcvyPassedPackets 和 (frerSeqRcvyLatentErrorPaths – 1) (10.4.1.12.3) 的乘积之间的最大允许差值。任何较大的差值都将触发 LatentErrorTest 函数 (7.4.4.4) 对潜在错误的检测。
注意——该算法实际上具有 2 的量化误差。也就是说,如果用户在 LatentErrorTest 和 LatentErrorReset 的时间安排上运气不佳,则可能需要 2*frerSeqRcvyLatentErrorDifference 的差异才能触发故障。
欢迎大家交流讨论