Администратор тестов сети

Администратор тестов сети отслеживает входящие и исходящие сетевые пакеты в системе (информация пакета интерпретируется модулем bpf в AIX). Спецификация теста позволяет указывать фильтры BPF (пакетный фильтр Berkeley), аналогичные выражениям фильтров программы tcpdump для более точного отслеживания.

Можно использовать встроенные переменные для чтения заголовка и полезной нагрузки пакета для интернет-протоколов. Например, протоколов IPv4, IPv6, TCP, UDP, ICMP, IGMP и ARP.

Администратор тестов сети сообщает о важных событиях протокола (например, изменение состояния TCP, время оборота пакета, повторные передачи, переполнение буфера UDP).

Администратор тестов сети используется главным образом в следующих случаях:

  • Предоставление модулю bpf следующей информации о пакете на основе IP-адреса и портов:
    • Отслеживание входящих и исходящих данных для соединения.
    • Для чтения заголовка протокола и полезной нагрузки предусмотрены следующие встроенные переменные.
      • Флаги TCP (SYN, FIN), последовательность TCP и число подтверждения.
      • IPv4/IPv6 (IP-адреса, типы протоколов: tcp, udp, icmp, igmp и т. д.)
      • ICMP (тип пакета: ECHO REQUEST, ECHO RESPONSE и т. д.).
  • Обеспечение доступа к полному исходному содержимому сетевого пакета для обработки сценарием теста.
  • Информирование о следующих событиях протокола:
    • Отслеживание событий заполнения буфера отправителя и получателя TCP.
    • Переход соединения TCP из состояния SYN-SENT в состояние ESTABLISHED или из состояния ESTABLISHED в состояние CLOSE.
    • Мониторинг времени перехода между состояниями (например, сколько времени занял переход из состояния SYN-SENT в состояние ESTABLISHED).
    • Обнаружение получателей (информация о соединении), отклоняющих соединения из-за переполнения очереди.
    • Обнаружение повторных передач (вторая и последующие повторные передачи пакета) для соединений TCP.
    • Обнаружение потери пакетов сокетом UDP из-за слишком маленького буфера приема.

Спецификация теста

Спецификация теста для администратора тестов сети состоит из трех или пяти кортежей, разделенных двоеточием (:). Первый кортеж всегда @@net.

Администратор тестов сети поддерживает две основные категории спецификаций: одна предназначена для сбора информации о пакете, другая - для сбора информации о протоколе.

  • Формат для сбора информации о пакете:

    @@net:bpf:<интерфейс-1>|<интерфейс-2>|…..:<протокол>:<фильтр>

  • Формат для сбора информации о протоколе

    @@net:tcp:<имя-события>

    @@net:udp:<имя-события>

Подтип теста

Второй кортеж обозначает подтип теста, указывающий уровень сетевого стека AIX, содержащий тест. Этот кортеж может иметь одно из следующих значений (* нельзя указывать):

Табл. 1. Спецификация второго кортежа для подтипа теста
Второй кортеж (подтип) Описание
bpf Этот тест запускается на уровне сетевого интерфейса, когда пакет соответствует определенному фильтру.
tcp Этот тест запускается для событий протокола TCP.
udp Этот тест запускается для событий протокола UDP.

Проверка сетевого события или сбор информации о сетевом пакете

Третий кортеж зависит от подтипа (второй кортеж). Его значение не может быть *.

Тесты bpf

Спецификация содержит 5 кортежей для тестов bpf (см. следующую таблицу).

Табл. 2. Тесты bpf. Спецификация кортежей
Второй кортеж (подтип) Следующие кортежи Описание

bpf

