Сетевые повторы SNMP не работают должным образом?
У меня какая-то странная проблема с SNMP, требующая не только моих собственных навыков.
Версия NET-SNMP: 5.7.3
Я говорю с системой, использующей SNMPGET через ненадежное сетевое соединение, и механизм повторных попыток Net SNMP, похоже, не работает должным образом. Я могу сделать GET-запрос несколько раз, и обычно я получаю ответ, но с перерывами запрос будет отправлен, и пакет не будет возвращен (проверено с помощью tcpdump). Если система не получает ответ на запрос, Net-SNMP отправляет новый запрос, который использует тот же request-id
как оригинальный пакет.
Хорошо, пока это имеет смысл, но проблема возникает, когда механизм повторных попыток NET-SNMP просто... не решает проблему. Я обнаружил, что цикл повторных попыток будет повторяться полностью каждый раз (даже когда я указываю абсурдное количество повторов, например, 50) - поэтому он отправляет пакет с тем же request-id
Х раз и ничего не получаю обратно каждый раз.
Обходной путь просто выполняет ту же команду (snmpget {connectionInfo}
... я использую -Dtransport,dumpv
для отладки тоже) еще раз, и мы получаем ответ довольно надежно.
Единственное различие между повторным запросом и новым запросом, сгенерированным новой командой, заключается в том, что request-id
изменения (таким образом, обходя проблемы с каким-то механизмом кэширования, о котором я не знаю). Я на самом деле клонировал Net SNMP-репозиторий, чтобы посмотреть, что делает код, и обнаружил, что "сессия" (UDP-сессии? Кажется, просто структура данных, содержащая информацию о соединении) создается в snmpget.c
а затем повторно используется в snmp_api.c
,
TL; DR Net SNMP повторяет отправку одного и того же запроса несколько раз и дает сбой, пока не будет достигнут порог повторной попытки. Повторное выполнение команды, как правило, работает. Зачем?
Дополнительная информация Я попытался локально симулировать потерю соединения, чтобы проверить механизм повтора. Я сделал это используя route add/del {targetIP} via 127.0.0.1
, При этом повторная попытка делает именно то, что должна (повторяется до тех пор, пока я не подниму запись в таблице маршрутизации).