Pożądane zachowanie
Gdy aplikacja wysyła pakiet na adres IP globalnej emisji 255.255.255.255
, chciałbym, aby pakiet został przesłany na adres globalnej emisji Ethernet ( ff:ff:ff:ff:ff:ff
) na wszystkich interfejsach.
W systemie Linux i prawdopodobnie także w innych systemach operacyjnych wydaje się, że to działa. Windows XP i Windows 7 wykazują różne zachowania w tym zakresie i żadne z nich nie jest pożądane w mojej sytuacji.
Zachowanie Windows XP
Pakiet zostanie poprawnie wysłany do pierwszego interfejsu sieciowego (kolejność interfejsów jest określona w „Połączenia sieciowe / Ustawienia zaawansowane / zaawansowane”). Zostanie również wysłany do innych interfejsów.
Jak dotąd wszystko jest w porządku. Problem polega na tym, że podczas wysyłania do innych interfejsów adresem źródłowym pakietu rozgłoszeniowego jest adres IP pierwszego interfejsu. Na przykład wyobraź sobie tę konfigurację sieci (kolejność jest ważna):
- Adapter 1: adres IP
192.168.0.1
- Adapter 2: adres IP
10.0.0.1
- Adapter 3: adres IP
172.17.0.1
Teraz, jeśli wyślę pakiet rozgłoszeniowy, zostaną wysłane następujące pakiety (z źródłowym i docelowym adresem IP):
- Na adapterze 1:
192.168.0.1
=>255.255.255.255
- Na adapterze 2:
192.168.0.1
=>255.255.255.255
Na adapterze 3:
192.168.0.1
=>255.255.255.255
W praktyce aplikacje korzystające z pakietów rozgłoszeniowych nie będą działać na żadnym interfejsie innym niż adapter 1. Moim zdaniem jest to rażący błąd w stosie TCP / IP systemu Windows XP.
Zachowanie Windows 7
Modyfikacja kolejności interfejsu sieciowego nie wydaje się mieć żadnego wpływu na system Windows 7. Zamiast tego, transmisja wydaje się być kontrolowana przez tablicę tras 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
===========================================================================
Widzisz 255.255.255.255
trasy? Tak, kontrolują pakiety rozgłoszeniowe. W tej sytuacji pakiety rozgłoszeniowe będą wysyłane przez, 192.168.0.3
ponieważ mają niższą metrykę ... ale nie do innych interfejsów.
Możesz zmienić interfejs, przez który globalne pakiety emisji będą wysyłane bardzo łatwo (po prostu dodaj trwałą 255.255.255.255
trasę o niskim wskaźniku). Ale bez względu na to, jak bardzo się starasz, pakiety emisji będą wysyłane tylko na jednym interfejsie, a nie na wszystkich tak, jak chciałbym.
Wniosek
- Windows 7 wysyła pakiety rozgłoszeniowe tylko do jednego interfejsu. Możesz wybrać który, ale nie o to tutaj chodzi.
- Windows XP wysyła pakiety rozgłoszeniowe do wszystkich interfejsów, ale wysyła je tylko zgodnie z oczekiwaniami do jednego interfejsu, co w praktyce jest równoważne zachowaniu systemu Windows 7.
Cel
Chcę raz na zawsze zmienić obsługę globalnej emisji IP w systemie Windows (najlepiej Windows 7). Oczywiście lepszym sposobem byłoby wprowadzenie jakiejś obsługiwanej zmiany konfiguracji (włamanie do rejestru lub podobne), ale jestem otwarty na wszystkie sugestie.
Jakieś pomysły?
źródło
Odpowiedzi:
Nie dlatego, że jestem w obronie Microsoftu, ale po przeczytaniu następujących RFC, które próbują zdefiniować sposób działania emisji, nie sądzę, że Microsoft koniecznie narusza jakiekolwiek RFC. IMO problem powinien zostać rozwiązany na poziomie aplikacji (tj. Ukierunkowane transmisje, a nie globalne), które uderzą w odpowiednie trasy w tablicy routingu i będą wysyłane tylko z właściwego interfejsu dla tej sieci IP.
Obaj twierdzą, że nie ma zdefiniowanego standardu dla transmisji. Wspomina również w 919, że należy wybrać konkretny interfejs fizyczny dla transmisji. W przypadku maszyny z wieloma domami i wieloma kartami sieciowymi, która generuje transmisję, nie sądzę, aby jasno określono, co powinno się stać. Transmisje nigdy nie powinny być przekazywane przez routery z jednego interfejsu do drugiego, więc czy komputer z systemem Windows jest routerem, czy nie w tym przypadku?
Jeśli działa jako router, to każdy host odpowiadający na transmisję z niepoprawnym adresem IP dla tej sieci (Adaptery 2 i 3 w twoim przykładzie) powinien odesłać pakiet z powrotem na adres ethernetowy Adaptery 2 i 3 w odpowiedzi na Adapter Adres IP 1 i host systemu Windows powinny skierować go do odpowiedniego interfejsu.
Brzmi myląco ... ale nie mogę wymyślić lepszego sposobu na wyrażenie tego
I wreszcie, RFC 919 wyraźnie mówi Z RFC 919
Odczyt sugerujący, że źródłowy adres IP nie ma znaczenia dla transmisji.
Ponieważ każda aplikacja wydaje się obsługiwać transmisje inaczej, myślę, że na tym spoczywa odpowiedzialność. Na przykład.
nbtstat
wysyła ukierunkowane transmisje na komputerach obsługujących wiele kart sieciowych, podczas gdy gry mogą korzystać z transmisji globalnych.Krótko mówiąc, aplikacja powinna zostać naprawiona, a nie system operacyjny w tym przypadku ...
EDYCJA: Oto link do tych samych okoliczności, ale w Linuksie. Jądro Linuksa obsługuje go, wysyłając tylko jeden pakiet z domyślnego interfejsu (w tym przykładzie NIC A). Zalecają, aby aplikacja wyliczyła karty sieciowe i wysłała skierowaną transmisję do każdej karty sieciowej. Połączyć
źródło
Wreszcie rozwiązałem to programowo. Napisałem bardzo małe oprogramowanie o nazwie WinIPBroadcast, które zajmuje się przekazywaniem ramek rozgłoszeniowych do wszystkich interfejsów.
Działa z ciekawym faktem: możliwe jest otrzymywanie lokalnie generowanych globalnych pakietów rozgłoszeniowych podczas słuchania na adres pętli zwrotnej (127.0.0.1). WinIPBroadcast nasłuchuje na adres lokalny dla wszystkich emisji za pomocą gniazd RAW, a następnie dla każdego pakietu transmisji, przekazuje go do wszystkich interfejsów oprócz preferowanego.
źródło
The program can't start becuase api-ms-win-core-rtlsupport-l1-2-0.dll is missing from your computer.
. Powodzenia w znalezieniu tego.dll
w Google.