Третий кортеж - имена интерфейсов В этом кортеже указывается интерфейс или список интерфейсов, для которых будет собираться информация о пакетах. Возможные значения: enX (например, en0,en1) и lo0. Значение * не поддерживается для этого кортежа. Можно указать один или несколько интерфейсов, используя символ | в качестве разделителя.
Четвертый кортеж - протокол В этом кортеже указывается протокол для запуска теста. Возможные значения: ether, arp, rarp, ipv4, ipv6, tcp, udp, icmp4, icmp6 и igmp. Заполняются встроенные переменные для протокола, доступные из сценария Vue. Например, значение протокола ipv4 заполняет встроенные переменные __ip4hdr.
Значение * для этого кортежа указывает, что тест запускается для всех типов протоколов, соответствующих указанному фильтру. Когда протокол - *, встроенные переменные, поддерживаемые администратором тестов сети, недоступны в сценариях Vue. Исходные данные пакета запрошенного размера можно получить с помощью функции Vue copy_kdata() и отобразить на заголовки соответствующих протоколов.
Прим.: Значение * может ухудшить производительность, поскольку тест будет запускаться для всех входящих и исходящих пакетов на указанных интерфейсах, которые соответствуют фильтру. Также имеет место копирование, когда информация пакета занимает несколько буферов пакетов.
Пятый кортеж - строка фильтра bpf В этом кортеже указывается выражение фильтра bpf (выражения фильтра имеют такой же синтаксис, как в команде tcpdump). Выражение фильтра должно указываться в двойных кавычках. Выражение фильтра и протокол, указанный в четвертом кортеже, должны быть совместимыми. Значение * не поддерживается в этом кортеже.
Примеры
  1. Формат спецификации для доступа к встроенным переменным, связанным с заголовком Ethernet (__etherhdr), заголовком IP (__ip4hdr или __ip6hdr) и заголовком TCP (__tcphdr), из сценария Vue, когда интерфейс en0 принимает или отправляет пакеты через порт 23 (строка фильтра "port 23"):
    @@net:bpf:en0:tcp:"port 23"
  2. Формат спецификации для доступа ко встроенным переменным, связанным с заголовком Ethernet (__etherhdr), IP-заголовком (__ip4hdr или __ip6hdr) и заголовком UDP (__udphdr) из сценария Vue, если система взаимодействует с хостом example.com (строка фильтра “example.com”) через интерфейсы en0 и en1:
    @@net:bpf:en0|en1:udp:"host example.com"
  3. Формат спецификации для доступа к исходным данным пакета, когда система принимает или отправляет пакеты для "host example.com":
    @@net:bpf:en1:*:"host example.com"
Прим.: Каждая спецификация теста bpf использует устройство bpf. Эти устройства являются общими для ProbeVue, tcpdump и другими программами, которые используют библиотеку libpcap или bpf для захвата и внедрения пакетов. Число тестов bpf зависит от числа доступных устройств bpf в системе.

При запуске теста bpf исходные данные пакета помещаются в переменную __mdata. Исходные данные пакета запрошенного размера можно получить с помощью функции Vue copy_kdata () и отобразить их на структуру ether_header, ip header и т. п. Следующие структуры применяются для извлечения заголовка и полезной нагрузки.

Пример

Сценарий VUE для доступа к исходным данным пакета, когда для протокола указано значение "*".

 /* Определение структуры заголовка ether */
struct  ether_header {
        char  ether_dhost[6];
        char  ether_shost[6];
        short ether_type;
};

/* Сценарий ProbeVue для доступа к исходным данным пакета и их интерпретации */

@@net:bpf:en0:*:"port 23"
{
        /* определение локальных переменных сценария */
        __auto struct ether_header eth;
        __auto char *mb;

        /* __mdata содержит адрес данных пакета */
        mb =(char *) __mdata;
        printf("probevue для сети\n");
        
       /* 
        * Применение функции VUE copy_kdata() для копирования данных 
        * запрошенного размера (размер структуры ether_header) из mbuf в переменную eth
        * (тип ether_header).
        */
        copy_kdata (mb, eth);
        printf("Тип из исходных данных: %x\n",eth.ether_type);
      
}

Тесты TCP

Спецификация содержит три кортежа для тестов TCP (см. следующую таблицу).

Табл. 3. Тесты TCP. Спецификация кортежей
Второй кортеж (подтип)

События (третий кортеж)

Значение * не поддерживается в этом кортеже.

Описание
tcp state_change Этот тест запускается при изменении состояния TCP.
send_buf_full Этот тест запускается при возникновении события заполнения буфера отправки.
recv_buf_full Этот тест запускается при возникновении события заполнения буфера приема.
retransmit Этот тест запускается при повторной передаче пакета через соединение TCP.
listen_q_full Этот тест запускается, когда сервер (сокет получателя запросов) отклоняет новые запросы на установку соединения из-за отсутствия места в очереди получателя.

Во встроенную переменную __proto_info помещается информация о соединении TCP (локальный IP-адрес, удаленный IP-адрес, локальный порт и удаленный порт) при возникновении события TCP. Удаленный порт и удаленный IP-адрес имеют значение NULL для события listen_q_full.

Пример

