Опубликован: 15.06.2004 | Доступ: свободный | Студентов: 2557 / 712 | Оценка: 4.35 / 3.96 | Длительность: 27:47:00
ISBN: 978-5-9556-0011-6
Лекция 11:

Сетевые средства

Аннотация: Представлены основные понятия и объекты, ассоциированные с сетевыми средствами. Описываются функции для опроса данных о сети и для работы с сокетами. Приводятся многочисленные примеры использования сетевых средств.
Ключевые слова: POSIX, сеть, сетевая инфраструктура, сетевой адрес, оконечная точка, сетевая база, доступ, ПО, связывание, освобождение, интерфейс, loopback, база данных маршрутизации, маршрутизация, последовательность октетов , октет, элемент данных, адрес, номер порта, бит, сетевой порядок байт, порядок байт, объект, хостовый порядок байт, сокет, адрес сокета, адресное семейство, Unix, межпроцессное взаимодействие, протокол, ARPA, тип сокета, режим с установлением соединения, передача данных, датаграмма, режим без установления соединения, файловый дескриптор, локальный адрес, прием соединения, функция, слушающий сокет, очередь, прием данных, отправка данных, соединение с базой, значение, программа, база данных о хостах как узлах сети, узел сети, аргумент, сервис, имя хоста, Internet, хост, запрос, поле, выходной аргумент, указатель, список, создание сокета, память, входной, имя узла, преобразование типов, обратное преобразование, пара функций, буфер, DST, представление, сообщение, база данных сетей, поиск, база данных сетевых протоколов, база данных сетевых сервисов, базы данных, установление соединения, пара соединенных безымянных сокетов, массив, поддержка, длина, опрос локального адреса сокета, имя сокета, очередь соединений, конфигурационные константы, поток, асинхронное установление соединения, дескриптор, мультиплексирование ввода/вывода, константы, время ожидания, маска сигналов, опция сокета, значение опции, статус ошибок, ложь, информация, байт, длительность ожидания, исключение, протокольный уровень опции, TCP, исходный адрес, экстренные данные, вспомогательные данные, граница записи, управляющие, спецификатор, завершение операций, стандартный вывод, запись, конец файла, цикла, приложение, spooler, порт, локальный хост, серверный процесс, сервер, потенциал, стандартный ввод, файл, буферизованный ввод, порожденный процесс, потомок, зомби-процесс, функция обработки сигнала, system call, мультиплексирование ввода, признак конца файла, вычисление, вывод, треугольник паскаля

Основные понятия и объекты

Стандарт POSIX-2001 определяет сеть как совокупность взаимосвязанных хостов. Тем самым предполагается, что сетевая инфраструктура остается скрытой от приложений, которым предоставляются высокоуровневые средства взаимодействия в распределенной среде.

Под сетевым адресом понимается видимый в пределах сети идентификатор, используемый для обозначения оконечных точек сети . Адреса есть у определенных оконечных точек хостов, могут они быть и у хостов в целом.

Данные о хостах как узлах сети хранятся в сетевой базе, допускающей и последовательный, и случайный доступ с возможностью поиска по именам и адресам хостов.

Процесс присвоения сетевого адреса оконечной точке называется связыванием, или привязкой, а обратное действие - освобождением, или отменой привязки.

Обычно оконечной точкой служит аппаратный сетевой интерфейс, посредством которого данные передаются и принимаются, однако с таким интерфейсом, как шлейфовый (loopback), никакой аппаратуры не ассоциировано.

Поддерживается база данных маршрутизации, используемая при выборе сетевого интерфейса для передачи порции данных (сетевого пакета).

Данные передаются по сети в виде последовательности октетов (восьмибитных беззнаковых величин). Если некоторый элемент данных (например, адрес или номер порта ) состоит более чем из восьми бит, для его передачи и хранения требуется несколько октетов. Сетевым называется порядок октетов (байт), при котором первый (с наименьшим адресом) октет содержит старшие (наиболее значимые) биты.

Последовательности октетов - неудобный объект обработки на хостах, где предпочтительнее аппаратно поддерживаемые типы, в особенности целочисленные. Значения этих типов обычно хранятся с другим порядком байт, называемым хостовым, поэтому вполне возможно, что старшего бита не окажется в первом байте и вообще будет использоваться некое неочевидное распределение бит по байтам.

