logo search
Проектирование инт-прил / лекции / Проектирование инет приложений

Что такое "сокета" (socket) ?

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

Представим себе такую ситуацию: вам звонят Вам по телефону. При этом и Вы, и звонящий Вам абонент берете в руки телефонную трубку. Вас не интересуют подробности работы телефонной сети. Вы не знаете, какими базовыми станциями обслуживается ваш разговор, по каким каналам связи он идет между базовыми станциями, где и какое сработало коммутационное оборудование и так далее. Зато вы знаете, что если набрать номер - через какое-то время установится соединение и можно будет говорить. Причем делать это нужно по очереди. То есть, для общения вы должны соблюдать некоторый протокол, последовательно обращаясь к некоторым функциям трубки (набрать номер, дождаться ответа абонента, говорить). Можно сказать, что телефонная сеть для вас представлена трубкой. То же самое справедливо и для сокеты: сразу за ней начинается сеть, но подробности работы самой этой сети приложению знать не обязательно, достаточно вызывать некоторые функции объекта "сокета" в определенном порядке (то есть с соблюдением протокола).

Сокета - объект универсальный, единый по своей сути для клиентской и серверной стороны. После ее создания при помощи вызова соответствующих методов она может стать как клиентской (при вызове connect), так и серверной (при вызове метода listen). Если воспользоваться аллегорией, то серверная сокета - это электрическая розетка на стене. У этой розетки есть замечательное свойство: она всегда является свободной. Как только к ней подключается клиент ("вилка"), сервер тут же порождает новый процесс, обслуживающий данное соединение. Розетка с включенной в нее вилкой "отъезжает" в сторону, где происходит непосредственно обмен между данным конкретным клиентом и сервером. А исходная "розетка на стене" по-прежнему остается свободной, доступной для следующих соединений. Естественно, каждый подключившийся клиент занимает определенные ресурсы операционной системы. Поэтому при создании серверной сокеты указывается максимально допустимое число клиентских соединений.

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

Сокета как программный объект характеризуется тремя параметрами: доменом ("областью", семейством протоколов, которые могут быть использованы для данной сокеты), типом и портом. Наиболее распространенными являются следующие домены:

AF_UNIX (AF_LOCAL)- для организации обмена в рамках одного и того же компьютера

AF_INET, AF_INET6- по протоколу IP v4 / IP v6 соответственно

AF_NETLINK- для взаимодействия между пространством пользовательских программ и ядром операционной системы

Кроме того, существуют и другие домены сокетов, которые используются значительно реже или, в силу разных причин, в настоящее время уже практически не используются:

AF_IPX- семейство протоколовIPXNovell

AF_X25,AF_AX25 - протоколX.25 и его модификация для передачи по радио. Протокол X.25 разрабатывался специально для работы в условиях плохих линий связи, поэтому содержит более развитый механизм контроля и коррекции ошибок, чем TCP/IP.

AF_ATMPVC-ATMPVC,Asynchronoystransfermodepermanentvirtualcircuit, постоянный виртуальный канал сети на основе асинхронных коммутаторов передачи данных. В настоящее время почти полностью вытеснен технологией Gigabit Ethernet.

AF_APPLETALK- семейство протоколов фирмыApple. С течением времени фирмаAppleотказалась от него в пользу TCP/IP.

Особняком стоит домен, который называется AF_PACKET. Он предоставляет "сырой" доступ к сокете, без учета специфики протокола. Его существование позволяет пользователю самому реализовывать низкоуровневое общение с устройствами (уровень 2 по OCI, канальный уровень - сразу над физическим. На этом уровне работают коммутаторы, мосты и другое сетевое оборудование. Делится на MAC - mediaaccesscontrol- разделение доступа к физической среде передачи, иLLC-logicallinkcontrol, обеспечение логического обслуживания сетевого уровня).

Среди типов сокет наиболее распространены три:

SOCK_STREAM- создаваемая сокета предназначена для организации последовательного потока. При этом между клиентом и сервером устанавливается виртуальное соединение, ошибки в работе которого также обрабатываются сокетой. Соответственно, если мы создадим сокету с доменом AF_INET и типом SOCK_STREAM - такая сокета будет обрабатывать TCP/IP соединение.

SOCK_DGRAM- сокета предназначена для передачи дейтаграмм. Дейтаграммы (датаграммы,datagram) - это пакеты информации, которые передаются по сети без установления соединения. Они имеют адрес отправителя и получателя, но факт их доставки не гарантируется. Точно так же не гарантируется и порядок прихода дейтаграмм: далеко не факт, что получатель примет сообщения в том же самом порядке, в каком они были переданы. Основной особенностью работы с дейтаграммами является отсутствие временных задержек, вызванных скоростью работы сети. Являются основой протокола UDP (UserDatagramProtocol).

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

Порт сокеты - это беззнаковое целое двухбайтное число, которое определяет службу сервера. Сочетание порт-протокол является уникальным на данном компьютере, в том смысле, что если данный порт и данный протокол уже прослушиваются каким-либо процессом - другой процесс не сможет повторно создать такую же сокету. Тот же порт, но с другим протоколом при этом захватить можно. Порты диапазона 0-1023 являются "привилегированными", то есть для создания сокеты, прослушивающей данный порт, необходимы особые привилегии. Теоретически, любой порт свыше 1024 может быть захвачен первым запросившим его процессом. На самом деле число официально зарегистрированных портов гораздо больше, чем 1024. В качестве примера можно назвать сочетание 3306/tcp, которое используется сервером MySQL по умолчанию. Общепринятые присвоения портов не являются официальным стандартом и любой созданный пользователем процесс имеет полное право захватить порт 3306/tcp. И иногда программисты намеренно этим пользуются - с целью ввести в заблуждение возможных злоумышленников. Однако, если у вас нет на то каких-то особых причин, не стоит использовать в своих программах зарегистрированные пары порт-служба.

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