Linux: Полное руководство
Шрифт:
Данная структура описана в файле
Функция netif_rx описана в файле
♦ NET_RX_SUCCESS — пакет удачно поставлен в очередь;
♦ NET_RX_CN_LOW — имеется небольшая «пробка» при постановке пакета в очередь, но скоро она «рассосется»;
♦ NET_RX_CN_MOD — «пробка» чуть больше — средней «длины»;
♦ NET_RX_CN_HIGH — очень большая «пробка»;
♦ NET_RX_DROP — пакет был удален.
Если в очереди backlog находятся более 300 пакетов, новый пакет будет удален без какого-либо предупреждения.
Драйвер сетевого устройства при формировании структуры
Функция icmp_rcv выполняет следующие действия:
1. Увеличивает значение счетчика входящих пакетов ICMP_INC_STATS_BH(IcmpInMsgs).
2. Удаляет пакет, если его размер слишком мал.
3. Проверяет контрольную сумму: если она ошибочна, увеличивает счетчик некорректных пакетов.
4. Проверяет тип ICMP-пакета. Если тип пакета превышает максимальное значение 18, то пакет удаляется. При этом увеличивается счетчик некорректных пакетов.
5. Вызывает функцию-обработчик ICMP-сообщения в зависимости от значения типа сообщения.
Соответствие номеров типа служебным функциям (описаны в файле icmp.c) Таблица 27.9
Тип | Функция | Описание |
---|---|---|
0, 1, 2, 6, 7, 9, 10, 12, 14-16, 18 | void icmp_discard(struct sk_buff *skb) | Удаляет пакет |
3, 4, 11 | void icmp_unreach(struct sk_buff *skb) | Данная функция
|
5 | void icmp_redirect(struct sk_buff *skb) | Пакет переадресации, который означает примерно следующее: «Не посылайте мне пакет по адресу xxx.xxx.ххх.xxx, потому что он будет отправлен обратно» |
8 | void icmp_echo(struct sk_buff *skb) | Функция для отправки эхо-запроса. Эхо-ответ (тип 0) отправляется ядром автоматически (если вы не отключили эту возможность) |
13 | void icmp_timestamp(struct sk_buff *skb) | Запрос о времени создания пакета — один из самых эффективных методов измерения производительности глобальных сетей в реальном времени. Метод заключается в следующем: на тестируемый узел посылаются небольшие пакеты, которые сразу же удаляются. Информация из последнего пакета копируется в пакет эхо-ответа, в этот пакет также вставляется информация о текущем времени. После этого пакет ставится в очередь как обычно |
17 | void icmp_address (struct sk_buff *skb) | Отправка ответа на запрос о маске адреса |
Рассмотренные выше функции обрабатывают входящие ICMP-пакеты, Но мы ведь можем не только принимать ICMP-пакеты, но и передавать, поэтому есть также и «исходящие» функции.
Для отправки ICMP-сообщений используется функция
Данная функция отправляет сообщения типа type, с кодом code и телом info.
После отправки пакета неплохо бы проверить, будет ли он реально отправлен. Это можно сделать с помощью функции
Эта функция определяет, отправлять или нет текущий пакет из очереди. Если пакет должен быть удален, функция возвращает 0, иначе — 1.
После отправки ICMP-пакета нужно увеличить счетчик отправленных пакетов. Это можно сделать с помощью функции icmp_out_count:
Данная функция увеличивает счетчик оправленных пакетов типа type.
На этом обзор протокола ICMP в Linux заканчивается и мы переходим к рассмотрению механизма гнезда (сокета), с помощью которого можно реализовать двунаправленный обмен данными между двумя компьютерами.
27.3. Программирование сокетов
27.3.1. Что такое сокет?
Сокет — это двунаправленный канал между двумя компьютерами в сети, который обеспечивает конечную точку соединения. «Двунаправленный» означает, что данный могут передаваться в двух направлениях — от клиента к серверу и наоборот. Понятие сокета — абстрактное, это как бы программный соединитель, через который обмениваются данными программа-сервер и программа-клиент.
Сокет-интерфейс используется для получения доступа к транспортному уровню протокола TCP/IP и представляет собой набор системных вызовов операционной системы и библиотечных функций на языке С. Все эти функции можно условно разделить на три группы:
♦ управляющие функции;
♦ функции установления связи;
♦ функции сетевого ввода/вывода.
Общий алгоритм работы сетевой программы, использующей сокеты:
1. Подготовить (создать) сокет — функция socket.