Comportamento desejado
Quando um aplicativo envia um pacote para o endereço IP de broadcast global 255.255.255.255
, eu gostaria que o pacote fosse enviado para o endereço de broadcast global Ethernet ( ff:ff:ff:ff:ff:ff
), em todas as interfaces.
No Linux e provavelmente em outros sistemas operacionais, isso parece funcionar. O Windows XP e o Windows 7 exibem comportamentos diferentes sobre isso, e nenhum comportamento é desejável para a 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"). 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 broadcast, os seguintes pacotes serão enviados (com endereços IP de origem e de destino):
- No adaptador 1:
192.168.0.1
=>255.255.255.255
- No adaptador 2:
192.168.0.1
=>255.255.255.255
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 flagrante na pilha TCP / IP do Windows XP.
Comportamento do Windows 7
Modificar a ordem da interface de rede não parece ter 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 255.255.255.255
rotas? Sim, eles controlam pacotes de transmissão. Nesta situação, os pacotes de broadcast serão enviados via o 192.168.0.3
porque possui a métrica mais baixa ... mas não para as outras interfaces.
Você pode alterar a interface através da qual os pacotes de transmissão global serão enviados com muita facilidade (basta adicionar uma 255.255.255.255
rota persistente com uma métrica baixa). Mas não importa o quanto você tente, os pacotes de transmissão serão enviados apenas em uma única interface, nem todas, como eu gostaria.
Conclusão
- O Windows 7 envia apenas pacotes de transmissão para uma interface. Você pode escolher qual, mas esse não é o ponto aqui.
- O Windows XP envia pacotes de difusão para todas as interfaces, mas somente os envia conforme o esperado para uma interface, o que na prática é equivalente ao comportamento do Windows 7.
O objetivo
Quero alterar esse suporte global de transmissão de IP no Windows (de preferência no Windows 7) de uma vez por todas. É claro que a melhor maneira seria ter algum tipo de alteração de configuração suportada (corte de registro ou similar), mas estou aberto a todas as sugestões.
Alguma ideia?
fonte
Respostas:
Não que eu esteja no negócio de defender a Microsoft, mas depois de ler as seguintes RFCs que tentam definir como as transmissões funcionam, não acho que a Microsoft esteja necessariamente violando quaisquer RFCs. 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 a 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 deve ser selecionada para a transmissão. No caso de uma máquina com várias placas de rede e multi-NIC gerando a transmissão, não acho que esteja claramente indicado o que deve acontecer. As transmissões nunca devem ser transmitidas pelos roteadores de uma interface para a outra, então a máquina Windows é um roteador ou não neste caso?
Se estiver atuando 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) deverá enviar o pacote de volta ao endereço Ethernet dos adaptadores 2 e 3 em resposta ao adaptador O endereço IP de um e o host do Windows devem roteá-lo para a interface adequada.
Isso parece confuso ... mas não consigo pensar em uma maneira melhor de expressar isso
E, finalmente, o RFC 919 diz especificamente do RFC 919
Leitura que sugere que o endereço IP de origem é irrelevante para uma transmissão.
Como cada aplicativo parece lidar com as transmissões de maneira diferente, acho que é aí que reside a responsabilidade. Por exemplo.
nbtstat
envia difusões direcionadas em máquinas com várias placas de rede, enquanto os jogos podem usar difusões globais.Em suma, o aplicativo deve ser corrigido, não o SO 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 da interface padrão (NIC A neste exemplo). Eles recomendam que o aplicativo enumere as NICs e envie uma transmissão direcionada para cada NIC. Ligação
fonte
Finalmente, eu resolvi isso programaticamente. Eu escrevi um software muito pequeno chamado WinIPBroadcast que cuida de retransmitir os quadros de transmissão para todas as interfaces.
Funciona usando um fato interessante: é possível receber pacotes de transmissão global gerados localmente ao escutar no endereço de loopback (127.0.0.1). O WinIPBroadcast escuta no endereço local toda a transmissão usando soquetes RAW e, em seguida, para cada pacote de transmissão, o retransmite para todas as interfaces, exceto a preferida.
fonte
The program can't start becuase api-ms-win-core-rtlsupport-l1-2-0.dll is missing from your computer.
. Boa sorte em encontrar isso.dll
no Google.