Лекция 5
Сокеты Berkeley
В начале 1980-х годов агентство ARPA (Advanced Research Projects Agency — агентство перспективных научных исследований) финансировало работу группы разработчиков Калифорнийского университете в г. Беркли, которые должны были создать программное обеспечение транспортных протоколов TCP/IP для операционной системы UNIX. Результаты этого проекта получили широкую известность под названием API-интерфейса сокетов.
В дальнейшем система Berkeley UNIX была адаптирована для своих целей многими поставщиками компьютеров, поэтому интерфейс сокетов стал применяться на многих компьютерах. Таким образом, интерфейс сокетов получил настолько широкое распространение, что стал фактически рассматриваться как стандарт. Компания Microsoft внесла свой вклад в дальнейшее распространение этого интерфейса, разработав версию сокетов для своей операционной системы.
Понятие сокета. Дескрипторы сокетов и дескрипторы файлов
Приложение, которому требуется выполнить ввод/вывод, вызывает функцию open, чтобы создать дескриптор файла, применяемый для доступа к файлу. В операционной системе дескриптор файла реализован как массив указателей на внутренние структуры данных. Система сопровождает отдельную таблицу дескрипторов файлов для каждого процесса. При открытии файла процессом система помещает указатель на внутренние структуры данных для этого файла в таблицу дескрипторов файлов процесса и возвращает индекс таблицы в вызывающий оператор. В прикладной программе достаточно только присвоить этот дескриптор переменной и использовать его в последующих вызовах, которые запрашивают операции с файлами. Операционная система использует дескриптор как индекс таблицы дескрипторов процесса и переходит по указателю к структурам данных, содержащим всю информацию о файле.
В API-интерфейсе сокетов реализовано новое абстрактное понятие для сетевой связи — сокет. Как и файл, каждый активный сокет обозначается небольшим целым числом, называемым дескриптором сокета. Операционная система размещает дескрипторы сокетов в той же таблице дескрипторов, что и дескрипторы файлов.
При вызове сокета приложением операционная система распределяет в оперативной памяти структуру данных для хранения информации, необходимой для связи, и заполняет новую запись в таблице дескрипторов, включив в нее указатель на структуру данных.
Сразу после создания сокета приложение должно указать, как он будет использоваться. Сам сокет является универсальным средством ввода/вывода и может применяться для любой связи. Например, сервер может настроить сокет на ожидание входящих запросов на установление соединения. Клиент может настроить сокет для инициирования соединения.
Сокет, переведенный сервером в режим ожидания входящих запросов на установление соединения, называется пассивным сокетом. Сокет, применяемый клиентом для инициирования соединения, называется активным сокетом.
Определение адреса оконечной точки
Сразу после своего создания сокет не содержит никакой информации о том, как он будет использоваться. В частности, сокет не содержит информации о номерах портов протокола или IP-адресах локального или удаленного компьютеров. Прежде чем в приложении можно будет использовать сокет, необходимо указать один или оба эти адреса.
В протоколах TCP/IP оконечная точка связи определена как сочетание IP-адреса и номера порта протокола. В других семействах протоколов такие адреса оконечных точек определены иначе. Поскольку абстрактное понятие сокета распространяется на многие семейства протоколов, в сокете не указано, как должны быть определены адреса оконечных точек. Вместо этого сокет разрешает указывать оконечные точки в соответствии с каждым семейством протоколов. Во всех протоколах TCP/IP применяется единственное представление адреса, а семейство адресов обозначается символической константой AF_INET.
Замечание: На практике часто возникает путаница между семейством протоколов TCP/IP, которое обозначается константой PF_INET (protocol), и применяемым в нем семейством адресов, обозначенным константой AF_INET (address). Основная проблема состоит в том, что обе символические константы имеют одинаковое числовое значение (2), поэтому если в программе одна из этих констант непреднамеренно заменена другой, программа все равно работает правильно.
