29.4. Linux: SOCK_PACKET и PF_PACKET

29.4. Linux: SOCK_PACKET и PF_PACKET

Существует два метода получения пакетов канального уровня в Linux. Первоначальный метод получил более широкое распространение, но является менее гибким. Он состоит в создании сокета типа SOCK_PACKET. Новый метод, предоставляющий больше возможностей для настройки фильтров и оптимизации производительности, состоит в создании сокета семейства PF_PACKET. В любом случае мы должны обладать правами привилегированного пользователя (аналогичные необходимым для создания символьного сокета), а третий аргумент функции socket должен быть ненулевым значением, задающим тип кадра Ethernet. При использовании сокетов PF_PACKET второй аргумент socket может быть константой SOCK_DGRAM (для получения обработанных пакетов без заголовка канального уровня) или SOCK_RAW (для получения пакетов целиком). Сокеты SOCK_PACKET передают пакеты только целиком. Например, для получения всех кадров канального уровня мы пишем:

fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); /* в новых системах */

или

fd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL)); /* в старых системах */

В результате этого будут возвращены кадры для всех протоколов, получаемые канальным уровнем. Если нам нужны кадры IPv4, то вызов будет таким:

fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)); /* в новых системах */

fd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_IP)); /* в старых системах */

Другие константы, которые могут использоваться в качестве последнего аргумента, — это, например, ETH_P_ARP и ETH_P_IPV6.

Указывая протокол ETH_P_ххх, мы тем самым сообщаем канальному уровню, какой тип из получаемых канальным уровнем кадров передавать сокету. Если канальный уровень поддерживает смешанный режим (например, Ehternet), то устройство тоже должно работать в смешанном режиме. Это осуществляется при помощи параметра сокета PACKET_ADD_MEMBERSHIP с использованием структуры packet_mreq. При этом необходимо указать конкретный интерфейс и задать тип действия PACKET_MR_PROMISC. В старых системах для этого нужно вызвать функцию ioctl с запросом SIOCGIFFLAGS для получения флагов, установить флаг IFF_PROMISC и далее сохранить флаги с помощью SIOCSIFFLAGS. К сожалению, при использовании этого метода программы, работающие в смешанном режиме, могут мешать друг другу, а если в одной из них содержатся ошибки, то она может и не отключить смешанный режим по завершении.

Сравнивая это средство Linux с BPF и DLPI, мы можем отметить некоторые различия.

1. В Linux не обеспечивается буферизация. Фильтрация на уровне ядра доступна только в новых системах (при помощи параметра SO_ATTACH_FILTER). Существует обычный буфер приема сокета, но отсутствует возможность буферизации и отправки приложению нескольких кадров с помощью одной операции считывания. Это увеличивает накладные расходы, связанные с копированием потенциально возможных больших объемов данных из ядра в приложение.

2. В Linux не предусмотрена фильтрация на уровне устройства. Сокеты PF_PACKET могут быть связаны с устройством функцией bind. Если в вызове функции socket указан аргумент ETH_P_IP, то все пакеты IPv4 со всех устройств (например, Ethernet, каналы PPP, каналы SLIP и закольцовка) будут переданы на сокет. Функция recvfrom возвращает общую структуру адреса сокета, а элемент sa_data содержит имя устройства (например, eth0). Тогда приложение само должно игнорировать данные с тех устройств, которые не представляют для него интереса. Здесь мы сталкиваемся фактически с той же проблемой: возможно, что приложение будет получать слишком много данных, особенно в случае наблюдения за высокоскоростной сетью.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Util-linux

Из книги Linux From Scratch автора Бикманс Герард

Util-linux Официальная ссылкаUtil-linux (2.11u): ftp://ftp.win.tue.nl/pub/linux-local/utils/util-linux/Содержание Util-linuxПоследняя проверка: версия 2.11t.Программыagetty, arch, blockdev, cal, cfdisk, chkdupexe, col, colcrt, colrm, column, ctrlaltdel, cytune, ddate, dmesg, elvtune, fdformat, fdisk, fsck.cramfs, fsck.minix, getopt, hexdump, hwclock, ipcrm, ipcs, isosize, line, logger, look, losetup, mcookie, mkfs, mkfs.bfs,


64-битный Linux

Из книги Журнал «Компьютерра» №41 от 08 ноября 2005 года автора Журнал «Компьютерра»

