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


Answers:


29

我认为该值必须恰好是16。

AMD和惠普大约在1995年之间开发了Magic Packet Technology(白皮书,出版号#20213)。从第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.
    
  2. 芯片信号线。AMD对“电路”的引用引出了深层次的讨论,因此您真正需要知道的是,我们可以想象一个简单的情况,其中“位设置为1”对应于芯片某处的“高”电压,该电压在芯片上可见。 “销”。

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

让我们假设一个更自然的十六进制表示形式(在IP,掩码和MAC地址中经常出现两个十六进制数字,例如FF),并将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.

因为内存位置与该引脚相连,所以它优雅而所有硬件:只需增加1,就无需干扰驱动程序或BIOS开发人员代码。无论如何,您只是一个电路制造商。您将提供一个高电平的引脚,该引脚将由其他芯片制造商的芯片消耗,这就是每个人都在做的事情。在现实世界中,它要复杂一些(例如,ENC28J60规范以令人恐惧的细节进行了布局),但这就是要点。

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

扮演魔鬼提倡人类探测的倡导者,下一个具有相同灵活性的更高数字:256?那是行不通的:仅数据段会产生一个WOL数据包,该数据包大于当时的以太网帧。

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


1
如果看不到地址,您是否还应该在伪代码中包含一行以重置计数器?否则,如果有足够的时间和噪音,您最终总是会醒来。
路加福音

@Luke是的。我最初是为了适应这种情况,但在简化过程中出于主线程的考虑将其删除。我刚刚重新访问了(很抱歉延迟了回复)并且可以解决,但是如果这对您的网络内有用,我不介意批准编辑。
ǝɲǝɲbρɯͽ

19

是。这很简单,某人意外发送此数据的机会实际上为零。

您想要简单,因为NIC中的低功耗微控制器必须能够永久监视原始以太网网络流量并在看到这种模式时采取措施,并且您不想由于随机网络流而意外打开系统data是打开系统的命令。


9

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


1
仅重复一次,由于每个数据包都会一直通过线路发送MAC地址,因此误报的可能性为1。
斯文

@SvW确实如此,但是在这种情况下,它们不一定要以六个FF字节为前缀-尽管我没有提到这一点。
Ale 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.