Спецификации тестов для изменений состояния протокола TCP:

@@net:tcp:state_change

Тесты udp

Для тестов udp спецификация состоит из трех кортежей (см. следующую таблицу).

Табл. 4. Значения третьего кортежа, когда второй кортеж - udp
Второй кортеж (подтип) События (третий кортеж)

Значение * не поддерживается в этом кортеже.

Описание
udp sock_recv_buf_overflow Этот тест запускается, когда возникает переполнение дейтаграммы или буфера приема данных сокета UDP.

Встроенная переменная __proto_info позволяет получить данные протокола UDP (исходный и целевой IP-адреса и номера портов), если возникает событие переполнения буфера приема.

@@net:udp:sock_recv_buf_overflow

Пример

Спецификации тестов для переполнения буфера приема данных сокета UDP:

@@net:udp:sock_recv_buf_overflow

Встроенные переменные для сценариев Vue, связанные с тестами сети

Сетевые события можно тестировать с помощью следующих встроенных переменных.

Встроенная переменная __etherhdr

Переменная __etherhdr - это специальная встроенная переменная, позволяющая получить информацию о заголовке ether из отфильтрованного пакета. Эта переменная доступна в тестах пакетной информации на уровне интерфейса с одним из следующих протоколов: ipv4, tcp, udp, icmp4 и rarp. Эта переменная доступна в тестах подтипа bpf. К ее элементам можно обращаться с помощью следующего синтаксиса: __etherhdr->элемент.

Значение встроенной переменной __etherhdr состоит из следующих элементов:

Табл. 5. Элементы встроенной переменной __etherhdr
Имя элемента Введите Описание
src_addr

mac_addr_t

Исходный MAC-адрес.

Тип данных mac_addr_t используется для хранения MAC-адреса. MAC-адрес можно вывести с помощью спецификатора формата "M".

dst_addr mac_addr_t Целевой MAC-адрес.

Тип данных mac_addr_t используется для хранения MAC-адреса. MAC-адрес можно вывести с помощью спецификатора формата "M".

ether_type unsigned short Это имя указывает на протокол, инкапсулированный в полезной нагрузке кадра Ethernet. Возможные протоколы: IPv4, IPv6, ARP и REVARP.

Может совпадать с одним из следующих значений встроенной константы для ether_type:

  • ETHERTYPE_IP
  • ETHERTYPE_IPV6
  • ETHERTYPE_ARP
  • ETHERTYPE_REVARP

См. значения ether_type в файлах заголовков /usr/include/netinet/if_ether.h и /usr/include/netinet/if_ether6.h.

Прим.: Встроенная переменная __etherhdr применяется только для интерфейсов Ethernet, для циклических интерфейсов она недоступна.
Встроенная переменная __ip4hdr

Переменная __ip4hdr - это специальная встроенная переменная, позволяющая получить информацию о заголовке IPv4 из отфильтрованного пакета. Эта переменная доступна в тестах пакетной информации на уровне интерфейса с одним из следующих протоколов: ipv4, tcp, udp, icmp4 и igmp. И содержит допустимые данные, когда версия протокола IP - IPv4. Эта переменная доступна в тестах подтипа bpf. К ее элементам можно обращаться с помощью следующего синтаксиса: __ip4hdr->элемент.

Эта встроенная переменная содержит следующие элементы:

Табл. 6. Элементы встроенной переменной __ip4hdr
Имя элемента Введите Описание
src_addr

ip_addr_t

Исходный IP-адрес.

Тип данных ip_addr_t используется для хранения IP-адреса. Для вывода IP-адреса в десятичном формате с точками используется спецификатор формата "I", для вывода имени хоста используется спецификатор формата "H". Вывод имени хоста - дорогостоящая операция.

dst_addr ip_addr_t Целевой IP-адрес.

Тип данных ip_addr_t используется для хранения IP-адреса. Для вывода IP-адреса в десятичном формате с точками используется спецификатор формата "I", для вывода имени хоста используется спецификатор формата "H". Вывод имени хоста - дорогостоящая операция.

protocol unsigned short Этот элемент указывает протокол раздела данных дейтаграммы IP. Возможные протоколы: TCP, UDP, ICMP, IGMP, FRAGMENTED и пр.

Может совпадать с одним из следующих значений встроенной константы для протокола.

