答案1
我认为,该值必须正好是 16。
魔包技术(白皮书,出版物编号 #20213)由 AMD 和惠普于 1995 年左右开发。第 2 页摘录:
“由于以太网控制器已经具有内置地址匹配电路......”他们建议重新使用它,添加一个计数器“计算 IEEE 地址的 16 个重复项”。
他们的理由是,添加 WOL 应该很简单,而实际实现则完全没有限制。这似乎不是历史性的武断(“哦,16 看起来足够长”),因为:
基于您已有的/您知道的。例如,假设我们喜欢 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.
芯片信号线。AMD 提到的“电路”非常深奥,所以您真正需要知道的是,我们可以想象一个简单的情况,其中“设置为 1 的位”对应于芯片中某处的“高”电压,在“引脚”处可见。
Arduino 就是一个很好的例子:将内存位设置为 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.
因为内存位置与该引脚绑定,所以它很优雅,而且都是硬件:只需不断加 1,无需干扰驱动程序或 BIOS 开发人员代码。反正你只是一个电路制造商。你将提供一个高电平引脚,供其他芯片制造商的硅片使用,这是每个人都在做的事情。在现实世界中,它稍微复杂一些(例如,ENC28J60 规范以可怕的细节阐述了这一点),但这就是要点。
在此之后,人类的显而易见性似乎更像是副作用而不是目标。对于计算机来说,4 个 MAC 副本就足够了,但现在计数器不会溢出,而且它不再简单。因此,更有可能的目标是让尽可能多的硅片、驱动程序和 BIOS 设计师实现它,而 16 让每个人都可以在“溢出”和直接信号之间进行选择,而无需重新架构和重新设计。
扮演人类检测的魔鬼代言人,那么下一个具有相同灵活性的更高数字怎么样:256?这不起作用:数据段本身会产生比以太网帧更大的 WOL 数据包(当时) 可能。
所以对我来说这意味着 16 是 WOL 段的唯一值能是。
答案2
是的。这很简单,而且有人意外发送这些数据的可能性几乎为零。
您想要简单,因为 NIC 中功率非常低的微控制器必须能够永久监视原始以太网网络流量,并在看到这种模式时采取行动,并且您不想意外打开系统,因为随机网络数据流是打开系统的命令。
答案3
我认为这主要是为了确保只有魔术包才能真正唤醒计算机。当扫描数据包时,会发现此序列没有查看任何协议标头(例如 IP 地址、端口号),数据包必须易于识别,误报率接近于零。随机网络协议发送包含 16 倍计算机 MAC 地址的数据包的概率接近于零,但如果只有一次重复,误报率就会高得多。
答案4
16,因为数到 16 是极其简单的逻辑。重复 MAC 地址是因为芯片上已经有地址匹配逻辑。AMD 白皮书