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

на главную

Жанры

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.

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

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь

Семья. Измена. Развод

Высоцкая Мария Николаевна
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Семья. Измена. Развод

Я – Орк. Том 6

Лисицин Евгений
6. Я — Орк
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я – Орк. Том 6

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

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

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Ты всё ещё моя

Тодорова Елена
4. Под запретом
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Ты всё ещё моя

Убивать чтобы жить 4

Бор Жорж
4. УЧЖ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 4

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Я – Стрела. Трилогия

Суббота Светлана
Я - Стрела
Любовные романы:
любовно-фантастические романы
эро литература
6.82
рейтинг книги
Я – Стрела. Трилогия

Неприятель на одну ночь

Орхидея Страстная
2. Брачная летопись Орхиса
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Неприятель на одну ночь

Свет во мраке

Михайлов Дем Алексеевич
8. Изгой
Фантастика:
фэнтези
7.30
рейтинг книги
Свет во мраке

Афганский рубеж

Дорин Михаил
1. Рубеж
Фантастика:
попаданцы
альтернативная история
7.50
рейтинг книги
Афганский рубеж

Цеховик. Книга 2. Движение к цели

Ромов Дмитрий
2. Цеховик
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Цеховик. Книга 2. Движение к цели

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

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