IPPROTO_HOPOPTS,
IPPROTO_ICMP, 
IPPROTO_IGMP,
IPPROTO_TCP, 
IPPROTO_UDP, 
IPPROTO_ROUTING,
IPPROTO_FRAGMENT, 
IPPROTO_NONE, 
IPPROTO_LOCAL

Значения протоколов определены в заголовочном файле /usr/include/netinet/in.h.

ttl unsigned short Время хранения в кэше или ограничение на пересылку.
cksum unsigned short Контрольная сумма заголовка IP.
id unsigned short Идентификационный номер. Этот элемент используется в качестве уникального идентификатора группы фрагментов одной дейтаграммы IP.
total_len unsigned short Суммарная длина. Это значение - полный размер пакета (фрагмента), включая заголовок IP и данные, в байтах.
hdr_len unsigned short Размер заголовка IP.
tos unsigned short Тип службы.
frag_offset unsigned short Смещение фрагмента.

Это значение - смещение определенного фрагмента, относительно начала исходной, нефрагментированной, дейтаграммы IP. Первый фрагмент имеет нулевое смещение.

Может совпадать с одним из значений флага встроенной константы frag_offset. Значения флагов должны быть побитовыми и содержать значение флага встроенной константы для проверки наличия конкретного флага:

  • IP_DF (флаг отсутствия фрагмента)
  • IP_MF (флаг дополнительных фрагментов)

Значения флагов определены в заголовочном файле /usr/include/netinet/ip.h.

Встроенная переменная __ip6hdr

Переменная __ip6hdr - это специальная встроенная переменная, позволяющая получить информацию о заголовке IPv6 из отфильтрованного пакета. Эта переменная доступна в тестах пакетной информации на уровне интерфейса. Эта переменная с любым из протоколов ipv6, tcp, udp и icmp6 содержит допустимые данные, когда версия протокола IP - IPv6. Эта переменная доступна в тестах подтипа bpf. К ее элементам можно обращаться с помощью следующего синтаксиса: __ip6hdr->элемент.

Эта встроенная переменная содержит следующие элементы:

Табл. 7. Элементы встроенной переменной __ip6hdr
Имя элемента Введите Описание
src_addr

ip_addr_t

Исходный IP-адрес.

Тип данных ip_addr_t используется для хранения IP-адреса. Для вывода IP-адреса используется спецификатор формата "I", для вывода имени хоста используется спецификатор формата "H". Вывод имени хоста - дорогостоящая операция.

dst_addr ip_addr_t Целевой IP-адрес.

Тип данных ip_addr_t используется для хранения IP-адреса. Для вывода IP-адреса используется спецификатор формата "I", для вывода имени хоста используется спецификатор формата "H". Вывод имени хоста - дорогостоящая операция.

protocol unsigned short Это значение указывает протокол раздела данных дейтаграммы IP. Возможные протоколы: TCP, UDP, ICMPv6 и пр.

Может совпадать с одним из следующих значений встроенной константы для протокола:

IPPROTO_TCP,IPPROTO_UDP, IPPROTO_ROUTING, IPPROTO_ICMPV6, IPPROTO_NONE, IPPROTO_DSTOPTS, IPPROTO_LOCAL

Значения протоколов определены в заголовочном файле /usr/include/netinet/in.h.

hop_limit unsigned short Ограничение на пересылку (время хранения в кэше).
total_len unsigned short Суммарная длина (размер полезной нагрузки). Размер полезной нагрузки, включая заголовки расширений.
next_hdr unsigned short Тип следующего заголовка. Это поле обычно указывает на протокол транспортного уровня, который используется полезной нагрузкой пакета. Когда в пакете есть заголовки расширений, это поле указывает на следующий заголовок расширения. Значения этого поля такие же, как у соответствующего поля протокола IPv4.
flow_label unsigned int Метка потока.
traffic_class unsigned int Класс потока данных.

Встроенная переменная __tcphdr

Переменная __tcphdr - это специальная встроенная переменная, позволяющая получить информацию о заголовке tcp из отфильтрованного пакета. Эта переменная доступна в тестах пакетной информации на уровне интерфейса с протоколом TCP. Она доступна в тестах подтипа bpf. К ее элементам можно обращаться с помощью следующего синтаксиса: __tcphdr->элемент.

Встроенная переменная __tcphdr состоит из следующих элементов:

Табл. 8. Элементы встроенной переменной __tcphdr
Имя элемента Введите Описание
src_port unsigned short Исходный порт пакета.
dst_port unsigned short Целевой порт пакета.
flags unsigned short Биты, указывающие на передачу управляющей информации. По 1 биту на флаг.

