Wake-on-LAN (WOL; в переводе с англ. — «пробуждение по [сигналу из] локальной сети») — технология, позволяющая удалённо включить компьютер посредством отправки через локальную сеть специальной последовательности байтов — пакета данных (так называемого magic packet — «волшебного пакета», см. ниже). Этот пакет может быть вставлен в пакеты любых стандартных протоколов более высоких уровней, например, UDP или IPX.
Компьютер с источником питания, соответствующим стандарту ATX 2.01, и материнской платой, поддерживающей Wake-on-LAN;
Сетевая плата (в виде платы расширения либо встроенная в материнскую плату) с поддержкой Wake-on-LAN;
Если используется внешняя (не встроенная в материнскую плату) сетевая плата, и хотя бы одна из этих плат не соответствуют стандарту PCI 2.2 или более позднему, то необходим также специальный трёхпроводной кабель для соединения разъёмов Wake-on-LAN на материнской и сетевой платах.
Как для интегрированного, так и для внешнего сетевого адаптера, как правило, требуется включение Wake-on-LAN в настройках BIOS материнской платы.
Кроме того, необходима возможность послать magic packet управляемому компьютеру. Это можно сделать, например, с помощью другого компьютера с соответствующей программой (см. примеры ниже).
Принцип работы
Управляемый компьютер находится в дежурном режиме (англ.stand-by — режим, предусмотренный спецификацией ATX, при котором из всех выходных цепей блока питания активна только дежурная +5VSB) и выдаёт питание на микросхему BIOS и сетевой адаптер[1]. Сетевой адаптер находится в режиме пониженного энергопотребления, при этом его микроконтроллер анализирует все пакеты, приходящие на соответствующий MAC-адрес, ничего не отвечая на них. Если одним из пакетов окажется magic packet, сетевой адаптер выдаст сигнал на включение питания компьютера.
Magic packet
англ.Magic packet — это специальная последовательность байтов, которую для нормального прохождения по локальным сетям можно вставить в пакеты транспортного уровня, не требующие установки соединения (например, протокол UDP или устаревший IPX). Обычно для Wake-on-LAN пакеты протоколов верхнего уровня рассылают широковещательно, так как в случае динамического присвоения адресов неизвестно, какой IP-адрес соответствует какому MAC-адресу. Однако, для корректного прохождения через маршрутизатор, запрещающий широковещательные пакеты, можно послать пакет по какому-то определённому адресу.
В начале пакета идет так называемая цепочка синхронизации: 6 байт, равных 0xFF. Затем — MAC-адрес сетевой платы, повторённый 16 раз. То есть, если бы адрес платы выглядел как 01:02:03:04:05:06, то магический пакет оказался бы таким:
Задача написания программы, посылающей магический пакет, достаточно проста и часто дается как учебная при изучении основ работы с сетью. Ниже представлено два примера таких программ в исходных кодах:
unitWOL;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,IdBaseComponent,IdComponent,IdUDPBase,IdUDPClient,IdGlobal,StdCtrls;typeTForm1=class(TForm)Edit1:TEdit;Button1:TButton;procedureButton1Click(Sender:TObject);private{ Private declarations }public{ Public declarations }end;varForm1:TForm1;implementation{$R *.dfm}typeTMACAddress=packedrecordcaseintegerof0:(s1,s2,s3,s4,s5,s6:byte;);1:(cmp1:word;cmp2:integer;);end;TWakeupMagicPacket=packedrecordFillFF:array[0..5]ofbyte;Mac:array[0..15]ofTMACAddress;end;functionTryStrToMac(str:string;varmac:TMACAddress):boolean;vara,b:integer;constToHex='0123456789ABCDEF';beginResult:=false;str:=AnsiUpperCase(trim(str));iflength(str)<17thenbeginmac.cmp1:=0;mac.cmp2:=0;exit;end;a:=pos(str[1],ToHex)-1;b:=pos(str[2],ToHex)-1;if((a>=0)and(b>=0)and(str[3]='-'))thenmac.s1:=a*16+belseexit;a:=pos(str[4],ToHex)-1;b:=pos(str[5],ToHex)-1;if((a>=0)and(b>=0)and(str[6]='-'))thenmac.s2:=a*16+belseexit;a:=pos(str[7],ToHex)-1;b:=pos(str[8],ToHex)-1;if((a>=0)and(b>=0)and(str[9]='-'))thenmac.s3:=a*16+belseexit;a:=pos(str[10],ToHex)-1;b:=pos(str[11],ToHex)-1;if((a>=0)and(b>=0)and(str[12]='-'))thenmac.s4:=a*16+belseexit;a:=pos(str[13],ToHex)-1;b:=pos(str[14],ToHex)-1;if((a>=0)and(b>=0)and(str[15]='-'))thenmac.s5:=a*16+belseexit;a:=pos(str[16],ToHex)-1;b:=pos(str[17],ToHex)-1;if((a>=0)and(b>=0))thenmac.s6:=a*16+belseexit;Result:=true;end;functionTryWakeUpComputer(constMacAddress:string):boolean;vari:integer;mac:TMACAddress;pkt:TWakeupMagicPacket;beginResult:=false;ifnotTryStrToMac(MacAddress,mac)thenexit;FillChar(pkt.FillFF[0],SizeOf(pkt.FillFF),$FF);fori:=0toHigh(pkt.Mac)dopkt.Mac[i]:=mac;withTIdUDPClient.Create(nil)dotryBroadcastEnabled:=True;Host:='255.255.255.255';Port:=9;SendBuffer(pkt,sizeof(pkt));Result:=true;finallyFree;end;end;procedureTForm1.Button1Click(Sender:TObject);beginifnotTryWakeUpComputer(Edit1.Text)then\\МаквидаBC-AE-C5-8E-0A-2Cbegin// Do something...showmessage('ERROR');end;end;
Примечания
↑Некоторые компьютеры необходимо включить вручную хотя бы один раз после установки сетевой платы. При этом включении компьютер обнаружит сетевую плату и в дальнейшем запомнит, на какое именно устройство следует подавать питание. Другим возможным решением может быть установка в BIOS параметра Wake After Power Fail («пробуждаться после пропадания питания») в значение On («Вкл.»)