Gewünschtes Verhalten
Wenn eine Anwendung ein Paket an die globale Broadcast-IP-Adresse sendet 255.255.255.255
, möchte ich, dass das Paket ff:ff:ff:ff:ff:ff
auf allen Schnittstellen an die globale Ethernet-Broadcast-Adresse ( ) gesendet wird.
Unter Linux und wahrscheinlich auch unter anderen Betriebssystemen scheint dies zu funktionieren. Windows XP und Windows 7 weisen diesbezüglich unterschiedliche Verhaltensweisen auf, und keines der beiden Verhaltensweisen ist für meine Situation wünschenswert.
Windows XP-Verhalten
Das Paket wird korrekt an die erste Netzwerkschnittstelle gesendet (die Schnittstellenreihenfolge ist unter "Netzwerkverbindungen / Erweiterte / Erweiterte Einstellungen" angegeben). Es wird auch an die anderen Schnittstellen gesendet.
Bisher stimmt alles. Das Problem ist, dass beim Senden an die anderen Schnittstellen die Quelladresse des Broadcast-Pakets die IP-Adresse der ersten Schnittstelle ist. Stellen Sie sich zum Beispiel diese Netzwerkkonfiguration vor (Reihenfolge ist wichtig):
- Adapter 1: IP-Adresse
192.168.0.1
- Adapter 2: IP-Adresse
10.0.0.1
- Adapter 3: IP-Adresse
172.17.0.1
Wenn ich jetzt ein Broadcast-Paket sende, werden die folgenden Pakete gesendet (mit Quell- und Ziel-IP-Adressen):
- Auf Adapter 1:
192.168.0.1
=>255.255.255.255
- Auf Adapter 2:
192.168.0.1
=>255.255.255.255
Auf Adapter 3:
192.168.0.1
=>255.255.255.255
In der Praxis funktionieren Anwendungen, die Broadcast-Pakete verwenden, nicht auf anderen Schnittstellen als Adapter 1. Meiner Meinung nach ist dies ein offensichtlicher Fehler im TCP / IP-Stack von Windows XP.
Windows 7-Verhalten
Das Ändern der Reihenfolge der Netzwerkschnittstellen scheint keine Auswirkungen auf Windows 7 zu haben. Stattdessen scheint die Übertragung von der IP-Routentabelle gesteuert zu werden.
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
===========================================================================
Sehen Sie die 255.255.255.255
Routen? Ja, sie steuern Broadcast-Pakete. In dieser Situation werden Broadcast-Pakete über das gesendet, 192.168.0.3
da es die niedrigere Metrik hat ... aber nicht an die anderen Schnittstellen.
Sie können die Schnittstelle ändern, über die globale Broadcast-Pakete sehr einfach gesendet werden (fügen Sie einfach eine persistente 255.255.255.255
Route mit einer niedrigen Metrik hinzu). Unabhängig davon, wie sehr Sie sich bemühen, werden Broadcast-Pakete nur auf einer einzigen Schnittstelle gesendet , nicht auf allen, wie ich es gerne hätte.
Fazit
- Windows 7 sendet nur Broadcast-Pakete an eine Schnittstelle. Sie können wählen, welche, aber das ist hier nicht der Punkt.
- Windows XP sendet Broadcast-Pakete an alle Schnittstellen, sendet sie jedoch erwartungsgemäß nur an eine Schnittstelle, was in der Praxis dem Windows 7-Verhalten entspricht.
Das Ziel
Ich möchte diese globale IP-Broadcast-Unterstützung in Windows (vorzugsweise Windows 7) ein für alle Mal ändern. Der bessere Weg wäre natürlich eine unterstützte Konfigurationsänderung (Registry-Hack oder ähnliches), aber ich bin offen für alle Vorschläge.
Irgendwelche Ideen?
quelle
Antworten:
Nicht, dass ich Microsoft verteidigen möchte, aber nachdem ich die folgenden RFCs gelesen habe, die versuchen zu definieren, wie Broadcasts funktionieren, glaube ich nicht, dass Microsoft notwendigerweise RFCs verletzt. IMO sollte das Problem auf Anwendungsebene behoben werden (dh gerichtete Broadcasts, nicht global), die die entsprechenden Routen in der Routing-Tabelle treffen und nur von der richtigen Schnittstelle für dieses IP-Netzwerk gesendet werden.
Beide geben an, dass für Sendungen kein Standard definiert ist. In 919 wird auch erwähnt, dass eine bestimmte physische Schnittstelle für die Sendung ausgewählt werden sollte. Im Fall einer Multi-Homed-Multi-NIC-Maschine, die die Sendung generiert, glaube ich nicht, dass klar angegeben ist, was passieren soll. Broadcasts sollten niemals von Routern von einer Schnittstelle zur anderen übertragen werden. Ist der Windows-Computer also in diesem Fall ein Router oder nicht?
Wenn es wirkt , als Router, dann ist jede Host der Sendung mit der falschen IP - Adresse reagiert für dieses Netzwerk (Adapter 2 und 3 in Ihrem Beispiel) sollte das Paket zurück an der Ethernet - Adresse des Adapters 2 und 3 in Reaktion auf Adapter senden Die IP-Adresse von 1 und der Windows-Host sollten sie an die richtige Schnittstelle weiterleiten.
Das klingt verwirrend ... aber ich kann mir keinen besseren Weg vorstellen, dies auszudrücken
Und schließlich sagt RFC 919 ausdrücklich Von RFC 919
Lesen, das darauf hindeutet, dass die Quell-IP-Adresse für eine Sendung irrelevant ist.
Da jede Anwendung Broadcasts anders zu behandeln scheint, liegt meiner Meinung nach hier die Verantwortung. Beispielsweise.
nbtstat
Sendet gerichtete Broadcasts auf Computern mit mehreren Netzwerkkarten, während Spiele möglicherweise globale Broadcasts verwenden.Kurz gesagt, die Anwendung sollte repariert sein, in diesem Fall nicht das Betriebssystem ...
EDIT: Hier ist ein Link für die gleichen Umstände, aber unter Linux. Der Linux-Kernel verarbeitet dies, indem er nur ein Paket über die Standardschnittstelle sendet (in diesem Beispiel NIC A). Sie empfehlen, dass die Anwendung die Netzwerkkarten auflistet und eine gerichtete Übertragung an jede Netzwerkkarte sendet. Verknüpfung
quelle
Schließlich habe ich es programmatisch gelöst. Ich habe eine sehr kleine Software namens WinIPBroadcast geschrieben, die sich um die Weiterleitung der Broadcast-Frames an alle Schnittstellen kümmert.
Es funktioniert mit einer interessanten Tatsache: Es ist möglich, lokal generierte globale Broadcast-Pakete zu empfangen, wenn die Loopback-Adresse (127.0.0.1) abgehört wird. WinIPBroadcast überwacht die lokale Adresse für alle Broadcasts mit RAW-Sockets und leitet sie dann für jedes Broadcast-Paket an alle Schnittstellen mit Ausnahme der bevorzugten weiter.
quelle
The program can't start becuase api-ms-win-core-rtlsupport-l1-2-0.dll is missing from your computer.
. Viel Glück beim Finden.dll
bei Google.