Может совпадать с одним из значений флага встроенной константы. Значения флагов должны быть побитовыми и содержать значение флага встроенной константы для проверки наличия конкретного флага.

  • TH_FIN (Больше нет данных от отправителя)
  • TH_SYN (Запрос на установку соединения)
  • TH_RST (Сброс соединения)
  • TH_PUSH (Функция Push. Запрашивает передачу буферизованных данных приложению-получателю)
  • TH_ACK (Указывает, что данный пакет содержит подтверждение)
  • TH_URG (Указывает, что поле индикатора срочности значимое)

Дополнительную информацию об этих флагах можно найти в документации протокола TCP, значения флагов определены в заголовочном файле /usr/include/netinet/tcp.h.

seq_num unsigned int Порядковый номер.
ack_num unsigned int Число подтверждения.
hdr_len unsigned int Длина заголовка TCP
cksum unsigned short Контрольная сумма.
window unsigned short Размер окна.
urg_ptr unsigned short Индикатор срочности.

Встроенная переменная __udphdr

Переменная __udphdr - это специальная встроенная переменная, позволяющая получить информацию о заголовке udp из отфильтрованного пакета. Эта встроенная переменная доступна в тестах пакетной информации на уровне интерфейса с протоколом udp. Она доступна в тестах подтипа bpf. К ее элементам можно обращаться с помощью следующего синтаксиса: __udphdr->элемент.

Встроенная переменная __udphdr содержит следующие элементы:

Табл. 9. Элементы встроенной переменной __udphdr
Имя элемента Введите Описание
src_port unsigned short Исходный порт пакета.
dst_port unsigned short Целевой порт пакета.
length unsigned short Длина заголовка и данных UDP.
cksum unsigned short Контрольная сумма.

Встроенная переменная __icmp

Переменная __icmp - это специальная встроенная переменная, позволяющая получить информацию о заголовке icmp из отфильтрованного пакета. Эта встроенная переменная доступна в тестах пакетной информации на уровне интерфейса с протоколом icmp. Она доступна в тестах подтипа bpf. К ее элементам можно обращаться с помощью следующего синтаксиса: __icmp->элемент.

Эта встроенная переменная содержит следующие элементы:

Табл. 10. Элементы встроенной переменной __icmp
Имя элемента Введите Описание
type unsigned short Тип сообщения ICMP.

Пример: 0 - эхо-ответ, 8 - эхо-запрос, 3 - целевой адрес недоступен. Есть и другие типы. См. документацию на сетевые стандарты.

Может совпадать с одним из следующих значений встроенной константы для типов сообщений ICMP:

ICMP_ECHOREPLY, 
ICMP_UNREACH
ICMP_SOURCEQUENCH,
ICMP_REDIRECT,
ICMP_ECHO, 
ICMP_TIMXCEED,
ICMP_PARAMPROB,
ICMP_TSTAMP,
ICMP_TSTAMPREPLY,
ICMP_IREQ, 
ICMP_IREQREPLY,
ICMP_MASKREQ,
ICMP_MASKREPLY

Значения протокола определены в заголовочном файле /usr/include/netinet/ip_icmp.h.

Прим.: Определены не все возможные значения типов сообщений, поэтому значение может быть и другим.
code unsigned short Подтип сообщения ICMP.

Для каждого типа сообщений определено несколько разных кодов и подтипов. Например, нет маршрута к целевому адресу, связь с целевым адресом административно запрещена, нет соседнего узла, адрес недоступен, порт недоступен. См. документацию на сетевые стандарты.

Может совпадать с одним из следующих значений встроенной константы для подтипов ICMP:

ICMP_UNREACH_NET ICMP_UNREACH_HOST ICMP_UNREACH_PROTOCOL ICMP_UNREACH_PORT ICMP_UNREACH_NEEDFRAG ICMP_UNREACH_SRCFAIL ICMP_UNREACH_NET_ADMIN_PROHIBITED ICMP_UNREACH_HOST_ADMIN_PROHIBITED

Значения подтипов для типа 4

Значения подтипов для типа 4 следующие:

ICMP_REDIRECT_NET 
ICMP_REDIRECT_HOST 
ICMP_REDIRECT_TOSNET 
ICMP_REDIRECT_TOSHOST

Значения подтипов для типа 6

Значения подтипов для типа 6 следующие:

