После обновления нашей группы разработчиков до Windows 10 с 7 у нас возникла проблема с кешем ARP, когда на машине кэшировано правильное сопоставление IP-MAC, но тип недействителен из-за сбоев подключения во время отключения питания целевой машины. В Windows 10, но не в Windows 7, целевой компьютер не может быть подключен до тех пор, пока кеш ARP не будет очищен. Я могу воспроизвести проблему следующим образом, где 10.10.10.10 - правильный IP-адрес, а 01: 23: 45: 67: 89: AB - правильный MAC-адрес рассматриваемой целевой машины:
Начните с выключенной целевой машины и пропингуйте ее на протяжении всего теста:
ping -t 10.10.10.10
Ping отвечает сообщением "Превышено время ожидания запроса", и кеш ARP, как и ожидалось, содержит
10.10.10.10 00:00:00:00:00:00 invalid
Включите целевую машину. Ping начинает получать ответы, и кеш ARP обновляется до
10.10.10.10 01:23:45:67:89:AB dynamic
Все идет нормально.
Выключите целевой компьютер. Ping начинает сообщать "Истекло время ожидания запроса", а кеш ARP остается
10.10.10.10 01:23:45:67:89:AB dynamic
Примерно через 40 секунд пинг отвечает сообщением «Целевой хост недоступен» для одного запроса, затем возвращается к сообщению «Истекло время ожидания запроса», а кеш ARP изменяется на
10.10.10.10 01:23:45:67:89:AB invalid
Включите целевой компьютер, и ping (и любое другое соединение) не найдет его, пока вы не очистите кеш ARP или, по крайней мере, не удалите неправильную запись с правильным сопоставлением IP-MAC с недопустимым типом.
Как мне предотвратить переход кэша ARP в это состояние, учитывая, что целевая машина в среде разработки, как правило, требует включения и выключения питания в процессе разработки? Ручное управление кешем ARP не является устойчивым, и никто не сообщал об этой проблеме до перехода на Windows 10.
Windows 7 работает так, как и следовало ожидать, то есть то, что мы желаем: кэш ARP проходит те же этапы, что и выше. Ping начинается с ответа «Целевой хост недоступен» перед включением целевого устройства, в отличие от «Истекло время ожидания запроса» в Windows 10, и постоянно возвращается к «Целевой хост недоступен» после выключения, в отличие от Windows 10, сообщающей только один раз . Когда машина включается, соединение сразу устанавливается, и кэш ARP возвращается в
10.10.10.10 01:23:45:67:89:AB dynamic
без необходимости сначала очищать записи.
Конкретная установка разработчиков - это рабочая станция Windows, подключенная к нескольким Beaglebone Blacks (небольшие встроенные платы на базе ARM, работающие под управлением Linux) через простой неуправляемый 8-портовый гигабитный коммутатор. IP-адреса назначаются зарезервированным DHCP, и адреса успешно выбираются каждый раз при включении Beaglebones. Когда одна машина с Windows 10 имеет недопустимую запись ARP, которую необходимо удалить, другие машины без Beaglebone в кэше ARP могут успешно подключиться к целевой машине.
Все так же после всех этих лет. Очень раздражает при разработке встраиваемых систем.
По крайней мере, я нашел несколько полурешений.
Win10 немедленно отбрасывает все кеширование ARP на интерфейсе, когда связь обрывается. Таким образом, при выключении встроенного устройства кэш очищается. Это не является проблемой.
Проблема возникает, когда Windows пытается выполнить ARP-протокол для устройства, прежде чем оно сможет ответить. Это устанавливает кэш ARP на сбой («неполный»). Даже если устройство подключается к сети и будет отвечать на запросы ARP, какое-то время такие запросы не поступают. Ситуация требует либо еще одного жесткого сброса ссылки и повторного ARP, что равносильно очистке кэша ARP, либо ожидания около минуты перед повторным ARP Win10.
Простое, но обычно раздражающее решение - добавить статическую запись ARP. Это раздражает, потому что а) вам нужно знать это заранее и б) для этого вам нужно быть администратором на ПК.
Еще одно исправление - наличие в линии коммутатора Ethernet, который защищает компьютер Win10 от разрыва связи и отключение функции обнаружения недостижимости соседа (как администратор):
netsh interface ipv4 set interface nud = disabled store = persistent
Теперь при неудачной попытке доступа к загрузочному устройству кэш не опустится до «Неполный».
Ни одно из этих решений не является удовлетворительным, но они помогут вам немного продвинуться вперед.
Хоппи