网络唤醒(WOL)全解指南:原理篇

编程教程 > Softwares (2) 2025-04-21 07:01:35

什么是网络唤醒

网络唤醒(Wake-on-LAN,WOL)是一种计算机局域网唤醒技术,使局域网内处于关机或休眠状态的计算机,将状态转换成引导(Boot Loader)或运行状态。无线唤醒(Wake-on-Wireless-LAN,WoWLAN)作为 WOL 的补充技术,使用无线网卡去唤醒计算机。网络唤醒在一般的局域网环境里使用有限广播地址(255.255.255.255)即可,由于路由器都不转发目的地址为有限广播地址的数据报,因此在复杂网络情况下通常使用子网定向广播地址。在局域网外唤醒局域网内特定计算机,可以使用路由器的 DDNS 与端口转发。

在1996年10月,英特尔和 IBM 成立了 Advanced Manageability Alliance。1997年4月,联盟提出了 WOL 技术。这是 WOL 技术的起源,随后各大厂商纷纷推出了自己的 WOL 技术标准。本文所讨论的 WOL 技术是由 AMD 公司提出的 Magic Packet(幻数据包,魔术包)唤醒方式,这里给出 AMD 关于此技术的白皮书

幻数据包(Magic Packet)

幻数据包是一个广播帧,包含目标计算机的MAC地址。由于 MAC 地址的唯一性,使数据包可以在网络中被唯一的识别。幻数据包发送通常使用无连接的传输协议,如 UDP ,发送端口为 7 或 9 ,这只是通常做法,没有限制。

WOL 技术被提出了将近20年,绝大多数的现代网卡都支持在超低功耗下监听特定的报文,如 ARP。如果设备网卡接收到一个与自己 MAC 地址相同的幻数据包,则网卡会向计算机的电源或主板发出信号以唤醒计算机。大部分的幻数据包在数据链路层(OSI模型第2层)上发送,当发送时,使用广播地址广播到给定的网络上,不使用IP地址(OSI模型第3层)。当然这是绝大部分情况,幻数据包也可以使用特定的 IP 地址进行发送。

幻数据包最简单的构成是6字节的255(FF FF FF FF FF FF FF),紧接着为目标计算机的48位MAC地址,重复16次,数据包共计102字节。有时数据包内还会紧接着4-6字节的密码信息。这个帧片段可以包含在任何协议中,最常见的是包含在 UDP 中。

FF FF FF FF FF FF FF MAC 地址 × 16 4-6字节的密码(可空)

例如 MAC 地址为 11 22 33 44 55 66 的目标计算机,幻数据包的格式为:

FFFFFFFFFFFF 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 [ABABABABABAB(这里为6个字节的密码)]

幻数据包还有一些基本限制条件:

  1. 需要知道目标计算机 MAC 地址
  2. 不提供送达确认
  3. 可能无法在局域网之外工作
  4. 需要硬件进行支持

创建幻数据包

项目地址:https://github.com/ZhangGaoxing/wake-on-lan

该项目为 Xamarin 跨平台项目,包含 Xamarin.Android 与 UWP 。支持自动扫描添加局域网设备。

关于 MAC 地址的扫描获取,这里只说一下思路,详细请查阅代码。第一种方式,也是我最开始想到的方式,使用 Ping 来 Ping 整个网段。开了四个线程,1-255大概需要30多秒,稍微有点慢,而且 .NET 的 Ping 类在 Android 上无法限制秒数。第二种方式,百度到的,直接向整个网段发送 UDP 消息,2秒解决战斗。扫描完成后获取 ARP 表就行。

下面给出的是发送幻数据包的方法:

public static async void Wake(string broadcast, int port, byte[] mac)
{
    using (UdpClient udp = new UdpClient())
    {
        udp.EnableBroadcast = true;

        byte[] packet = new byte[6 + 16 * 6];

        for (int i = 0; i < 6; i++)
        {
            packet[i] = 0xFF;
        }

        for (int i = 0; i < 16; i++)
        {
            for (int j = 0; j < 6; j++)
            {
                packet[6 + i * 6 + j] = mac[j];
            }
        }

        await udp.SendAsync(packet, packet.Length, broadcast, port);
    }
}

 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
什么是网络唤醒网络唤醒(Wake-on-LAN,WOL)是一种计算机局域网唤醒技术,使局域网内处于关机或休眠状态的计算机,将状态转换成引导(Boot Loade
据上一篇zerotier账号注册_zerotier免费稳定内网穿透工具 初步介绍了Zerotier和Zerotier的网络图,这篇主要针对Zerotier的网络管理基础操作进行讲解
Zerotier 是什么​我们的使命是直接连接世界各地的设备,并实现分散计算的新时代
接上一篇Zerotier网络管理_Zerotier免费稳定内网穿透工具 网络管理讲解,本文将会讲解网络管理里面的成员设备添加删除等管理
你尚未连接代理服务器可能有问题,或地址不正确。请尝试:正在与你的组织联系检查代理地址ERR_PROXY_CONNECTION_FAILED如图所示,能ping
一.什么是Hyper-V Hyper-V是微软的一款虚拟化产品,是微软第一个采用类似Vmware和Citrix开源Xen一样的基于hypervisor的技术。这
一. Docker-Compose 简介1. Docker-Compose 简介Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。Docke...
u 模式如果你有一个不认识的字,例如“燚”你可以打u再输入huohuohuohuo的拼音,参考:就可以看到这个字读什么了。 v 模式v数字模式输入v+数字,可以
老电脑完美升级/安装Windows11系统方法,不需要电脑支持TPM模块,就算微软工具检查CPU不支持也能安装
安装 dockerDocker 包位于“社区”存储库中,因此如果 apk 添加失败且具有不可满足的约束,则需要编辑/etc/apk/repositories文件以添加(或取消注释)一行,如:ht...
问题描述部署了私服gogs发现访问总是转圈有点慢。通过F12查看发现是avatar头像服务访问超时,估计是被枪了。解决办法停止gogs服务,找到 配置文件 go
前言在写这篇文章前,我百度了很多教程,大多数都是相似的,结果都是失败
Windows 11 Pro 安装篇首先是安装,与window 10 一致,我这边用vm安装的暂时不提供安装界面了
nPlayer简介​nPlayer最初是发布于苹果设备ios系统上运行的一款功能强大的本地播放器
编程中,总有遇到空白字符的坑,notepad++ 是个不错的文本编辑工具,下面介绍如何在notepad++编辑器显示不可见字符,包括 换行符,空格,tab等