ICMP_TIMXCEED_INTRANS
ICMP_TIMXCEED_REASS

Значения подтипов для типа 7

Значения подтипов для типа 7 следующие:

ICMP_PARAMPROB_PTR

ICMP_PARAMPROB_MISSING

Значения подтипов сообщений определены в заголовочном файле /usr/include/netinet/ip_icmp.h.

Примечание: определены не все возможные подтипы сообщений, поэтому значение подтипа сообщения может быть и другим.

cksum unsigned short Контрольная сумма.

Встроенная переменная __icmp6

Переменная __icmp6 - это специальная встроенная переменная, содержащая заголовок icmpv6 отфильтрованного пакета. Эта переменная доступна в тестах пакетной информации на уровне интерфейса с протоколом icmp6. Она доступна в тестах подтипа bpf. Элементы этой встроенной переменной доступны посредством синтаксиса "__icmp6->элемент".

__icmp6 состоит из следующих элементов:

Табл. 11. Элементы встроенной переменной __icmp6
Имя элемента Введите Описание
type unsigned short Тип сообщения ICMPV6.

Это тип сообщения, определяющий формат остальных данных.

Может совпадать с одним из следующих значений встроенной константы для типов ICMPV6.

ICMP6_DST_UNREACH
ICMP6_PACKET_TOO_BIG
ICMP6_TIME_EXCEEDED
ICMP6_PARAM_PROB
ICMP6_INFOMSG_MASK
ICMP6_ECHO_REQUEST
ICMP6_ECHO_REPLY 

Значения протокола определены в заголовочном файле /usr/include/netinet/icmp6.h.

Прим.: Определены не все возможные значения типов сообщений, поэтому значение может быть и другим.
code unsigned short Подтип сообщения ICMPV6.

Это значение зависит от типа сообщения. Оно дает дополнительный уровень дискретности сообщения.

Может совпадать с одним из следующих значений встроенной константы для подтипов ICMPV6.

ICMP6_DST_UNREACH_NOROUTE
ICMP6_DST_UNREACH_ADMIN
ICMP6_DST_UNREACH_ADDR
ICMP6_DST_UNREACH_BEYONDSCOPE
ICMP6_DST_UNREACH_NOPORT

Значения подтипов сообщений определены в заголовочном файле /usr/include/netinet/icmp6.h.

Прим.: Определены не все возможные значения подтипов сообщений, поэтому значение может быть и другим.
cksum unsigned short Контрольная сумма.

Встроенная переменная __igmp

__igmp - это специальная встроенная переменная, содержащая заголовок igmp отфильтрованного пакета. Эта переменная доступна в тестах пакетной информации на уровне интерфейса с протоколом igmp. Эта переменная доступна в тестах подтипа bpf. Ее элементы доступны посредством синтаксиса "__igmp->элемент".

Встроенная переменная __igmp содержит следующие элементы:

Табл. 12. Элементы встроенной переменной __igmp
Имя элемента Введите Описание
type unsigned short

Тип сообщения IGMP.

Пример: Запрос членства (0x11), Отчет о членстве (IGMPv1: 0x12, IGMPv2: 0x16, IGMPv3: 0x22), Покинуть группу (0x17) См. документацию стандарта или документацию по сетям.

Может совпадать с одним из следующих значений встроенной константы для типов сообщений IGMP.

IGMP_HOST_MEMBERSHIP_QUERY
IGMP_HOST_MEMBERSHIP_REPORT
IGMP_DVMRP
IGMP_HOST_NEW_MEMBERSHIP_REPORT
IGMP_HOST_LEAVE_MESSAGE
IGMP_HOST_V3_MEMBERSHIP_REPORT
IGMP_MTRACE
IGMP_MTRACE_RESP
IGMP_MAX_HOST_REPORT_DELAY

Значения протоколов определены в заголовочном файле /usr/include/netinet/igmp.h.

Примечание: определены не все возможные значения типов сообщений, поэтому значение может быть и другим.

code unsigned short

Подтип типа IGMP.

Может совпадать с одним из следующих значений встроенной константы для подтипов сообщений IGMP.

Значения подтипов для типа 3.


