Como alterar o comportamento do endereço de broadcast global (255.255.255.255) no Windows?

10

Comportamento desejado

Quando um aplicativo envia um pacote para o endereço IP de difusão global 255.255.255.255 , eu gostaria que o pacote fosse enviado para o endereço de difusão global Ethernet ( ff:ff:ff:ff:ff:ff ), em todas as interfaces.

No Linux e provavelmente em outros sistemas operacionais, isso também parece funcionar. O Windows XP e o Windows 7 exibem comportamentos diferentes sobre isso e nenhum comportamento é desejável para minha situação.

Comportamento do Windows XP

O pacote será enviado corretamente para a primeira interface de rede (a ordem da interface é especificada em "Conexões de Rede / Configurações Avançadas / Avançadas"). Ele também será enviado para as outras interfaces.

Tudo está certo até agora. O problema é que, ao enviar para as outras interfaces, o endereço de origem do pacote de transmissão é o endereço IP da primeira interface. Por exemplo, imagine esta configuração de rede (a ordem é importante):

  • Adaptador 1: endereço IP 192.168.0.1
  • Adaptador 2: endereço IP 10.0.0.1
  • Adaptador 3: endereço IP 172.17.0.1

Agora, se eu enviar um pacote de transmissão, os seguintes pacotes serão enviados (com endereços IP de origem e de destino):

  • No adaptador 1: 192.168.0.1 = > %código%
  • No adaptador 2: 255.255.255.255 = > %código%
  • No adaptador 3: 192.168.0.1 = > 255.255.255.255

    Na prática, os aplicativos que usam pacotes de transmissão não funcionarão em nenhuma outra interface além do adaptador 1. Na minha opinião, esse é um bug evidente na pilha TCP / IP do Windows XP.

Comportamento do Windows 7

A modificação da ordem da interface de rede não parece ter qualquer efeito no Windows 7. Em vez disso, a transmissão parece ser controlada pela tabela de rotas IP.

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0   10.202.254.254       10.202.1.2    286
          0.0.0.0          0.0.0.0      192.168.0.1      192.168.0.3     10
       10.202.0.0      255.255.0.0         On-link        10.202.1.2    286
       10.202.1.2  255.255.255.255         On-link        10.202.1.2    286
   10.202.255.255  255.255.255.255         On-link        10.202.1.2    286
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    306
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    306
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    306
      192.168.0.0    255.255.255.0         On-link       192.168.0.3    266
      192.168.0.3  255.255.255.255         On-link       192.168.0.3    266
    192.168.0.255  255.255.255.255         On-link       192.168.0.3    266
        224.0.0.0        240.0.0.0         On-link         127.0.0.1    306
        224.0.0.0        240.0.0.0         On-link       192.168.0.3    266
        224.0.0.0        240.0.0.0         On-link        10.202.1.2    286
  255.255.255.255  255.255.255.255         On-link         127.0.0.1    306
  255.255.255.255  255.255.255.255         On-link       192.168.0.3    266
  255.255.255.255  255.255.255.255         On-link        10.202.1.2    286
===========================================================================

Veja as rotas 192.168.0.1 ? Sim, eles controlam pacotes de transmissão. Nessa situação, os pacotes de transmissão serão enviados via 255.255.255.255 , porque tem a menor métrica ... mas não para as outras interfaces.

Você pode alterar a interface pela qual os pacotes de transmissão global serão enviados com muita facilidade (basta adicionar uma rota 255.255.255.255 persistente com uma métrica baixa). Mas não importa o quanto você tente, os pacotes de broadcast serão enviados somente em uma única interface, nem todos como eu gostaria que fosse feito.

Conclusão

  • O Windows 7 envia apenas pacotes de transmissão para uma interface. Você pode escolher qual deles, mas esse não é o ponto aqui.
  • O Windows XP envia pacotes de transmissão para todas as interfaces, mas envia-as apenas como esperado para uma interface, o que, na prática, é equivalente ao comportamento do Windows 7.

O objetivo

Eu quero mudar este suporte de transmissão IP global no Windows (de preferência o Windows 7) de uma vez por todas. É claro que a melhor maneira seria ter algum tipo de alteração de configuração suportada (hack de registro ou similar), mas estou aberto a todas as sugestões.

Alguma idéia?

    
por Etienne Dechamps 07.10.2009 / 13:41

2 respostas

4

Finalmente, resolvi-o de forma programática. Eu escrevi um software muito pequeno chamado WinIPBroadcast que cuida de retransmitir os quadros de broadcast para todas as interfaces.

Funciona usando um fato interessante: é possível receber pacotes globais de transmissão gerados localmente ao escutar o endereço de loopback (127.0.0.1). O WinIPBroadcast ouve o endereço local de todas as transmissões usando soquetes RAW, então, para cada pacote de broadcast, ele o transmite para todas as interfaces, exceto a preferida.

    
por 01.11.2009 / 00:14
6

Não que eu esteja no negócio de defender a Microsoft, mas depois de ler os seguintes RFCs que tentam definir como as transmissões funcionam, não acho que a Microsoft esteja necessariamente violando qualquer RFC. Na IMO, o problema deve ser corrigido no nível do aplicativo (ou seja, transmissões direcionadas, não globais), que atingirá as rotas apropriadas na tabela de roteamento e será enviado apenas da interface correta para essa rede IP.

Ambos afirmam que não há um padrão definido para transmissões. Também menciona em 919 que uma interface física específica deveria ser selecionada para a transmissão. No caso de uma máquina multi-NIC multi-homed gerar a transmissão, eu não acho que é claramente indicado o que deveria acontecer. As transmissões nunca devem ser passadas pelos roteadores de uma interface para a outra, então a máquina do Windows é um roteador ou não, neste caso?
Se estiver agindo como um roteador, qualquer host que responda à transmissão com o endereço IP incorreto para essa rede (Adaptadores 2 e 3 no seu exemplo) deve enviar o pacote de volta para o endereço Ethernet dos Adaptadores. 2 e 3 em resposta ao endereço IP do adaptador 1 e o host do Windows deve rotea-lo para a interface apropriada. Isso soa confuso ... mas não consigo pensar em uma maneira melhor de expressar isso

E finalmente, o RFC 919 diz especificamente De RFC 919

Since we assume that the problem has already been solved at the data link layer, an IP host wishing to
send either a local broadcast or a directed broadcast need only
specify the appropriate destination address and send the datagram as
usual. Any sophisticated algorithms need only reside in gateways.

A leitura sugere que o endereço IP de origem é irrelevante para uma transmissão.


Como cada aplicativo parece lidar com difusões de maneira diferente, acho que é aí que reside a responsabilidade. Por exemplo. nbtstat envia transmissões direcionadas em máquinas com vários NICs, enquanto os jogos podem usar transmissões globais. Em suma, o aplicativo deve ser corrigido, não o sistema operacional, neste caso ...

EDIT: Aqui está um link para as mesmas circunstâncias, mas no Linux. O kernel do Linux lida com isso enviando apenas um pacote pela interface padrão (NIC A neste exemplo). Eles recomendam que o aplicativo enumere as NICs e envie uma transmissão direcionada para cada NIC. Link

    
por 07.10.2009 / 16:17