Сетевые повторы 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, При этом повторная попытка делает именно то, что должна (повторяется до тех пор, пока я не подниму запись в таблице маршрутизации).

0 ответов

Другие вопросы по тегам