Желаемое поведение
Когда приложение отправляет пакет на глобальный широковещательный 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). Конечно, лучшим способом было бы иметь какое-то поддерживаемое изменение конфигурации (взлом реестра или подобное), но я открыт для всех предложений.
Есть идеи?