Чтение онлайн

на главную - закладки

Жанры

Linux: Полное руководство

Аллен Питер В.

Шрифт:

 unsigned char *end; /* Конечный указатель */

 void (*destructor)(struct sk_buff*);

#ifdef CONFIG_NETFILTER

 unsigned long nfmark;

 /* Cache info */

 __u32 nfcache;

 /* Ассоциированное соединение */

 struct nf_ct_info *nfct;

#ifdef CONFIG_NETFILTER_DEBUG

 unsigned int nf_debug;

#endif

#endif /* CONFIG_NETFILTER*/

#if defined(CONFIG_HIPPI)

 union {

__u32 ifield;

 } private;

#endif

#ifdef CONFIG_WET_SCHED

 __u32 tc_index; /*
Индекс контроля трафика */

#endif

};

Данная структура описана в файле

/usr/src/linux/include/linux/skbuff.h
. После формирования структуры
sk_buff
она передается драйвером функции netif_rx.

int netif_rx(struct sk_buff *skb);

Функция netif_rx описана в файле

/usr/src/linux/net/core/dev.c
. Она получает пакет от драйвера сетевого устройства и ставит его в очередь (очередь называется backlog) протокола высшего уровня. Функция возвращает следующие значения:

♦ NET_RX_SUCCESS — пакет удачно поставлен в очередь;

♦ NET_RX_CN_LOW — имеется небольшая «пробка» при постановке пакета в очередь, но скоро она «рассосется»;

♦ NET_RX_CN_MOD — «пробка» чуть больше — средней «длины»;

♦ NET_RX_CN_HIGH — очень большая «пробка»;

♦ NET_RX_DROP — пакет был удален.

Если в очереди backlog находятся более 300 пакетов, новый пакет будет удален без какого-либо предупреждения.

Драйвер сетевого устройства при формировании структуры

sk_buff
устанавливает ее поле
protocol
. Функция netif_rx, как уже было сказано, передает пакет «наверх», затем функция net_bh использует значение поля
protocol
, установленное драйвером, для вызова соответствующей протоколу программы и передает этой программе пакет. Для протокола ICMP такой программой является функция icmp_rcv, описанная в файле
/usr/src/linux/net/ipv4/icmp.с
.

int icmp_rcv(struct sk_buff *skb);

Функция 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) Данная функция
определяет максимальный размер модуля передачи (MTU, Maximum Transmission Unit), а также передает информацию об ошибке любому модулю, которому нужна эта информация
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-сообщений используется функция

void icmp_send(struct sk_buff *skb_in, int type, int code,

 u32 info);

Данная функция отправляет сообщения типа type, с кодом code и телом info.

После отправки пакета неплохо бы проверить, будет ли он реально отправлен. Это можно сделать с помощью функции

int xrlim_allow(struct dst_entry *dst, int timeout);

Эта функция определяет, отправлять или нет текущий пакет из очереди. Если пакет должен быть удален, функция возвращает 0, иначе — 1.

После отправки ICMP-пакета нужно увеличить счетчик отправленных пакетов. Это можно сделать с помощью функции icmp_out_count:

void icmp_out_count(int type);

Данная функция увеличивает счетчик оправленных пакетов типа type.

На этом обзор протокола ICMP в Linux заканчивается и мы переходим к рассмотрению механизма гнезда (сокета), с помощью которого можно реализовать двунаправленный обмен данными между двумя компьютерами.

27.3. Программирование сокетов

27.3.1. Что такое сокет?

Сокет — это двунаправленный канал между двумя компьютерами в сети, который обеспечивает конечную точку соединения. «Двунаправленный» означает, что данный могут передаваться в двух направлениях — от клиента к серверу и наоборот. Понятие сокета — абстрактное, это как бы программный соединитель, через который обмениваются данными программа-сервер и программа-клиент.

Сокет-интерфейс используется для получения доступа к транспортному уровню протокола TCP/IP и представляет собой набор системных вызовов операционной системы и библиотечных функций на языке С. Все эти функции можно условно разделить на три группы:

♦ управляющие функции;

♦ функции установления связи;

♦ функции сетевого ввода/вывода.

Общий алгоритм работы сетевой программы, использующей сокеты:

1. Подготовить (создать) сокет — функция socket.

Поделиться:
Популярные книги

Инцел на службе демоницы 1 и 2: Секса будет много

Блум М.
Инцел на службе демоницы
Фантастика:
фэнтези
5.25
рейтинг книги
Инцел на службе демоницы 1 и 2: Секса будет много

Весь цикл «Десантник на престоле». Шесть книг

Ланцов Михаил Алексеевич
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг

Предатель. Цена ошибки

Кучер Ая
Измена
Любовные романы:
современные любовные романы
5.75
рейтинг книги
Предатель. Цена ошибки

Жандарм 2

Семин Никита
2. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Жандарм 2

Прогрессор поневоле

Распопов Дмитрий Викторович
2. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прогрессор поневоле

Всемирная энциклопедия афоризмов. Собрание мудрости всех народов и времен

Агеева Елена А.
Документальная литература:
публицистика
5.40
рейтинг книги
Всемирная энциклопедия афоризмов. Собрание мудрости всех народов и времен

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

Очешуеть! Я - жена дракона?!

Амеличева Елена
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Очешуеть! Я - жена дракона?!

Отмороженный 4.0

Гарцевич Евгений Александрович
4. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Отмороженный 4.0

Треугольная шляпа. Пепита Хименес. Донья Перфекта. Кровь и песок.

Бласко Висенте Ибаньес
65. Библиотека всемирной литературы
Проза:
классическая проза
5.00
рейтинг книги
Треугольная шляпа.
Пепита Хименес.
Донья Перфекта.
Кровь и песок.

Измена. Жизнь заново

Верди Алиса
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Жизнь заново

Три `Д` для миллиардера. Свадебный салон

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
7.14
рейтинг книги
Три `Д` для миллиардера. Свадебный салон

Бастард Императора. Том 5

Орлов Андрей Юрьевич
5. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 5

Идеальный мир для Лекаря 21

Сапфир Олег
21. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 21