Проект OpenNet MAN raw (7) Макропакети та угоди (FreeBSD та Linux)

Рівень IPv4 генерує заголовок IP при посилці пакета, якщо сокету не задана опціяIP_HDRINCL. Якщо вона задана, пакет повинен містити заголовок IP. Пакети, що приймаються, завжди містять заголовок IP.

Відкривати raw-сокети можуть лише процеси з ідентифікатором ефективного користувача, що дорівнює нулю, або мають можливістьCAP_NET_RAW.

Усі пакети або помилки, що збігаються з номером протоколуprotocol, вказаним raw-сокетом, передаються цьому сокету. Список можливих протоколів та призначених ним номерів зазначений у RFC1700 таgetprotobyname(3).

ПротоколIPPROTO_RAWмає на увазі дозволенийIP_HDRINCLі приймає всі протоколи IP. Передача протоколів у разі не дозволена.

У Linux 2.2 всі поля заголовка IP та опції можуть бути задані за допомогою опцій сокету IP. Це означає, що raw-сокети, зазвичай, необхідні лише нових протоколів чи протоколів без інтерфейсу користувача (таких, як ICMP).

Прийнятий пакет передається всім підключеним до цього протоколу сокетам до того, як він буде переданий іншим обробникам протоколу (наприклад, протокольним модулям ядра).

ФОРМАТИ АДРЕС

ОПЦІЇ СОКЕТІВ

Крім того, підтримуються всі датаграмні опції сокетівSOL_IPip(7).

СокетIPPROTO_RAWпризначений лише передачі (посилання) пакетів. Якщо Ви хочете отримувати всі пакети IP, використовуйте пакетний сокет (packet(7)) з протоколомETH_P_IP. Зверніть увагу, що пакетні сокети, на відміну від raw-сокетів, не збирають фрагменти IP.

Якщо Ви хочете отримувати всі пакети ICMP для датаграмного сокету, краще використовуватиIP_RECVERR; див.ip(7).

Raw-сокети можуть "перехоплювати" в Linux всі протоколи,навіть мають протокольний модуль у ядрі (такі, як ICMP чи TCP). У цьому випадку пакети передаються як модулю ядра, так і raw-сокету(-ам). Це не повинно бути відображено в програмах, що переносяться, оскільки багато інших реалізації BSD-сокетів мають певні обмеження.

Linux ніколи не змінює заголовки, отримані від користувача (за винятком заповнення деяких обнулених полів, як описано у випадкуIP_HDRINCL). Така поведінка відрізняється від поведінки багатьох інших реалізацій raw-сокетів.

RAW-сокети, в загальному випадку, не переносяться, тому слід уникати їх використання в програмах, що переносяться.

Передача через raw-сокет має здійснюватися за допомогою протоколу IP зsin_port;ця можливість зникла в Linux 2.2. Уникнути цього можна за допомогоюIP_HDRINCL.

ОБРОБКА ПОМИЛОК

ЗНАЙДЕНІ ПОМИЛКИ

Коди raw-сокетів у версії Linux 2.0 при встановленому прапорі SO_BSDCOMPAT були спеціально зроблені "сумісними" з BSD за помилками. З Linux 2.2 було видалено.

ЗНАЙДЕНІ ПОМИЛКИ

Якщо встановленоIP_HDRINCL, датаграми не будуть фрагментовані і їх розмір буде обмежений MTU інтерфейсом. Це обмеження Linux 2.2.

У Linux 2.2 відсутнє налаштування протоколу IP для відправки його вsin_port, і завжди використовується той протокол, до якого був підключений сокет або згаданий при першому викликуsocket(2).