Сидни Фейт - TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security)
20.9.2 Запрос get и ответ на него
На рис. 20.10 показаны запрос get-request и ответ на него (response), полученные в анализаторе Sniffer компании Network General. Запрос содержит список из пяти переменных, значения которых нужно получить. После каждого идентификатора переменной стоит заполнитель NULL. Чтобы создать ответ, агент должен только заполнять пробелы и заменять пустые поля фактическими значениями.
SNMP: Version = 0
SNMP: Community = public
SNMP: Command = Get request
SNMP: Request ID = 112
SNMP: Error status = 0 (No error)
SNMP: Error index = 0
SNMP:
SNMP: Object = {1.3.6.1.2.1.1.3.0} (sysUpTime.0)
SNMP: Value = NULL
SNMP:
SNMP: Object = {1.3.6.1.2.1.5.1.0} (icmpInMsgs.0)
SNMP: Value = NULL
SNMP:
SNMP: Object = {1.3.6.1.2.1.5.2.0} (icmpInErrors.0)
SNMP: Value = NULL
SNMP:
SNMP: Object = {1.3.6.1.2.1.5.3.0} (icmpInDestUnreachs.0)
SMMP: Value = NULL
SNMP:
SNMP: Object = {1.3.6.1.2.1.5.4.0} (icmpInTimeExcds.0)
SNMP: Value = NULL
SNMP: Version = 0
SNMP: Community = public
SNMP: Command = Get response
SNMP: Request ID = 112
SNMP: Error status = 0 (No error)
SNMP: Error index = 0
SNMP:
SNMP: Object = {1.3.6.1.2.1.1.3.0} (sysUpTime.0)
SNMP: Value = 1037388 hundredths of a second SNMP:
SNMP: Object = {1.3.6.1.2.1.5.1.0} (icmpInMsgs.0)
SNMP: Value = 1 messages
SNMP:
SNMP: Object = {1.3.6.1.2.1.5.2.0} (icmpInErrors.0)
SNMP: Value = 0 messages
SNMP:
SNMP: Object = {1.3.6.1.2.1.5.3.0} (icmpInDestUnreachs.0)
SNMP: Value = 0 messages
SNMP:
SNMP: Object = {1.3.6.1.2.1.5.4.0} (icmpInTimeExcds.0)
SNMP: Value = 0 message
Рис. 20. 1. Пример get-request и response
20.9.3 Запрос get-next и ответ на него
Сообщение get-next работает по-другому. Когда отсылается идентификатор объекта, возвращается значение следующего объекта. Например, если послать запрос:
SNMP: Object = {1.3.6.1.2.1.5.1.0} (icmpInMsgs.0)
SNMP: Value = NULL
ответ будет содержать имя и значение для следующей переменной:
SNMP: Object = {1.3.6.1.2.1.5.2.0} (icmpInErrors.0)
SNMP: Value = 0 messages
Такой запрос позволяет просматривать значения MIB или перемещаться на следующую строку таблицы.
20.9.4 Запрос set
Запрос set позволяет записывать информацию в базу данных агента. Формат сообщения очень прост, он выглядит как get-request, но приводит к изменению указанных в запросе переменных. На рис. 20.11 показано отслеживание запроса set.
SNMP: Version = 0
SNMP: Community = xyz
SNMP: Command = Set request
SNMP: Request ID = 0
SNMP: Error status = 0 (No error)
SNMP: Error index = 0
SNMP:
SNMP: Object = {1.3.6.1.2.1.4.1.0} {ipForwarding.0}
SNMP: Value = 2
SNMP: Object = {1.3.6.1.2.1.4.2.0} (ipDefaultTTL.0)
SNMP: Value = 70
Рис. 20.11. Изменение значений MIB запросом set
Успешными должны быть все изменения запроса, иначе будет отклонен весь запрос. Поскольку часто нужно изменять одновременно несколько переменных, либо ни одну из них. Это бескомпромиссное правило для set сохраняется и в версии 2.
Ответ на set выглядит как запрос, за исключением того, что при возникновении проблем заполняются поля статуса ошибки и индекса ошибки.
20.9.5 Сообщения trap
Агент использует сообщения trap для указания диспетчеру на серьезные проблемы.
В стандарте SNMP определено очень немного таких сообщений. Описание trap оставлено в ведении комитетов по технологическим стандартам и разработчиков — с предупреждением о снижении количества таких сообщений. Когда сеть перегружена, нежелательно получать десятки сообщений от каждого из сетевых устройств с указаниями на их проблемы.
Сообщения trap в версии 1 были более сложными, чем следовало бы. Такое положение было исправлено в версии 2. Рассмотрим сначала сообщения trap версии 1. В них имеется общее поле (generic trap), значение которого определяет тип прерывания в соответствии со следующим списком:
соldStart(0) Отправитель проводит переинициализацию, и его конфигурационные параметры могут измениться. warmStart(1) Отправитель проводит переинициализацию, и его конфигурационные параметры не будут изменяться. linkDown(2) Смежная связь нарушена. linkUp(3) Смежная связь восстановлена. autentication Failure(4) Кто-то послал агенту запрос, который не был аутентифицирован (например, в сообщении было использовано неправильное имя сообщества). egpNeighbor Loss(5) Сосед по протоколу Exterior Gateway Protocol выключен. enterprise Specific(6) Другие запросы, определенные комитетом стандартов, разработчиком или иным заинтересованным лицом.На рис. 20.12 показано очень простое сообщение trap, указывающее на выполнение холодного старта (перезапуска с выключением питания. — Прим. пер.).
■ Поле Enterprise указывает, что это сообщение отправлено системой, выполняющей программный продукт FTP для TCP/IP.
■ Поскольку значение общего поля trap равно 0, это сообщение свидетельствует о холодном старте.
■ Поле счетчика времени (time ticks) содержит sysUpTime, которое равно 0, поскольку система только что выполнила инициализацию по холодному старту.
SNMP: Version = 0
SNMP: Comunity = public
SNMP: Command = Trap
SNMP: Enterprise = {1.3.6.1.4.1.121.1.1}
SNMP: Network address = [198.207.177.10]
SNMP: Generic trap = 0 (Cold start)
SNMP: Specific trap = 0
SNMP: Time ticks = 0
Рис. 20.12. Сообщение trap версии 1 протокола SNMP
Любые сообщения trap, определенные комитетом MIB или разработчиком, имеют в общем поле значение 6. В данном случае поле enterprise комбинируется с полем specific trap (специальное прерывание), определяющим смысл сообщения.
Как видим, структура сообщения достаточно сложна. В версии 2 она была проще.
20.9.6 Проблемы версии 1, исправленные в версии 2
Следующие свойства SNMP версии 1 были не слишком удачны:
■ Если одна из переменных в запросе get или get-next была некорректна, то отбрасывалось все сообщение.
■ Если запрашивались значения нескольких переменных и агент не мог разместить ответ в самом большом по размеру сообщении, отбрасывалось все сообщение.
■ Сообщения trap реализовывали простые функции, но имели сложную структуру.
Все эти проблемы были решены в версии 2. Теперь агент может помещать код ошибки в поле значения переменной, которая не может быть обработана. Появился новый запрос get-bulk, требующий от агента возврата максимально возможного объема информации. Сообщения trap стали иметь такой же простой формат, как и все другие сообщения.
В версии 2 расширен список поддерживаемых кодов ошибок, что позволяет диспетчерам лучше проанализировать причину неисправности, когда отклоняется запрос.
20.9.7 Сообщение get-bulk версии 2
Сообщение get-bulk ведет себя подобно get-next. Агент возвратит переменные, чьи идентификаторы объектов следуют за идентификаторами объектов, указанными в запросе. Сообщение get-bulk имеет параметры, указывающие:
■ Количество начальных автономных неповторяющихся (nonrepeater) запрошенных переменных
■ Количество требуемых повторений для оставшихся повторяющихся (repeater) переменных
Например, можно запросить две неповторяющиеся автономные переменные:
sysDescr
sysUpTime
и затем еще десять строк табличных переменных: ifIndex, ifDescr, ifTyре, ifMTU и ifSpeed. В этом случае:
■ В списке будет 7 переменных
■ 2 неповторяющиеся переменные
■ Максимальное число повторений будет равно 10
В ответе будет упаковано столько затребованной информации, сколько возможно. Приложение легко сможет послать еще один запрос get-bulk за данными, не поместившимися в сообщении ответа.
Так как поля статуса ошибки и индекса ошибки не используются в запросах, они задействованы в запросе get-bulk для хранения неповторяющихся параметров и максимального значения повторений. Это означает, что базовый формат не изменился при реализации нового сообщения get-bulk.