Протоколы |
ip(7) |
ip, IP - Internet Protocol
#include <sys/socket.h> #include <netinet/in.h> s = socket(AF_INET, SOCK_RAW, proto); t = t_open ("/dev/rawip", O_RDWR);
IP - это межсетевой протокол доставки дейтаграмм (internetwork datagram delivery protocol), основной в семействе протоколов Internet. Программы могут использовать протокол IP через протоколы более высокого уровня, такие как протокол управления передачей (Transmission Control Protocol - TCP) или протокол дейтаграмм пользователя (User Datagram Protocol - UDP), или взаимодействовать по протоколу IP непосредственно. См. страницы справочного руководства tcp(7P) и udp(7P). Непосредственный доступ возможен через интерфейс сокетов, с использованием "непосредственных" ("raw") сокетов, или через интерфейс транспортного уровня (Transport Level Interface - "TLI"). Опции протокола, определенные в спецификации IP, можно устанавливать для исходящих дейтаграмм.
Драйвер STREAMS /dev/rawip - это провайдер транспорта TLI, обеспечивающий непосредственный доступ к IP.
Непосредственные IP-сокеты не поддерживают постоянное подключение (connectionless) и обычно используются с помощью вызовов sendto() и recvfrom() (см. send(3SOCKET) и recv(3SOCKET)), хотя вызов connect(3SOCKET) тоже можно использовать для фиксации места назначения будущей дейтаграммы. В этом случае можно использовать вызовы read(2) или recv(3SOCKET) и write(2) или send(3SOCKET). Если указан протокол IPPROTO_RAW или IPPROTO_IGMP, предполагается, что приложение включает при посылке полный IP-заголовок. Иначе в исходящих дейтаграммах будет установлен номер протокола, который будет использоваться для фильтрации входящих дейтаграмм, а IP-залоговок будет генерироваться и добавляться перед каждой исходящей дейтаграммой. В любом случае, IP-заголовок и опции входящих дейтаграмм не изменяются.
На уровне IP поддерживаются следующие опции сокетов:
Эти опции принимают в качестве параметра структуру struct ip_mreq. Эта структура содержит адрес для многоадресной передачи (multicast address), который необходимо задавать как адрес класса D для многоадресной передачи IP, и адрес сетевого инерфейса. Обычно в качестве адреса сетевого интерфейса задается значение INADDR_ANY, что позволяет ядру выбрать интерфейс для вхождения в группу.
Опции многоадресного сокета могут задаваться для дейтаграмм любого типа сокетов в семействе Internet.
На уровне сокета можно задавать опцию сокета SO_DONTROUTE. Эта опция приводит к тому, что посылаемые дейтаграммы не маршрутизируются и не перенаправляются, поскольку устанавливает полю время жизни IP (Time To Live) значение 1, - такой пакет не будет перенаправляться маршрутизаторами.
Непосредственные дейтаграммы IP можно также посылать и принимать с помощью базовых функций TLI, не поддерживающих соединение (connectionless primitives).
Дейтаграммы проходят через уровень IP в двух направлениях: вверх из сети до пользовательских процессов и вниз от пользовательских процессов в сеть. С учетом этой ориентации, протокол IP располагается над драйверами сетевых интерфейсов и под транспортными протоколами UDP и TCP. Протокол управляющих сообщений Internet (Internet Control Message Protocol - ICMP) логически является частью протокола IP. См. icmp(7P).
Протокол IP включает контрольную сумму для заголовка, но не данных в дейтаграмме. Значение контрольной суммы вычисляется и устанавливается в процессе посылки дейтаграмм, а проверяется - при их получении.
Опции IP в полученных дейтаграммах обрабатываются на уровне IP в соответствии со спецификацией протокола. В настоящее время распознаются следующие опции IP: защита (security), ненадежный источник и внутрення маршрутизация (loose source and record route - LSRR), надежный источник и внутрення маршрутизация (strict source and record route - SSRR), внутренняя маршрутизация (record route) и временная отметка (internet timestamp).
Уровень IP обычно действует как маршрутизатор (помимо прочего, перенаправляющий дейтаграммы, не адресованные ему), если машина имеет два или более работающих интерфейса. Это поведение можно изменить с помощью утилиты ndd(1M), устанавливая значение переменной /dev/ip, ip_forwarding. 0 означает не перенаправлять; 1 - перенаправлять. Сценарии инициализации (см. /etc/init.d/inetinit) устанавливают это значение при загрузке в зависимости от количества работающих ("up") интерфейсов, но они не будут включать перенаправление IP вообще, если существует файл /etc/notrouter. При загрузке модуля IP переменная ip_forwarding имеет значение 0 и оно не изменяется, если:
Кроме того, на уровне IP можно управлять маршрутизацией более детально. Каждый интерфейс будет создавать переменную <имя_интерфейса>:ip_forwarding /dev/ip, которую можно изменять с помощью ndd(1M). Если специфическая переменная :ip_forwarding интерфейса получила значение 0, пакеты с этого интерфейса на другие и с других интеррфейсов на него перенаправляться не будут.
При установке значения переменной ip_forwarding все специфические переменные :ip_forwarding интерфейсов получают значение, соответствующее ip_forwarding.
Уровень IP будет посылать сообщение ICMP обратно на исходный хост во многих случаях, если получает дейтаграмму, которую нельзя обработать. Сообщение ICMP "time exceeded" (устарела) будет посылаться, если поле "time to live" (время жизни) в заголовке уменьшилось до нуля в процессе перенаправления дейтаграммы. Сообщение "destination unreachable" (пункт назначения недостижим) будет посылаться, если дейтаграмма не может быть перенаправлена, поскольку нет маршрута к конечному пункту назначения, или ее нельзя фрагментировать. Если дейтаграмма адресована локальному хосту, но предназначена неподдерживаемому протоколу или неиспользуемому порту, сообщение о недостижимости пункта назначения тоже посылается. Уровень IP может посылать сообщение ICMP "source quench", если он слишком быстро получает дейтаграммы. Сообщения ICMP посылаются только для первого фрагмента фрагментированной дейтаграммы и никогда не возвращаются в ответ на ошибки в других сообщениях ICMP.
Уровень IP поддерживает фрагментацию и обратную сборку фрагментов. Дейтаграммы фрагментируются при выдаче, если их размер превышает размер максимальной единицы передачи (maximum transmission unit - MTU) сетевого интерфейса. Фрагменты полученных дейтаграмм удаляются из очередей на сборку, если полную дейтаграмму не удается восстановить за короткий промежуток времени.
Ошибки при посылке, выявленные на уровне драйвера сетевого интерфейса, возвращаются уровнем IP пользовательскому процессу.
Операция с сокетом может закончиться неудачно с возвратом следующих сообщений об ошибках:
Непосредственные (raw) сокеты, в принципе, должны поддерживать получение ошибок ICMP, относящихся к протоколу; в настоящее время такие пакеты просто отбрасываются.
Пользователи протоколов более высокого уровня, таких как TCP и UDP, должны иметь возможность просматривать полученные опции IP.
Последнее изменение: 10 ноября 1999 года
Copyleft (no c) - Fuck copyright!, 2003 В. Кравчук, OpenXS Initiative, перевод на русский язык
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |