ETX (Estimated Transmissions) 在 contikiRPL 中是如何实现的?
How ETX (Estimated Transmissions) is implemented in contikiRPL?
我正在为 RPL 创建 MRHOF 的修改版本。但是,我
对使用的 ETX 指标有一些疑问。我是 运行 一个 rpl-udp 示例 (..../contiki-3.0/examples/ipv6/rpl-udp)。
据我了解,ETX的一般定义如下:
ETX = 1/(df * dr)
其中 df
是数据包成功到达接收方的测量概率,dr
是成功接收 ACK 数据包的概率。
ETX的实现在neighbor_link_callback(rpl_parent_t *p, int status, int numtx)
(contiki/core/net/rpl/rpl-mrhof.c)中定义如下:
new_etx = ((uint32_t)recorded_etx * ETX_ALPHA +(uint32_t)packet_etx * (ETX_SCALE - ETX_ALPHA)) / ETX_SCALE
哪里
recorded_etx = nbr->link_metric
packet_etx = MAX_LINK_METRIC * RPL_DAG_MC_ETX_DIVISOR
nbr->link_metric = RPL_INIT_LINK_METRIC * RPL_DAG_MC_ETX_DIVISOR (rpl-dag.c)
RPL_INIT_LINK_METRIC = 2 (rpl-conf.h)
ETX_SCALE = 100
ETX_ALPHA = 90
RPL_DAG_MC_ETX_DIVISOR = 256 (rpl-private.h)
MAX_LINK_METRIC = 10
此处,每当 link 层收到 ACK 或超时事件时,都会触发此文件 (neighbor_link_callback) 中的函数。
我了解 ETX 的正式定义,但是当我尝试将标准 ETX 公式与 contikiRPL 的 ETX 公式进行映射时,我在理解 contikiRPL 中 ETX 的实现时遇到了一些麻烦。
数据包成功到达接收方的概率(df
)和ACK包成功接收的概率(dr
)是如何在ContikiRPL中实现的?
在代码中,df
和 dr
分别是未知的。该算法在发送方设备上是运行,无法区分丢包和丢ACK的情况。它们看起来完全一样:因为没有
packet_etx
的值大致对应最后一个数据包的1 / (df * dr)
。请注意,单个数据包可能已经在 link 上进行了多次重传。只有当数据包被成功确认或超过最大重传次数时才会更新指标。
Contiki 的另一个问题是,由于它是为嵌入式系统设计的,它没有足够的内存来跟踪许多最近数据包的 ETX。相反,此信息在 exponentially weighted moving average (EWMA) 过滤器的帮助下聚合为单个值。算法的\alpha
参数在代码中给出为ETX_ALPHA/ETX_SCALE;缩放是为了避免更昂贵的浮点运算。
recorded_etx
的值是ETX的前一个值,反映了之前所有数据包计算出的ETX。 new_etx
的值是前一个ETX和最后一个包的ETX经过ETX算法合并后link的ETX的值。
我正在为 RPL 创建 MRHOF 的修改版本。但是,我 对使用的 ETX 指标有一些疑问。我是 运行 一个 rpl-udp 示例 (..../contiki-3.0/examples/ipv6/rpl-udp)。
据我了解,ETX的一般定义如下:
ETX = 1/(df * dr)
其中 df
是数据包成功到达接收方的测量概率,dr
是成功接收 ACK 数据包的概率。
ETX的实现在neighbor_link_callback(rpl_parent_t *p, int status, int numtx)
(contiki/core/net/rpl/rpl-mrhof.c)中定义如下:
new_etx = ((uint32_t)recorded_etx * ETX_ALPHA +(uint32_t)packet_etx * (ETX_SCALE - ETX_ALPHA)) / ETX_SCALE
哪里
recorded_etx = nbr->link_metric
packet_etx = MAX_LINK_METRIC * RPL_DAG_MC_ETX_DIVISOR
nbr->link_metric = RPL_INIT_LINK_METRIC * RPL_DAG_MC_ETX_DIVISOR (rpl-dag.c)
RPL_INIT_LINK_METRIC = 2 (rpl-conf.h)
ETX_SCALE = 100
ETX_ALPHA = 90
RPL_DAG_MC_ETX_DIVISOR = 256 (rpl-private.h)
MAX_LINK_METRIC = 10
此处,每当 link 层收到 ACK 或超时事件时,都会触发此文件 (neighbor_link_callback) 中的函数。
我了解 ETX 的正式定义,但是当我尝试将标准 ETX 公式与 contikiRPL 的 ETX 公式进行映射时,我在理解 contikiRPL 中 ETX 的实现时遇到了一些麻烦。
数据包成功到达接收方的概率(df
)和ACK包成功接收的概率(dr
)是如何在ContikiRPL中实现的?
在代码中,df
和 dr
分别是未知的。该算法在发送方设备上是运行,无法区分丢包和丢ACK的情况。它们看起来完全一样:因为没有
packet_etx
的值大致对应最后一个数据包的1 / (df * dr)
。请注意,单个数据包可能已经在 link 上进行了多次重传。只有当数据包被成功确认或超过最大重传次数时才会更新指标。
Contiki 的另一个问题是,由于它是为嵌入式系统设计的,它没有足够的内存来跟踪许多最近数据包的 ETX。相反,此信息在 exponentially weighted moving average (EWMA) 过滤器的帮助下聚合为单个值。算法的\alpha
参数在代码中给出为ETX_ALPHA/ETX_SCALE;缩放是为了避免更昂贵的浮点运算。
recorded_etx
的值是ETX的前一个值,反映了之前所有数据包计算出的ETX。 new_etx
的值是前一个ETX和最后一个包的ETX经过ETX算法合并后link的ETX的值。