Желаемое поведение
Когда приложение отправляет пакет на глобальный широковещательный IP-адрес 255.255.255.255
, я хотел бы, чтобы пакет был отправлен на глобальный широковещательный адрес Ethernet ( ff:ff:ff:ff:ff:ff
) на всех интерфейсах.
В Linux и, возможно, в других операционных системах это работает. Windows XP и Windows 7 демонстрируют разное поведение по этому поводу, и ни одно из них не подходит для моей ситуации.
Поведение Windows XP
Пакет будет правильно отправлен на первый сетевой интерфейс (порядок интерфейса указан в «Сетевые подключения / Дополнительные / Дополнительные параметры»). Он также будет отправлен на другие интерфейсы.
Пока все правильно. Проблема заключается в том, что при отправке на другие интерфейсы адрес источника широковещательного пакета является IP-адресом первого интерфейса. Например, представьте эту конфигурацию сети (порядок важен):
- Адаптер 1: IP-адрес
192.168.0.1
- Адаптер 2: IP-адрес
10.0.0.1
- Адаптер 3: IP-адрес
172.17.0.1
Теперь, если я отправлю широковещательный пакет, будут отправлены следующие пакеты (с IP-адресами источника и назначения):
- На адаптере 1:
192.168.0.1
=>255.255.255.255
- На адаптере 2:
192.168.0.1
=>255.255.255.255
На адаптере 3:
192.168.0.1
=>255.255.255.255
На практике приложения, использующие широковещательные пакеты, не будут работать ни на каких интерфейсах, кроме адаптера 1. На мой взгляд, это явная ошибка в стеке TCP / IP Windows XP.
Поведение Windows 7
Изменение порядка сетевого интерфейса, похоже, не оказывает никакого влияния на Windows 7. Вместо этого широковещательная рассылка, по-видимому, контролируется таблицей 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
===========================================================================
Видишь 255.255.255.255
маршруты? Да, они контролируют широковещательные пакеты. В этой ситуации широковещательные пакеты будут отправляться по той 192.168.0.3
причине, что она имеет более низкий показатель ... но не на другие интерфейсы.
Вы можете изменить интерфейс, через который глобальные широковещательные пакеты будут отправляться очень легко (просто добавьте постоянный 255.255.255.255
маршрут с низкой метрикой). Но как бы вы ни старались, широковещательные пакеты будут отправляться только на один интерфейс, но не на все, как мне бы хотелось.
Заключение
- Windows 7 отправляет широковещательные пакеты только на один интерфейс. Вы можете выбрать, какой из них, но это не главное здесь.
- Windows XP отправляет широковещательные пакеты на все интерфейсы, но отправляет их, как и ожидалось, только на один интерфейс, что на практике эквивалентно поведению Windows 7.
Цель
Я хочу раз и навсегда изменить эту глобальную поддержку IP-трансляции в Windows (предпочтительно Windows 7). Конечно, лучшим способом было бы иметь какое-то поддерживаемое изменение конфигурации (взлом реестра или подобное), но я открыт для всех предложений.
Есть идеи?
источник
Ответы:
Не то чтобы я занимался защитой Microsoft, но после прочтения следующих RFC, которые пытаются определить, как работают трансляции, я не думаю, что Microsoft обязательно нарушает какие-либо RFC. ИМО проблема должна быть решена на уровне приложения (т. Е. Направленное широковещание, а не глобальное), которое попадет на соответствующие маршруты в таблице маршрутизации и будет отправлено только с правильного интерфейса для этой IP-сети.
Они оба заявляют, что не существует стандарта, определенного для трансляций. В 919 также упоминается, что для вещания должен быть выбран конкретный физический интерфейс. В случае машины с несколькими сетевыми сетями, генерирующей трансляцию, я не думаю, что четко указано, что должно произойти. Вещания никогда не должны передаваться маршрутизаторами с одного интерфейса на другой, поэтому машина Windows - это маршрутизатор или нет в этом случае?
Если он действует как маршрутизатор, то любой хост, отвечающий на широковещательную рассылку с неверным IP-адресом для этой сети (адаптеры 2 и 3 в вашем примере), должен отправить пакет обратно на адрес Ethernet адаптеров 2 и 3 в ответ на адаптер. IP-адрес 1 и хост Windows должны направить его на соответствующий интерфейс.
Это звучит странно ... но я не могу придумать лучшего способа выразить это
И, наконец, RFC 919, в частности, говорит От RFC 919
Чтение, которое предполагает, что IP-адрес источника не имеет значения для трансляции.
Поскольку каждое приложение по-разному обрабатывает трансляции, я думаю, что именно в этом и заключается ответственность. Например.
nbtstat
отправляет прямые трансляции на машины с несколькими сетевыми платами, в то время как игры могут использовать глобальные трансляции.Короче, приложение должно быть исправлено, а не ОС в этом случае ...
РЕДАКТИРОВАТЬ: Вот ссылка на те же обстоятельства, но на Linux. Ядро linux обрабатывает его, отправляя только один пакет из интерфейса по умолчанию (NIC A в этом примере). Они рекомендуют приложению перечислять сетевые карты и отправлять направленную широковещательную рассылку на каждую сетевую карту. Ссылка
источник
Наконец, я решил это программно. Я написал очень маленькое программное обеспечение под названием WinIPBroadcast, которое заботится о ретрансляции кадров вещания на все интерфейсы.
Это работает с использованием интересного факта: возможно получать локально сгенерированные глобальные широковещательные пакеты при прослушивании по адресу обратной связи (127.0.0.1). WinIPBroadcast прослушивает локальный адрес для всех широковещательных сообщений с использованием сокетов RAW, затем для каждого широковещательного пакета передает его на все интерфейсы, кроме предпочтительного.
источник
The program can't start becuase api-ms-win-core-rtlsupport-l1-2-0.dll is missing from your computer.
, Удачи в поиске.dll
в Google