Рисунок 4.1.1. Пример диагностируемой сети
Для диагностики сегмента, непосредственно связанного с ЭВМ-тестером, можно использовать режим 6 Ethernet-интерфейса ЭВМ-тестера. Этот режим, при котором принимаются все пакеты, следующие по сегменту, позволяет регистрировать распределение пакетов по адресам отправителя и получателя, протоколам, длинам пакетов и т.д.. Запуская определенные программы на ЭВМ 1 или 2 (сегмент С-1), можно получить исчерпывающую информацию о состоянии сегмента. Этот способ диагностики не пригоден для сегментов, к которым подключены ЭВМ 3 (сегмент С-2), 4 и 5 (сегмент С-3). В случае, если все ЭВМ сети поддерживают протокол tcp/ip, возможно применение для целей диагностики протокола icmp (RFC-1256, -1788, -1885, -792). Этот протокол также как и snmp пригоден для диагностики не только локальной сети но и каналов Интернет. Если использовать icmp не только для трассировки маршрутов, но и для измерения процента испорченных пакетов, можно получить весьма полезную информацию, а при длинных сегментах зарегистрировать ухудшение качества сегмента при подключении слишком большого числа ЭВМ. Такая техника может прогнозировать ухудшение пропускной способности канала при подключении дополнительных ЭВМ. Но применение icmp ограничено ЭВМ, поддерживающими протоколы Интернет, да и получаемые данные весьма ограничены.
Следует иметь в виду, что в многопротокольных средах структуры MIB могут заметно отличаться, варьируется несколько и формат SNMP-пакетов. В настоящее время существует достаточно большой выбор коммерческих программ сетевой SNMP-диагностики (их цены лежат в диапазоне 5-45 тыс. дол.). Особую ценность представляют аппаратно-программные комплексы (15-55 тыс. дол.), которые способны диагностировать состояние оборудования и кабельных сегментов. К сожалению, для отечественных пользователей они по причине цены практически недоступны.
Сеть ИТЭФ, которая была зарегистрирована одной из первых в качестве узла Интернет в 1991 году, в настоящее время содержит более 400 ЭВМ при суммарной длине кабельных сегментов около 10 км и обслуживается 6 сотрудниками.
В сети используются протоколы TCP/IP, Novell, Arcnet и др.. Проблема диагностики такой сети достаточно актуальна. Мы сначала использовали традиционные программные средства типа ping, traceroute, netstat, arp, snmpi, dig (venera.isi.edu/pub), hosts, nslookup, ifconfig, ripquery, поставляемые со многими сетевыми пакетами. Позднее пытались адаптировать общедоступные диагностические средства типа: netwatch (windom.ucar.edu), snmpman (http:// www.smart.is/pub/mirror-indstate/snmp), netguard (oslo-nntp,eunet.no/pub/msdos/winsock/apps), ws_watch (bwl.bwl.th-harmstadt.de/windows/util). Среди наиболее часто встречающихся проблем: разрывы кабельных сегментов, несанкционированное использование IP-адресов, некачественное питание сетевого оборудования, отказы тех или иных устройств.
Не все ЭВМ имеют активные SNMP-резиденты, это происходит по причине экономии оперативной памяти или по соображениям безопасности. Еще меньше snmp-агентов, доступных в режиме public (поле SNMP-пакета community; формат пакетов описан, например, в книге Семенова Ю.А. “Протоколы и ресурсы Интернет”, Москва, “Радио и связь”, 1996). Но для контроля ситуации достаточно иметь по одному активному SNMP-резиденту на каждом из кабельных сегментов. При этом не обязательно ставить их в общедоступный режим, можно использовать для получения диагностической информации и пароль.
При написании диагностической программы не нужно пытаться считывать все переменные и таблицы MIB. База данных весьма велика и для целей диагностики не все ее записи представляют интерес. При написании нашей диагностической программы были отобраны 35 переменных (ниже приводится сокращенный список):
interface.iftable.ifentry.ifinucastpkts | Число полученных обычных пакетов; |
interface.iftable.ifentry.ifinnucastpkts | Число полученных широковещательных и мультикаст-пакетов; |
interface.iftable.ifentry.ifinerrors | Число ошибок при приеме пакетов; |
interface.iftable.ifentry.ifoutucastpkts | Число посланных обычных пакетов; |
interface.iftable.ifentry.ifinnucastpkts | Число посланных широковещательных и мультикаст-пакетов; |
interface.iftable.ifentry.ifinunknownprotos | Число полученных пакетов с неизвестным кодом протокола; |
ip.ipinreceives | Полное число ip-дейтограмм, включая полученные с ошибкой; |
ip.ipinhdrerrors | Число входных ip-дейтограмм с ошибками в заголовке пакета, включая ошибки контрольной суммы, ttl и т.д. |
ip.ipinaddrerrors | Число полученных пакетов с ошибкой в адресе; |
ip.ipinunknownprotos | Число входных ip-дейтограмм, с кодами протоколов, которые не поддерживаются данной системой; |
ip.ipreasmreqds | Число полученных фрагментов, которые требуют сборки; |
ip.ipindelivers | Число ip-дейтограмм, принятых без ошибок (включая icmp); |
icmp.icmpinmsgs | Число полученных icmp-пакетов;(другие 10 контролируемых переменных icmp-группы из соображений экономии места из списка исключены); |
udp.udpindatagrams | Число принятых udp-дейтограмм; |
udp.udpoutdatagrams | Число отправленных udp-дейтограмм; |
udp.udpnoports | Полное число udp-дейтограмм, для которых не существует приложения для указанного номера порта; |
udp.udpinerrors | Число udp-дейтограмм, которые не могут быть доставлены не по причине отсутствия приложения по указанному порту; |
tcp.tcpinsegs | Число принятых tcp-сегментов; |
tcp.tcpoutsegs | Число отправленных TCP-сегментов; |
tcp.tcpretranssegs | Число tcp-сегментов с повторной пересылкой; |
tcp.tcpoutrsts | Число сегментов с флагом rst=1; |
tcp.tcpinerror | Число tcp-сегментов, полученных с ошибкой. |