Для преобразования значений типов uint16_t и uint32_t из хостового порядка байт в сетевой служат функции htons() и htonl() ; функции ntohs() и ntohl() осуществляют обратную операцию.

При взаимодействии процессов оконечными точками служат сокеты, они трактуются стандартом POSIX-2001 как отдельный тип файлов.

Под адресом сокета как (удаленной) оконечной точки понимается структура, включающая идентификатор адресного семейства и адресную информацию, специфичную для данного семейства. Последняя может состоять из нескольких компонентов, в том числе сетевого адреса хоста и идентификатора конкретной оконечной точки.

Основные описания, относящиеся к сокетам, сосредоточены в заголовочном файле <sys/socket.h>. Фигурирует в нем и упомянутая выше структура sockaddr для адреса сокета, которая должна содержать по крайней мере следующие поля.

sa_family_t sa_family;  
/* Адресное семейство */
char        sa_data []; 
/* Адрес сокета (данные переменной длины) */

Адресное семейство соответствует конкретной среде взаимодействия. Стандарт POSIX-2001 определяет три таких семейства.

AF_UNIX

Адресное семейство UNIX поддерживает межпроцессное взаимодействие в пределах одной системы. Формально это можно считать вырожденным случаем сетевого взаимодействия. Описания, специфичные для данного семейства, содержатся в заголовочном файле <sys/un.h>.

AF_INET

Адресное семейство, поддерживающее взаимодействие по протоколам   IPv4. Специфичные для него описания располагаются в заголовочном файле <netinet/in.h>.

AF_INET6

Взаимодействие по протоколам IPv6 (необязательная возможность). За счет поддержки адресов IPv6, отображенных на IPv4, обеспечивается совместимость с приложениями, использующими IPv4. Применяемые эти адресным семейством описания распределены по заголовочным файлам <netinet/in.h>, <arpa/inet.h> и <netdb.h>.

В пределах каждого адресного семейства могут существовать сокеты нескольких типов. В стандарте POSIX-2001 их четыре.

SOCK_STREAM

Сокеты данного типа поддерживают надежные, упорядоченные, полнодуплексные потоки октетов   в режиме с установлением соединения.

SOCK_SEQPACKET

Аналог SOCK_STREAM с дополнительным сохранением границ между записями.

SOCK_DGRAM

Передача данных в виде датаграмм в режиме без установления соединения.

SOCK_RAW

(Необязательная возможность). Аналог SOCK_DGRAM с дополнительной возможностью доступа к протокольным заголовкам и другой информации нижнего уровня. Создавать сокеты этого типа могут лишь процессы с соответствующими привилегиями.

Для каждого адресного семейства каждый тип сокета может поддерживаться одним или несколькими протоколами. В частности, в адресном семействе   AF_INET для сокетов   типа   SOCK_STREAM подразумеваемым является протокол с именем IPPROTO_TCP, а для типа   SOCK_DGRAM - IPPROTO_UDP ; посредством "прозрачных" сокетов ( SOCK_RAW ) можно воспользоваться протоколом   ICMP, задав имя IPPROTO_ICMP, и т.д.

Общая логика работы с сокетами состоит в следующем. Сокеты создаются с помощью функции socket(), которой в качестве аргументов передают адресное семейство, тип сокета и протокол, а в результате получают открытый файловый дескриптор. Затем посредством функции bind()   сокету присваивают локальный адрес. Если сокет ориентирован на режим с установлением соединения, то, прибегнув к функции listen(), его следует пометить как готового принимать соединения. Реальный прием соединений выполняет функция accept(), создающая для каждого из них новый сокет по образу и подобию " слушающего ". В свою очередь, потенциальный партнер по взаимодействию инициирует соединение, применяя функцию connect(). (В режиме без установления соединения функция connect() позволяет специфицировать адрес отправляемых через сокет   датаграмм.)

Для приема поступивших в сокет данных можно воспользоваться универсальной функцией низкоуровневого ввода/вывода read() или специализированным семейством функций recv*(), а для передачи - функцией write() или семейством send*(). Кроме того, функции select() и/или poll() помогут проверить наличие данных для приема или возможность отправки очередной порции данных.

Обращение к функции shutdown() завершает взаимодействие между партнерами.

Антон Коновалов
Антон Коновалов

В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13
Планируется ли актуализация материалов данного очень полезного курса?