为什么 Wake-On-LAN 数据包包含目标 MAC 地址的 16 个重复项?

4d4*_*d4c 16 networking wake-on-lan

Wireshark 网页

目标 MAC 块包含目标 IEEE 地址的 16 个副本,没有中断或中断。

16 次重复有什么具体原因吗?

小智 29

在我看来,该值必须正好是 16。

Magic Packet Technology(白皮书,出版物 #20213)大约在 1995 年由 AMD 和 Hewlett Packard 开发。从第 2 页开始:

“由于以太网控制器已经具有内置地址匹配电路......”他们建议重用它,添加一个计数器“计算 IEEE 地址的 16 个重复项”。

他们认为添加 WOL 应该是微不足道的,同时让实际的实现完全开放。这在历史上似乎不是任意的(“哦,16 看起来够长了”),因为:

  1. 建立在你所拥有的/你所知道的基础上。例如,假设我们喜欢 2 的幂,因此是十六进制数字。方便的是,十六进制数字(4 位)保存 0-15 的正值。如果我们尝试将 1 添加到已经是“最大值”的值(如 15),我们的处理器会检查所有数学运算并设置溢出“标志”。因为这很常见,我们甚至可能有针对溢出条件的特殊指令,所以在伪代码中:

    Initialize a single counter that holds values from 0-15.
    Set it to 0.
    Watch the network. When I see the signal:
    Loop:
      Do I see my address at the right spot?
      Yes: Add 1 to counter.
        Did I just overflow? (15+1 = 0?)
        Yes: Jump out of loop to "wake up" code.
    ...otherwise
    Loop again.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 芯片信号线。AMD 对“电路”的引用引出了深层次,所以你真正需要知道的是,我们可以想象一个简单的情况,其中“位设置为 1”对应于芯片中某处的“高”电压,在“别针”。

Arduinos 就是一个很好的例子:将内存位设置为 1,Arduino 将输出引脚设置为“高”。这种电压变化通常通过驱动 LED 来演示,但通过晶体管的魔力,它可以自动激活、中断或“唤醒”其他电路或芯片。

让我们假设一个更自然的十六进制表示(两个十六进制数字,如 FF,经常出现在 IP、掩码和 MAC 地址中)并将我们的 Arduino 的“输出引脚 5”与计数器中的“位位置 5”联系起来:

Memory      Value  Event
0000 0000   00     Nothing, so keep adding 1...
0000 1111   0F     Nothing, but add 1...
0001 0000   10     Arduino pin 5 high. New voltage interrupts other circuits.
Run Code Online (Sandbox Code Playgroud)

由于内存位置与该引脚相关联,因此它非常优雅且适用于所有硬件:只需继续加 1,无需干扰驱动程序或 BIOS 开发人员代码。无论如何,你只是一个电路制造商。您将提供一个变高的引脚,供其他芯片制造商的硅消耗,这是每个人都在做的事情。在现实世界中,它稍微复杂一些(例如,ENC28J60 规范以可怕的细节对其进行了阐述),但这就是要点。

在此之后,人类的显而易见性似乎更多的是副作用而不是目标。对于计算机,您的 MAC 的 4 个副本应该就足够了,但是现在该计数器不会溢出并且不再简单。因此,目标似乎更有可能是让尽可能多的芯片、驱动程序和 BIOS 设计人员实现它,并且 16 使每个人都可以在“溢出”和直接信号之间进行选择,而无需重新架构和重组。

作为人类检测的恶魔拥护者,具有相同灵活性的下一个更高的数字怎么样:256?这是行不通的:单独的数据段会产生一个比以太网帧(当时)还大的 WOL 数据包。

所以对我来说,这意味着16是唯一的价值WOL段可以是。


Sve*_*ven 19

是的。这很简单,有人意外发送此数据的可能性实际上为零。

你想要简单,因为 NIC 中的一个非常低功耗的微控制器必须能够永久地观察原始以太网网络流量并在它看到这种模式时采取行动,并且你不想因为随机网络流而意外打开系统data 是打开系统的命令。


Ale*_*Ale 9

我认为这主要是一种确保只有魔术包才能真正唤醒计算机的方法。由于在查看任何协议标头(例如,IP 地址、端口号)的情况下针对此序列扫描数据包,因此数据包需要易于识别且误报数量接近于零。随机网络协议发送包含计算机 MAC 地址 16 倍的数据包的概率接近于零,但如果只有一次重复,则误报的可能性要高得多。


ric*_*rdb 5

16 因为数到 16 是非常简单的逻辑。重复 MAC 地址,因为芯片上已经有地址匹配逻辑。AMD 白皮书