试图理解 IGMPv3 Max Response Code 算法

网络工程 igmp
2021-07-12 04:36:37

在 IGMPv2 中,最大响应时间是一个 8 位值,每个单位编码 0.1 秒。典型的最大响应时间为 100,因此最大响应时间为 10 秒。

在 IGMPv3 中,如果 Max response code < 128,则计算时间相同。但根据https://www.rfc-editor.org/rfc/rfc3376第 4.1.1 节:

   If Max Resp Code < 128, Max Resp Time = Max Resp Code

   If Max Resp Code >= 128, Max Resp Code represents a floating-point
   value as follows:

       0 1 2 3 4 5 6 7
      +-+-+-+-+-+-+-+-+
      |1| exp | mant  |
      +-+-+-+-+-+-+-+-+

   Max Resp Time = (mant | 0x10) << (exp + 3)

https://www.rfc-editor.org/rfc/rfc6636 4.2节举例:

For example, if one wants to set the Max
   Response Time to 20.0 seconds, the Max Resp Code should be expressed
   as "0b10001001", which is divided into "mant=0b1001" and "exp=0b000".

我看不到 0b10001001 在 20 秒内的结果。如果尾数是 0b1001(十进制 9)并且我们左移 3(指数 0 + 3),结果 0b01001000 = 72 十进制或 7.2 秒。

如何计算最大响应代码值 >= 128 的 IGMPv3 响应时间?

两个 RFC 都没有相关的勘误表。

2个回答

我认为您在引用的 RFC 3376 第 4.1.1 节中误解的部分:

Max Resp Time = (mant | 0x10) << (exp + 3)

我认为它可能更清楚(不混合二进制和十六进制),但据我所知:

(1001 OR 10000) = 11001 -> 11001^11 = 11001000 = Decimal 200

您必须OR 0x10使用 matissa,它比尾数大一个二进制数字,因此您1在移动指数 + 之前将一个二进制添加到尾数3


这也许应该作为勘误表发送。

Ron 的提示非常接近 - 在二进制浮点数中,前导1是隐含的,实际上并未存储在表示中。除了1(标准化)尾数中的前导之外其他任何东西都没有任何意义,因此实际存储它会浪费一个(精度)位。

| 0x10公式中部分表达了这一点。

有关IEEE 754 格式,请参阅https://en.wikipedia.org/wiki/Floating-point_arithmetic#Internal_representation

在 IEEE 二进制交换格式中,规范化有效数的前导 1 位实际上并未存储在计算机数据中。它被称为“隐藏”或“隐式”位。