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中实现的?

在代码中,dfdr 分别是未知的。该算法在发送方设备上是运行,无法区分丢包和丢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的值。