Comportamiento deseado
Cuando una aplicación envía un paquete a la dirección IP de transmisión global 255.255.255.255
, me gustaría que el paquete se envíe a la dirección de transmisión global Ethernet ( ff:ff:ff:ff:ff:ff
), en todas las interfaces.
En Linux y probablemente también en otros sistemas operativos, esto parece funcionar. Windows XP y Windows 7 exhiben comportamientos diferentes al respecto, y ninguno de estos comportamientos es deseable para mi situación.
Comportamiento de Windows XP
El paquete se enviará correctamente a la primera interfaz de red (el orden de la interfaz se especifica en "Conexiones de red / Configuración avanzada / avanzada"). También se enviará a las otras interfaces.
Todo está bien hasta ahora. El problema es que, al enviar a las otras interfaces, la dirección de origen del paquete de difusión es la dirección IP de la primera interfaz. Por ejemplo, imagine esta configuración de red (el orden es importante):
- Adaptador 1: dirección IP
192.168.0.1
- Adaptador 2: dirección IP
10.0.0.1
- Adaptador 3: dirección IP
172.17.0.1
Ahora, si envío un paquete de difusión, se enviarán los siguientes paquetes (con las direcciones IP de origen y de destino):
- En el adaptador 1:
192.168.0.1
=>255.255.255.255
- En el adaptador 2:
192.168.0.1
=>255.255.255.255
En el adaptador 3:
192.168.0.1
=>255.255.255.255
En la práctica, las aplicaciones que usan paquetes de difusión no funcionarán en ninguna interfaz que no sea el adaptador 1. En mi opinión, este es un error evidente en la pila TCP / IP de Windows XP.
Comportamiento de Windows 7
La modificación del orden de la interfaz de red no parece tener ningún efecto en Windows 7. En cambio, la transmisión parece estar controlada por la tabla de rutas 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
===========================================================================
Ver las 255.255.255.255
rutas? Sí, controlan los paquetes de transmisión. En esta situación, los paquetes de difusión se enviarán a través de 192.168.0.3
porque tiene la métrica más baja ... pero no a las otras interfaces.
Puede cambiar la interfaz a través de la cual los paquetes de difusión global se enviarán muy fácilmente (simplemente agregue una 255.255.255.255
ruta persistente con una métrica baja). Pero no importa cuánto lo intentes, los paquetes de difusión solo se enviarán en una sola interfaz, no todos como me gustaría que lo haga.
Conclusión
- Windows 7 solo envía paquetes de difusión a una interfaz. Puedes elegir cuál, pero ese no es el punto aquí.
- Windows XP envía paquetes de difusión a todas las interfaces, pero solo los envía como se espera a una interfaz, lo que en la práctica es equivalente al comportamiento de Windows 7.
La meta
Quiero cambiar esta compatibilidad global de transmisión IP en Windows (preferiblemente Windows 7) de una vez por todas. Por supuesto, la mejor manera sería tener algún tipo de cambio de configuración compatible (pirateo del registro o similar), pero estoy abierto a todas las sugerencias.
¿Algunas ideas?
fuente
Respuestas:
No es que esté en el negocio de defender a Microsoft, pero después de leer las siguientes RFC que intentan definir cómo funcionan las transmisiones, no creo que Microsoft esté necesariamente violando ninguna RFC. En mi opinión, el problema debe solucionarse a nivel de aplicación (es decir, transmisiones dirigidas, no globales) que alcanzarán las rutas apropiadas en la tabla de enrutamiento y solo se enviarán desde la interfaz correcta para esa red IP.
Ambos afirman que no hay un estándar definido para las transmisiones. También menciona en 919 que se debe seleccionar una interfaz física específica para la transmisión. En el caso de una máquina multi-homed, multi-NIC que genera la transmisión, no creo que se indique claramente lo que debería suceder. Se supone que las transmisiones nunca deben ser transmitidas por enrutadores de una interfaz a otra, entonces, ¿es la máquina Windows un enrutador o no en este caso?
Si está actuando como un enrutador, cualquier host que responda a la transmisión con la dirección IP incorrecta para esa red (adaptadores 2 y 3 en su ejemplo) debe enviar el paquete a la dirección de Ethernet de los adaptadores 2 y 3 en respuesta al adaptador La dirección IP de 1 y el host de Windows deben enrutarlo a la interfaz adecuada.
Eso suena confuso ... pero no se me ocurre una mejor manera de expresar esto
Y finalmente, RFC 919 dice específicamente de RFC 919
Una lectura que sugiera que la dirección IP de origen es irrelevante para una transmisión.
Dado que cada aplicación parece manejar las transmisiones de manera diferente, creo que ahí es donde reside la responsabilidad. Por ejemplo.
nbtstat
envía transmisiones dirigidas en máquinas con múltiples NIC, mientras que los juegos pueden usar transmisiones globales.En resumen, la aplicación debe ser reparada, no el sistema operativo en este caso ...
EDITAR: Aquí hay un enlace para las mismas circunstancias, pero en Linux. El kernel de Linux lo maneja enviando solo un paquete a la interfaz predeterminada (NIC A en este ejemplo). Recomiendan que la aplicación enumere las NIC y envíe una transmisión dirigida a cada NIC. Enlace
fuente
Finalmente, lo resolví programáticamente. Escribí un software muy pequeño llamado WinIPBroadcast que se encarga de transmitir las tramas de difusión a todas las interfaces.
Funciona utilizando un hecho interesante: es posible recibir paquetes de difusión global generados localmente cuando se escucha en la dirección de bucle invertido (127.0.0.1). WinIPBroadcast escucha en la dirección local todas las transmisiones utilizando sockets RAW, luego, para cada paquete de difusión, lo transmite a todas las interfaces, excepto a la preferida.
fuente
The program can't start becuase api-ms-win-core-rtlsupport-l1-2-0.dll is missing from your computer.
. Buena suerte encontrando eso.dll
en Google.