DVMPP_PROBE 1
DVMRP_REPORT 2
DVMRP_ASK_NEIGHBORS 3
DVMRP_ASK_NEIGHBORS2 4
DVMRP_NEIGHBORS 5
DVMRP_NEIGHBORS2 6
DVMRP_PRUNE 7
DVMRP_GRAFT 8
DVMRP_GRAFT_ACK 9
DVMRP_INFO_REQUEST 10
DVMRP_INFO_REPLY 11
Прим.: Определены не все возможные значения подтипов сообщений, поэтому значение может быть и другим.
cksum unsigned short Значение контрольной суммы IGMP.
group_addr ip_addr_t

Групповой адрес, сообщаемый или запрашиваемый.

Этот адрес представляет собой групповой адрес, который запрашивается при отправке запроса, связанного с группой или с группой и источником. Поле имеет нулевое значение, если отправляется общий запрос.

Тип данных ip_addr_t используется для хранения IP-адреса группы. IP-адрес можно вывести с помощью спецификатора формата "I".

Встроенная переменная __arphdr

Переменная __arphdr - это специальная встроенная переменная, позволяющая получить информацию о заголовке arphdr из отфильтрованного пакета. Эта переменная доступна в тестах пакетной информации на уровне интерфейса с протоколом arp или rarp. Она доступна в тестах подтипа bpf. К элементам переменной __arphdr можно обращаться посредством синтаксиса __arphdr->элемент.

Встроенная переменная __arphdr состоит из следующих элементов:

Табл. 13. Элементы встроенной переменной __arphdr
Имя элемента Введите Описание
hw_addr_type unsigned short Формат аппаратного типа адреса. Это поле содержит конкретный протокол канала передачи данных, который используется.

Может совпадать с одним из следующих значений встроенной константы для протокола передачи данных:

ARPHRD_ETHER, 
ARPHRD_802_5, 
ARPHRD_802_3 и 
ARPHRD_FDDI

Значения протокола определены в заголовочном файле /usr/include/net/if_arp.h.

protocol_type unsigned short Формат типа адреса протокола. Это поле содержит конкретный сетевой протокол, который используется.

Может совпадать с одним из следующих значений встроенной константы для сетевого протокола:

SNAP_TYPE_IP, 
SNAP_TYPE_AP, 
SNAP_TYPE_ARP,
VLAN_TAG_TYPE

Значения протокола определены в заголовочном файле /usr/include/net/nd_lan.h.

hdr_len unsigned short Длина аппаратного адреса или MAC-адреса.
proto_len unsigned short Длина адреса протокола или IP-адреса.
operation unsigned short Операция, выполняемая отправителем: 1 - запрос, 2 - ответ.

Может совпадать с одним из следующих значений встроенной константы для сетевого протокола:

ARPOP_REQUEST,
ARPOP_REPLY 

Значения протокола определены в заголовочном файле /usr/include/net/if_arp.h.

src_mac_addr mac_addr_t MAC-адрес отправителя или исходный MAC-адрес.

Аппаратный адрес или MAC-адрес отправителя хранится в типе данных mac_addr_t. Для вывода аппаратного адреса или MAC-адреса отправителя используется спецификатор формата "%M".

dst_mac_addr mac_addr_t Целевой MAC-адрес.

Целевой аппаратный адрес или MAC-адрес хранится в типе данных mac_addr_t. Для вывода целевого аппаратного адреса или MAC-адреса используется спецификатор формата "%M".

src_ip ip_addr_t Исходный IP-адрес или IP-адрес отправителя.

Исходный IP-адрес хранится в типе данных ip_addr_t.

Для вывода IP-адреса отправителя используется спецификатор формата "%I".

dst_ip ip_addr_t Целевой IP-адрес.

Целевой IP-адрес хранится в типе данных ip_addr_t.

Для вывода целевого IP-адреса используется спецификатор формата "%I".

Пример

Сценарий Vue для тестирования информации заголовков пакетов, принимаемых или передаваемых через порт 23. Выводит информацию об исходном и целевом узлах, а также длину заголовка tcp

@@net:bpf:en0:tcp:"port 23"
{
        printf("src_addr:%I b dst_addr:%I\n",__ip4hdr->src_addr,__ip4hdr->dst_addr);
        printf("src port:%d\n",__tcphdr->src_port);
        printf("dst port:%d\n",__tcphdr->dst_port);
        printf("tcp hdr_len:%d\n",__tcphdr->hdr_len);
}

Вывод:
# probevue bpf_tcp.e
src_addr:10.10.10.12 и dst_addr:10.10.18.231
src port:48401
dst port:23
tcp hdr_len:20
..................
.................

Встроенная переменная __proto_info