64-битный Linux Операционные системы семейства *nix и особенно их разновидности с открытым исходным кодом никогда не испытывали затруднений с портированием на самые разные архитектуры. Unix вообще задумывалась как портируемая операционная система[Недаром же стандарт на


7.2.2. Загрузка Linux

Из книги Fedora 8 Руководство пользователя автора Колисниченко Денис Николаевич

7.2.2. Загрузка Linux 7.2.2.1. Корневая файловая система и система инициализации Итак, вы выбрали загрузку Linux. Загрузчик GRUB загрузит ядро, а затем передаст ему параметры и управление. Подробновесь процесс загрузки ядра рассматриваться здесь не будет. Вам достаточно знать


Linux

Из книги Собираем компьютер своими руками автора Ватаманюк Александр Иванович

Linux Созданная в 1992 году программистом-любителем Линусом Торвальдсом, эта операционная система отличается от всех существующих.Во-первых, Linux имеет открытый программный код, то есть распространяется бесплатно. Любой пользователь, знакомый с программированием, может


1 Введение в Linux

Из книги Linux-сервер своими руками автора Колисниченко Денис Николаевич

1 Введение в Linux 1.1. Вступительное слово Цель данной книги состоит в том, чтобы развеять миф о «неподъемности» UNIX или Linux-систем, заложить прочный фундамент для построения вашего Интернет-сервера. Излагая материал, я старался объяснять все как можно более понятным языком.


1.2. О Linux

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

1.2. О Linux История операционной системы Linux началась, естественно, с создания операционной системы Unix. В конце 60-х годов завершился проект Multics, над которым работали сотрудники компаний General Electrics, AT&T Bell Laboratories и Массачусетского института. Результатом этого проекта стала


3.2.8. Linux

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

3.2.8. Linux Операционная система Linux, созданная Линусом Торвальдсом в 1991 году, лидирует среди Unix-систем новой школы с открытым исходным кодом, появившихся в 1990 году (в их число также входит FreeBSD, NetBSD, OpenBSD и Darwin), и представляет направление конструирования, принятое данной


3.2.8. Linux

Из книги В начале была командная строка автора Стивенсон Нил

3.2.8. Linux Операционная система Linux, созданная Линусом Торвальдсом в 1991 году, лидирует среди Unix-систем новой школы с открытым исходным кодом, появившихся в 1990 году (в их число также входит FreeBSD, NetBSD, OpenBSD и Darwin), и представляет направление конструирования, принятое данной


LINUX

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

LINUX В конце 1980-х и начале 1990-х я затратил много времени, программируя «Макинтоши», и в конечном счете решил выделить несколько сотен баксов на «яблочный» продукт, названный «Мастерская Программиста Макинтошей», или MPW (сокр. от «Macintosh Programmers Workshop» — прим. перев.). У MPW были


9.1. Как загружается Linux

Из книги Linux программирование в примерах автора Роббинс Арнольд

9.1. Как загружается Linux


10.4.2. BSD и GNU/Linux

Из книги Linux глазами хакера автора Флёнов Михаил Евгеньевич


1.5.1. Red Hat Linux

Из книги Флибуста. Обратная сторона [Инструкции по установке и запуску i2p, TOR и VPN для «чайников». v. 1.1] автора Коллектив авторов

1.5.1. Red Hat Linux Данный дистрибутив считается классическим и является законодателем моды в развитии ОС, потому что именно в этой фирме работает основатель Linux — Линус Торвальдс. Для получения этого дистрибутива вы можете купить коробочный вариант или скачать версию


1.5.3. SuSE Linux

Из книги Вопросы истории: UNIX, Linux, BSD и другие автора Федорчук Алексей Викторович

1.5.3. SuSE Linux Мне приходилось работать с разными программами от немецких производителей, но их юзабилити не просто хромало, такие программы — это безногие калеки с детства. Но разработка от SuSE (www.suse.de) опровергает мое мнение. Этот дистрибутив отличается симпатичным


Для пользователей Linux Инструкция для пользователей Linux (от Incanter)

Из книги автора

Для пользователей Linux Инструкция для пользователей Linux (от Incanter) 1. Проверяем наличие java, если она отсутствует, устанавливаем: Рис. 902. Чтобы сборка i2p под Linux всегда была чистой и свежей, идем на http://code.google.com/p/i2p и стягиваем оттуда jar-архив Рис. 913. Запускаем консоль,


Магия Linux

Из книги автора

Магия Linux Итак, на протяжении 1994-1997 годов дистрибутивы Linux обрастали «дружественными к пользователю» инсталляторами, средствами сквозного конфигурирования и пакетного менеджмента, включали в себя пользовательские, в том числе офисные, приложения. Предпринимались и


IPLabs Linux Team: начало русского Linux’а

Из книги автора

IPLabs Linux Team: начало русского Linux’а Следующая веха на пути русского Linux’а – 1998 год, когда фирма IPLabs (точнее, ее подразделение – IPLabs Linux Team) совместно с Институтом логики (на самом деле это были одни и те же люди – Алексей Новодворский, Алексей Смирнов и Юрий Девяткин с