Информационный ответ (возвращается номер кашей сети) | |||
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;