Переменная __proto_info - это специальная встроенная переменная, позволяющая получить информацию о протоколе (исходные и целевые IP-адреса и порты) для событий TCP и UDP. Переменная __proto_info доступна в тестах подтипа tcp или udp. К ее элементам можно обращаться с помощью следующего синтаксиса: __proto_info->элемент.

Встроенная переменная __proto_info состоит из следующих элементов:

Табл. 14. Элементы встроенной переменной __proto_info
Имя элемента Введите Описание
local_port unsigned short Локальный порт
remote_port unsigned short Удаленный порт
local_addr ip_addr_t Локальный адрес
remote_addr ip_addr_t Удаленный адрес

Дополнительная информация для событий TCP

В следующей таблице описываются события изменения состояния TCP:

Табл. 15. События изменения состояния TCP
Имя Введите Описание
__prev_state short Информация о предыдущем состоянии для соединения.
__cur_state short Информация о текущем состоянии для соединения.
Может совпадать с одним из следующих значений встроенной константы для состояний TCP:
  • TCPS_ESTABLISHED (соединение установлено)
  • TPCS_CLOSED (соединение закрыто)
  • TPCS_LISTEN (прием запросов на установку соединения)
  • TPCS_SYN_SENT (отправлен пакет SYN удаленному узлу)
  • TCPS_SYN_RECEIVED (принят пакет SYN от удаленного узла)
  • TCPS_CLOSE_WAIT (получен пакет FIN, ожидание закрытия)
  • TCPS_FIN_WAIT_1 (закрыто, отправлен пакет FIN)
  • TCPS_CLOSING (закрыто, выполнен обмен пакетами FIN, ожидание пакета FIN ACK)
  • TCPS_LAST_ACK (получены пакет FIN и пакет закрытия, ожидание пакета FIN ACK)
  • TCPS_FIN_WAIT_2 (закрыто, пакет FIN подтвержден)
  • TCPS_TIME_WAIT (ожидание в течение 2*msl после закрытия)

Значения определены в экспортированном заголовочном файле /usr/include/netinet/tcp_fsm.h.

Например:

Следующий сценарий Vue выводит информацию об изменении состояния для определенного соединения:

@@net:tcp:state_change
when(__proto_info->local_addr ==”10.10.10.1” and __proto_info->remote_addr == 10.10.10.2”
	and __proto_info->local_port == "8000" and __proto_info->remote_port == "9000")
{
	printf("Предыдущее состояние: %d, текущее состояние: %d\n",__prev_state,__cur_state);
}

Событие повторной передачи TCP

Табл. 16. Событие повторной передачи TCP
Имя Введите Описание
__nth_retransmit unsigned short n-я повторная передача

Примеры

1. В следующем примере обнаруживается получатель, отклоняющий соединения из-за переполнения очереди.

@@net:tcp:listen_q_full
{
	printf("IP-адрес получателя: %I и номер порта: %d\n",__proto_info->local_addr, __proto_info->local_port);
}

2. В следующем примере обнаруживается соединение, теряющее пакеты из-за переполнения буфера сокета

@@net:udp:sock_recv_buf_overflow
{
        printf("Информация о соединении, теряющем пакеты из-за переполнения буфера сокета:\n"); 
        printf("Локальный IP-адрес: %I и удаленный IP-адрес: %I\n",__proto_info->local_addr,__proto_info->remote_addr);
        printf("локальный порт: %d и удаленный порт: %d\n",__proto_info->local_port, __proto_info->remote_port);
 }

3. Обнаружение повторных передач (вторая и последующие повторные передачи пакета) для определенного соединения TCP.

@@net:tcp:retransmit
when (__proto_info->local_addr == "10.10.10.1" &&
 	__proto_info->remote_addr == "10.10.10.2" && 
__proto_info->local_port == "4000" &&
 	__proto_info->remote_port == "5000")
{
        printf(" %d th re-transmition for this connection\n", _nth_retransmit);
}

4. Получение информации о соединении при возникновении события заполнения буфера отправителя.

@@net:tcp:send_buf_full
{
        printf("Информация о соединении при возникновении события заполнения буфера:\n"); 
        printf("Локальный IP-адрес: %I и удаленный IP-адрес: %I\n",__proto_info->local_addr,__proto_info->remote_addr);
        printf("локальный порт: %d и удаленный порт: %d\n",__proto_info->local_port, __proto_info->remote_port);
 }