Por que um pacote Wake-On-LAN contém 16 duplicações do endereço MAC de destino?


16

Na página do Wireshark :

O bloco MAC de destino contém 16 duplicatas do endereço IEEE do destino, sem quebras ou interrupções.

Existe algum motivo específico para as 16 duplicações?

Respostas:


29

Na minha opinião, o valor deve ser exatamente 16.

A Magic Packet Technology ( white paper , publicação # 20213) foi desenvolvida entre a AMD e a Hewlett Packard por volta de 1995. Na página 2:

"Como um controlador Ethernet já possui um circuito interno de correspondência de endereços ...", eles propõem reutilizá-lo, adicionando um contador "para contar as 16 duplicações do endereço IEEE".

Eles argumentam que o WOL deve ser trivial para adicionar, deixando a implementação real em aberto. Isso não parece ser historicamente arbitrário ("Oh, 16 parece tempo suficiente"), porque:

  1. Construa sobre o que você tem / o que você sabe. Por exemplo, vamos assumir que gostamos de potências de 2 e, portanto, dígitos hexadecimais. Convenientemente, um dígito hexadecimal (4 bits) mantém valores positivos de 0 a 15. Nosso processador verifica toda a matemática e define um "sinalizador" de excesso se tentarmos adicionar 1 a um valor já "máximo" (como 15). Como isso é bastante comum, podemos até ter uma instrução especial para condições de estouro, portanto, no pseudocódigo:

    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. Linhas de sinal de chip. A referência da AMD a "circuitos" leva ao extremo, então tudo o que você realmente precisa saber é que podemos imaginar um caso simples em que um "bit definido como 1" corresponde a uma "alta" tensão em algum lugar do chip, visível a "PIN".

Arduinos são um bom exemplo: defina um bit de memória como 1 e o Arduino define um pino de saída como "alto". Essa alteração de tensão é frequentemente demonstrada pelos LEDs acionados, mas através da magia dos transistores, ele pode ativar, interromper ou "acordar" automaticamente outros circuitos ou chips.

Vamos assumir uma representação hexadecimal mais natural (dois dígitos hexadecimais, como FF, geralmente vistos em IP, máscaras e endereços MAC) e amarrar o "pino de saída 5" do nosso Arduino à "posição 5" no nosso contador:

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.

Como o local da memória está vinculado a esse pino, é elegante e todo o hardware: basta adicionar 1, sem necessidade de interferir no driver ou no código do desenvolvedor do BIOS. Você é apenas um fabricante de circuitos de qualquer maneira. Você fornecerá um pino que vai alto, para ser consumido pelo silício de outros fabricantes de chips, que é o que todos estão fazendo. No mundo real, é um pouco mais complicado (por exemplo, a especificação ENC28J60 apresenta em detalhes terríveis), mas essa é a essência.

Depois disso, a obviedade humana parece mais um efeito colateral que o objetivo. Para computadores, 4 cópias do seu MAC devem ser suficientes, mas agora esse contador não transborda e não é mais simples. Portanto, parece mais provável que o objetivo fosse implementá-lo pelo maior número possível de designers de silício, driver e BIOS, e 16 oferece a todos uma escolha entre "transbordamento" E sinalização direta, sem re-arquitetar e reequipar.

Brincando de advogado do diabo para a detecção humana, e o próximo número mais alto com a mesma flexibilidade: 256? Isso não funciona: o segmento de dados sozinho produz um pacote WOL maior do que um quadro Ethernet ( na época ) poderia ser.

Então, para mim, isso significa que 16 é o único valor que o segmento WOL pode ser.


11
Você também não deveria ter uma linha no seu pseudocódigo para redefinir o contador, se não vir o endereço? Caso contrário, com tempo e ruído suficientes, você sempre acordará.
Lucas

@ Luke Sim. Originalmente, eu aceitei isso, mas durante a simplificação o removi por causa do thread principal. Acabei de revisitar (desculpas pela resposta muito atrasada) e posso corrigir, mas não me importo de aprovar edições se isso for útil para você na rede.
ǝɲǝɲbρɯͽ

19

Sim. É simples e a chance de alguém enviar esses dados acidentalmente é efetivamente zero.

Você quer ser simples porque um microcontrolador de baixa potência na NIC precisa ser capaz de observar permanentemente o tráfego bruto da rede Ethernet e agir se ele observar esse padrão e não desejar ativar os sistemas acidentalmente porque um fluxo de rede aleatória data é o comando para ligar o sistema.


9

Eu acho que é principalmente uma maneira de garantir que apenas um pacote mágico realmente acorde o computador. Como os pacotes são varridos para esta sequência sem olhar para os cabeçalhos de protocolo (por exemplo, endereços IP, números de porta), o pacote precisa ser facilmente identificável e o número de falsos positivos próximo de zero. A probabilidade de um protocolo de rede aleatório estar enviando um pacote contendo 16 vezes o endereço MAC de um computador é quase zero, mas a chance de um falso positivo é muito maior se houver apenas uma repetição.


11
Com apenas uma repetição, a probabilidade de um falso positivo seria 1, pois os endereços MAC são enviados por fio o tempo todo, com todos os pacotes.
Sven

@ SVW, de fato, mas neste caso eles não são necessariamente prefixados por seis bytes FF - embora eu não tenha mencionado esse ponto.
Ale

5

16 porque é lógico fácil contar até 16. Repetir o endereço MAC porque já existe lógica de correspondência de endereço no chip. White paper da AMD

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.