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

Общие сведения

Сокеты (англ. socket — углубление, гнездо, разъём) — название программного интерфейса для

обеспечения обмена данными между процессами. Процессы при таком обмене могут

исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет —

абстрактный объект, представляющий конечную точку соединения.

Интерфейс сокетов впервые появился в BSD Unix. Программный интерфейс сокетов описан в

стандарте POSIX.1 и в той или иной мере поддерживается всеми современными операционными

системами.


Сокеты могут динамически создаваться и уничтожаться. При создании сокета вызывающему

процессу возвращается дескриптор файла, который используется для установки или разрыва

соединения, а также чтения и записи данных.

Каждый сокет поддерживает определенный тип работы в сети, указываемый при его создании.

Наиболее распространенными типами сокетов являются:

· Надежный, ориентированный на соединение байтовый поток.

· Надежный, ориентированный на соединение поток пакетов.

· Ненадежная передача пакетов.

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

эквивалент «трубы» (канала между процессами на одной машине). Байты подаются в канал с

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

Второйтип сокетов отличается от первого тем, что он сохраняет границы между пакетами. Если

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

512 байт, а получатель запрашивает 2560 байт по сокету типа 1, он получит все 2560 байт сразу.

При использовании сокета типа 2 ему будут выданы только первые 512 байт. Чтобы получить

остальные байты, необходимо повторно прочитать данные из сокета с помощью функции read

еще четыре раза.

Третий тип сокетапредоставляет пользователю доступ к «голой» сети. Этот тип сокета особенно полезен для приложений реального времени и ситуаций, в которых пользователь хочет реализовать специальную схему обработки ошибок. Сеть может терять пакеты или доставлять их в неверном порядке. В отличие от сокетов первых двух типов, сокет типа 3 не предоставляет никаких гарантий доставки. Преимущество этого режима заключается в более высокой производительности, которая в некоторых ситуациях оказывается важнее надежности (например, для доставки мультимедиа, при которой скорость ценится существенно выше, нежели сохранность данных по дороге).

При создании сокета один из параметров указывает протокол, используемый для него. Для надежных байтовых потоков, как правило, используется протокол TCP (Transmission Control

Protocol – протокол управления передачей). Для ненадежной передачи пакетов обычно применяется протокол UDP (User Data Protocol – пользовательский протокол данных). Для надежного потока пакетов специального протокола нет.

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

Этот адрес может принадлежать к одному из нескольких пространств адресов. Наиболее распространенным пространством является пространство адресов Интернета, использующее 32-

разарядные числа для идентификации конечных адресатов в протоколе IPv4 и 128-разрядные числа в протоколе IPv6 (5-я версия протокола IP была экспериментальной системой, так и не выпущенной в свет).

Как только сокеты созданы на компьютере-источнике и компьютере-приемнике, между ними может быть установлено соединение (для ориентированной на соединение связи). Одна сторона обращается к системному вызову listen, указывая в качестве параметра локальный сокет. При этом системный вызов создает буфер и блокируется до тех пор, пока не прибудут данные. Другая сторона обращается к системному вызову connect, задавая в параметрах дескриптор файла для локального сокета и адрес удаленного сокета. Если удаленный компьютер принимает вызов, то система устанавливает соединение между двумя сокетами.

Функции установленного соединения аналогичны функциям канала. Процесс может читать из канала и писать в него. Когда соединени более не нужно, оно может быть закрыто обычным способом, при помощи системного вызова close.

Наши рекомендации