Суров проект на OpenNet MAN (7) Макро пакети и конвенции (FreeBSD и Linux)

IPv4 слоят генерира IP заглавка при изпращане на пакет, освен ако не е дадена опцията за сокет IP_HDRINCL. Ако е посочено, пакетът трябва да съдържа IP заглавка. Получените пакети винаги съдържат IP заглавка.

Могат само процеси с ефективен потребителски идентификатор нула или възможност за отваряне на необработени сокети CAP_NET_RAW.

Всички пакети или грешки, съответстващи на номера на протокола протокол, към посочения суров сокет се предават на този сокет. Списъкът на възможните протоколи и зададените им номера е посочен в RFC1700 и в getprotobyname(3).

Протокол IPPROTO_RAW предполага разрешено IP_HDRINCL и приема всички IP протоколи. В този случай прехвърлянето на протоколи не е разрешено.

В Linux 2.2 всички полета и опции за IP заглавия могат да бъдат посочени с помощта на опциите за IP сокет. Това означава, че необработените сокети обикновено са необходими само за по-нови или без протоколи от потребителски интерфейс (като ICMP).

Полученият пакет се изпраща до всички сокети, обвързани с този протокол, преди да бъде предаден на други манипулатори на протокол (например модули на протокола на ядрото).

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

ВАРИАНТИ НА МОЩЕСТИТЕ

Освен това се поддържат всички опции за сокет на дейтаграми SOL_IP ip(7).

Гнездо IPPROTO_RAW е предназначен само за предаване (изпращане) на пакети. Ако искате да получите всички IP пакети, използвайте пакет за пакети ( пакет(7)) с протокол ETH_P_IP. Обърнете внимание, че пакетните сокети не събират IP фрагменти, за разлика от суровите сокети.

Ако искате да получавате всички ICMP пакети за сокет за дейтаграми, най-добре е да използвате IP_RECVERR; см. ip(7).

Необработените сокети могат да „прихващат“ всички протоколи в Linux, дори тези с протоколен модул в ядрото (като ICMP или TCP). В този случай пакетите се предават както на модула на ядрото, така и на суровия сокет (и). Това не трябва да се отразява в преносимите програми, тъй като много други реализации на BSD сокет имат определени ограничения.

Linux никога не променя заглавките, получени от потребителя (с изключение на попълването на някои полета, които могат да бъдат занулени, както е описано в случая на IP_HDRINCL). Това поведение се различава от много други внедрения на суров сокет.

RAW сокетите обикновено не са преносими, така че трябва да избягвате използването им в преносими програми.

Предаването на необработена сокет трябва да се извърши чрез IP от sin_port; тази функция изчезна в Linux 2.2. Можете да избегнете това, като използвате IP_HDRINCL.

ОБРАБОТКА НА ГРЕШКИ

НАМЕРЕНИ ГРЕШКИ

Необработените кодове на сокети в Linux 2.0 с набор от флагове SO_BSDCOMPAT са специално направени "BSD съвместими" от съществуващи грешки. Това е премахнато от Linux 2.2.

НАМЕРЕНИ ГРЕШКИ

Ако е инсталирана опция IP_HDRINCL, дейтаграмите няма да бъдат фрагментирани и размерът им ще бъде ограничен от интерфейса MTU. Това е ограничение за Linux 2.2.

Linux 2.2 няма IP конфигурация, на която да я изпрати sin_port, и протоколът винаги се използва, към който е свързан сокетът или който е споменат по време на първото обаждане гнездо(2).