Информационный ответ (возвращается номер кашей сети)
0 Код всегда равен 0
17 (*) Information Request Информационный запрос (запрашивается маска адреса)
0 Код всегда равен 0
18 (*) Information Reply Message Информационный ответ (возвращается маска адреса)
0 Код всегда равен 0

27.2.4. Функции для работы с протоколом ICMP

Для работы с протоколом ICMP существует 12 основных функций. Все эти функции описаны в файле /usr/src/linux/net/ipv4/icmp.c. У вас нет этого файла? Тогда установите исходники ядра (странно, почему вы до сих пор этого не сделали).

♦ icmp_address() — отправка ответа на запрос о маске адреса;

♦ icmp_discard() — удаляет ICMP-пакет;

♦ icmp_echo() — эхо-запрос;

♦ icmp_init() — инициализирует служебные подпрограммы протокола ICMP в операционной системе;

♦ icmp_out_count() — увеличивает счетчик отправленных пакетов;

♦ icmp_rcv() — прием ICMP-пакета;

♦ icmp_redirect() — отправка сообщения переадресации;

♦ icmp_send() — отправка ICMP-сообщения;

♦ icmp_timestamp() — ответ на запрос о времени создания;

♦ icmp_unreach() — отправляет сообщение об ошибке;

♦ xrlim_allow() — решает, отправлять ли ICMP-пакет или нет;

♦ xrlim_init() — ограничение скорости передачи ICMP-пакетов (в версии ядра 2.0).

27.2.4.1. Технические подробности

Прежде чем перейти к рассмотрению функций ICMP, разберемся, как же ICMP-пакеты принимаются операционной системой. Собственно, ICMP-пакет принимается операционной системой Linux так же, как и любой другой пакет. Драйвер сетевой платы (или другого сетевого устройства) собирает полный пакет данных, затем он строит структуру sk_buff.

Листинг 27.1. Структура sk_buff

struct sk_buff {

 /* Эти два члена должны быть первыми */

 struct sk_buff* next; /* Следующий буфер в списке*/

 struct sk_buff* prev;/* Предыдущий буфер в списке*/

 struct sk_buff_head * list; /* 'Голова' списка */

 struct sock *sk; /* Сокет */

 struct timeval stamp; /* Время прибытия пакета */

 struct net_device *dev; /* Сетевое устройство */

 /* Заголовок транспортного уровня */

 union {

  struct tcphdr *th;

  struct udphdr *uh;

  struct icmphdr *icmph;

  struct igmphdr* igmph;

  struct iphdr *ipiph;

  struct spxhdr *spxh;

  unsigned char *raw;

 } h;

 /* Заголовок сетевого уровня */

 union {

  struct iphdr *iph;

  struct ipv6hdr* ipv6h;

  struct arphdr *arph;

  struct ipxhdr *ipxh;

  unsigned char *raw;

 } nh;

 union {

  struct ethhdr *ethernet;

  unsigned char *raw;

 } mac;

 struct dst_entry *dst;

 char cb[48];

 unsigned int len; /* Длина данных */

 unsigned int data_len;

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату