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

从Wireshark网页 :

目标MAC块包含目标的IEEE地址的16个重复,没有rest或中断。

有16个重复是否有任何特定的原因?

在我看来,价值必须是16。

魔术包技术( 白皮书 ,出版号#20213)是在AMD和惠普之间于1995年左右开发的。从第2页开始:

“由于以太网控制器已经具有内置的地址匹配电路……” 他们build议重新使用它,并增加一个计数器 “来计算IEEE地址的16个重复”。

他们认为WOL应该是微不足道的,而实际的实现则是敞开的。 这在历史上似乎不是任意的(“哦,16看起来足够长”),因为:

  1. build立在你有什么/你知道什么。 举例来说,让我们假设我们喜欢2的幂,因此hex数字。 方便的是,一个hex数字(4位)保存从0-15的正值。 我们的处理器检查所有的math运算,并且设置一个溢出“标志”,如果我们试图给已经“最大”的值添加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”对应于芯片某处的“高”电压,在“销”。

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

让我们假设一个更自然的hex表示(两个hex数字,如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. 

由于内存位置与该引脚相连,因此它的优雅和所有硬件:只需不断添加1,无需干扰驱动程序或BIOS开发人员代码。 无论如何,你只是一个电路制造商。 你会提供一个高点,被其他芯片制造商的芯片消耗掉,这正是每个人都在做的。 在现实世界中,这有点复杂(例如,ENC28J60规格中列出了令人恐惧的细节),但这就是要点。

在此之后,人类的显而易见性似乎比目标更具副作用。 对于计算机来说,4份MAC就足够了,但现在计数器不会溢出,不再是简单的了。 因此,目标似乎更有可能是由尽可能多的芯片,驱动程序和BIOSdevise人员来实现,并且16给了每个人“溢出”和直接信号之间的select,而不需要重新devise和重新devise。

扮演恶魔的人类检测的倡导者,下一个更高的数字具有相同的灵活性:256? 这是行不通的:仅数据段就会产生比以太网帧( 当时 )更大的WOL数据包。

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

是。 这很简单,有人偶然发送这些数据的机会实际上是零。

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

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

16是因为它的死逻辑数到16.因为芯片上已经有地址匹配逻辑,所以重复MAC地址。 AMD白皮书