Wake-on-LAN (WOL; в переводе с англ. — «пробуждение по [сигналу из] локальной сети») — технология, позволяющая удалённо включить компьютер посредством отправки через локальную сеть специальной последовательности байтов — пакета данных (так называемого 'magic packet' — «волшебного пакета», см. ниже). Этот пакет может быть вставлен в пакеты любых стандартных протоколов более высоких уровней, например, UDP или IPX.
Компьютер с источником питания, соответствующим стандарту ATX 2.01, и материнской платой, поддерживающей Wake-on-LAN;
Сетевая плата (в виде платы расширения либо встроенная в материнскую плату) с поддержкой Wake-on-LAN;
Если используется внешняя (не встроенная в материнскую плату) сетевая плата, и хотя бы одна из этих плат не соответствуют стандарту PCI 2.2 или более позднему, то необходим также специальный трёхпроводной кабель для соединения разъёмов Wake-on-LAN на материнской и сетевой платах.
Кроме того, необходима возможность послать magic packet управляемому компьютеру. Это можно сделать, например, с помощью другого компьютера с соответствующей программой (см. примеры ниже).
Управляемый компьютер находится в дежурном режиме (англ.stand-by) и выдаёт питание на сетевой адаптер[1]. Сетевой адаптер находится в режиме пониженного энергопотребления, просматривая все пакеты, приходящие на его MAC-адрес, и ничего не отвечая на них. Если одним из пакетов окажется magic packet, сетевой адаптер выдаст сигнал на включение питания компьютера.
англ.Magic packet — это специальная последовательность байтов, которую для нормального прохождения по локальным сетям можно вставить в пакеты UDP или IPX. Обычно для Wake-on-LAN пакеты протоколов верхнего уровня рассылают широковещательно, так как в случае динамического присвоения адресов неизвестно, какой IP-адрес соответствует какому MAC-адресу. Однако, для корректного прохождения через маршрутизатор, запрещающий широковещательные пакеты, можно послать пакет по какому-то определённому адресу.
В начале пакета идет так называемая цепочка синхронизации: 6 байт, равных 0xFF. Затем — MAC-адрес сетевой платы, повторённый 16 раз. То есть, если бы адрес платы выглядел как 01:02:03:04:05:06, то магический пакет оказался бы таким:
Задача написания программы, посылающей магический пакет, достаточно проста и часто дается как учебная при изучении основ работы с сетью. Ниже представлено два примера таких программ в исходных кодах:
Код на C#
usingSystem;usingSystem.Net.Sockets;usingSystem.Net;usingSystem.Collections.Generic;namespace Wol
{class Program
{staticvoid Main(string[] args){using(UdpClient udpClient =new UdpClient()){
Console.WriteLine("Enter mac address");byte[] mac = StrToMac(Console.ReadLine());
udpClient.Send(mac, mac.Length, new IPEndPoint(IPAddress.Broadcast, 9));}}staticbyte[] StrToMac(string s){
List<byte> arr =new List<byte>(102);string[] macs = s.Split(' ', ':', '-');for(int i =0; i <6; i++)
arr.Add(0xff);for(int j =0; j <16; j++)for(int i =0; i <6; i++)
arr.Add(Convert.ToByte(macs[i], 16));return arr.ToArray();}}}
Код на Delphi
Адаптирован для версии BDS2006.
program WOL;{$APPTYPE CONSOLE}uses
Windows,
SysUtils,
IdBaseComponent,
IdComponent,
IdUDPBase,
IdUDPClient,
IdGlobal;{$R *.res}function HexToInt(const s:string):Integer;begin
Result :=0;if Length(s) <=(SizeOf(LongWord)*2)then
Result := StrToInt('$'+ s);end;procedure ErrMsg(Msg:String);begin
MessageBox(0,PChar(Msg),'Wake On LAN',MB_OK or MB_ICONERROR);end;procedure WakeUPComputer(aMacAddress:string);var i,j,k:Byte;
lBuffer: TBytes;
lUDPClient:TIdUDPClient;begintry
SetLength(lBuffer,102);for i :=0to5dobegin
lBuffer[i]:=$FF;end;for i:=1to16dobegin
k:=i*6;for j :=0to5dobegin
lBuffer[k+j]:= HexToInt(aMacAddress[j*2+1]+ aMacAddress[j*2+2]);end;end;
lUDPClient:=TIdUDPClient.Create(nil);try
lUDPClient.BroadcastEnabled:=true;
lUDPClient.Host:='255.255.255.255';
lUDPClient.Port:=2050;
lUDPClient.SendBuffer(lBuffer);except
on E:Exception do ErrMsg(E.Message);end;
lUDPClient.Free;
SetLength(lBuffer,0);// не забываем чистить памятьexcept
on E:Exception do ErrMsg(E.Message);end;end;procedure ShowHelp;begin
MessageBox(0,'Usage: WOL.exe <MAC-address>'#13#10'Example: WOL 000D619AFB55','Wake On LAN',0);end;beginif ParamCount=1then WakeUpComputer(ParamStr(1))else ShowHelp;end.
↑Некоторые компьютеры необходимо включить вручную хотя бы один раз после установки сетевой платы. При этом включении компьютер обнаружит сетевую плату и в дальнейшем запомнит, на какое именно устройство следует подавать питание. Другим возможным решением может быть установка в BIOS параметра Wake After Power Fail («пробуждаться после пропадания питания») в значение On («Вкл.»)