Интересно: у меня есть устройство со следующими записями SNMP MIB:
IF-MIB::ifNumber.0 = INTEGER: 46
IF-MIB::ifIndex.805306369 = INTEGER: 805306369
IF-MIB::ifIndex.805306370 = INTEGER: 805306370
....
IF-MIB::ifIndex.1073741861 = INTEGER: 1073741861
IF-MIB::ifIndex.1073741862 = INTEGER: 1073741862
IF-MIB::ifIndex.1073741863 = INTEGER: 1073741863
snmptranslate -IR -Td ifIndex
говорит:
IF-MIB::ifIndex
ifIndex OBJECT-TYPE
-- FROM IF-MIB
-- TEXTUAL CONVENTION InterfaceIndex
SYNTAX Integer32 (1..2147483647)
DISPLAY-HINT "d"
MAX-ACCESS read-only
STATUS current
DESCRIPTION "A unique value, greater than zero, for each interface. It
is recommended that values are assigned contiguously
starting from 1. The value for each interface sub-layer
must remain constant at least from one re-initialization of
the entity's network management system to the next re-
initialization."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) interfaces(2) ifTable(2) ifEntry(1) 1 }
Но я действительно не понимаю, что означает F-MIB::ifIndex.805306369 = INTEGER: 805306369
. Я ожидаю, что первое число должно начинаться с единицы, сопоставляя логическое число с некоторым физическим числом.
Я предполагаю, что некоторые разработчики также не понимали, что он должен делать ;-)
Читая RFC 2863 (или RFC 2233), ситуация становится еще более запутанной: «Его значение находится в диапазоне от 1 до значения ifNumber. (...)»
«Решение, принятое в этом меморандуме, состоит в том, чтобы просто удалить требование о том, что значение ifIndex должно быть меньше значения ifNumber, и сохранить ifNumber с его текущим определением».
«Это решение также приводит к возможности «дыр» в ifTable, то есть значения ifIndex концептуальных строк в ifTable не обязательно являются смежными, но операция SNMP GetNext (и GetBulk) легко справляется с такими дырами».
"Требование постоянства (между повторными инициализациями) значения ifIndex интерфейса выполняется за счет требования, чтобы после динамического удаления интерфейса его значение ifIndex не использовалось повторно другим динамически добавляемым интерфейсом до тех пор, пока после последующей повторной инициализации системы управления сетью. Это позволяет избежать необходимости назначения (заранее) значений ifIndex для всех возможных интерфейсов, которые могут быть добавлены динамически».
Я думаю, что часть путаницы возникает из-за «value of ifIndex», где неясно, относится ли оно к левой или правой стороне (ИМХО, это правая сторона). Является ли левая сторона уникальным первичным ключом к индексной таблице, а правая — просто произвольным фиктивным значением или что? Возможно, основной недостаток дизайна заключается в том, что доступ к данным интерфейса должен осуществляться по уникальному имени интерфейса, а не по индексу, который может время от времени меняться (индекс все равно можно использовать для перечисления доступных имен). .