Arial Century Courier Georgia Tahoma Verdana Times New Roman
-
+
5 Ошибочный маршрут источника 4 Source Quench Message Обрыв источника 0 Код всегда равен 0 5 Redirect Message Переадресация 0 Переадресация пакетов для сети 1 Переадресация пакетов для узла 2 Переадресация
пакетов для сети и типа обслуживания (TOS, Type Of Service) 3 Переадресация пакетов для узла и типа обслуживания (TOS, Type Of Service) 8 Echo Message Эхо-запрос 0 Код всегда равен 0 11 Time Exceeded Message Превышен лимит времени 0 При передаче превышено «время жизни» (TTL, Time То Live) 1 Превышено время реассемблирования (сборки) фрагментов 12 Parameter Problem Message Ошибочный параметр 0 Указатель на ошибочный параметр (табл. 27.7) 13 Time stamp Message Запрос временной метки 0 Код всегда равен 0 14 Timestamp Reply Message Ответ о временной метке 0 Код всегда равен 0 15 Information Request Информационный запрос (запрашивается номер нашей сети) 0 Код всегда равен 0 16 Information Reply Message Информационный ответ (возвращается номер кашей сети) 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;
unsigned int csum; /* Контрольная сумма */
unsigned char __unused, /* He используется */
cloned, /* Заголовок должен клонироваться */
pkt_type, /* Класс пакета */
ip_summed; /* контрольная сумма IP */
__u32 priority; /* Приоритет пакета */