Абстракция сокетов

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

IP-пакетов и предоставления более удобного сервиса применяются протоколы транснортиого уровня. Многим приложениям пужно, чтобы они передавали данные в сеть и получали данные из сети точно таким же образом, как осуществляется запись в файл или чтение из файла. Если отправитель передает 5000 байтов, получатель должен получить 5000 байтов. Процесс передачи не должен вызывать утерю, новреждепие данных или изменение порядок байтов. Таким образом, передающему и принимающему приложению нужно, чтобы они взаимодействовали через соединение, обеспечивающее упорядоченный, надежный поток байтов. IP не предоставляет такого сервиса. Этот сервис предоставляется протоколом Transmission Control Protocol (TCP), который обычно реализуется в операционной CHC\…ie каждого хосга, подключенного к Internet.

Приложение использует TCP путем создания сокета (двунаправленного капала), что сходно с открытием файла. Оба приложения должны иметь однозначный способ для идентификации сокета. Знать IP-адреса двух Компьютеров недостаточно. На одном Компьютере могут выполняться несколько приложений, а одно приложение, например, Web-сервер, может работать с несколькими сокегами. Каждый сокет ассоциируется с номером порта на каждом конце соединения. Номер порта представляет собой 16-битное целое число в диапазоне от 0 до 65535. Номера, меньшие 1024, являются известными портами, зарезервированными для определенных протоколов прикладного уровня. Например, порт 80 предназначен для HTTP. Назначение номеров портов приложениям осуществляется организацией по административному управлению доменами Internet Assigned Number Authority (IANA). Оставшиеся номера портов в диапазоне от 1024 до 65535 могут быть ис- нользованы любым приложением. Однако в некоторых случаях вновь разработанный Internet-сервис может не иметь общеизвестного зарезервированного порта. Тогда выбирается помер порта, который де-факто станет стандартным для этого приложения.

По умолчанию Web-клиент, например, браузер создает сокет, который соединяется с портом 80 на Компьютере сервера. Однако не возбраняется и выбор другого номера порта. Например, Web-cepвep может быть сконфигурирован для прослушивания клиентских запросов на порту 8000. В этом случае клиенту необходимо знать, что следует запрашивать соединение с портом 8000, а не с портом 80. Это достигается путем указания номера порта в URL. Например, если пользователь запрашивает ресурс http://www.foo.com:8000/bar.html, клиент должен создать сокет, который соединяется с портом 8000 сервера, а не с портом 80. Клиенту также нужен номер порта на своей стороне соединения. В противпом случае сервер не будет знать, как направлять данные клиенту. В процессе создания сокета операционная система на Компьютере клиента присваивает клиентскому приложению вре- менный помер порта (от 1024 до 65535). Сокет идентифицируется rio пяти информационным составляющим: двум IP-адресам (для Компьютеров, выполняющих приложения), двум номерам портов (для двух приложений, выполняющихся на каждой стороне соединения) и протоколу (TCP).

Приложения создают сокеты с помощью системных вызовов, реализуемых операционной системой. Допустим, приложение А (например, Web-клиент) создает сокет для соединения с удаленным приложением В (например, Web-сервером). Приложение А инициирует создание сокета, сделав системный вызов. В операционной системе UNIX для создания нового сокета используется функция socket() [Ste98bJ. Загем приложение делает системный вызов connect() для связывания сокета с IP-адресом и номером порта приложения В. Во время выполнения вызова connect() операционная система также выбирает неиспользуемый локальный номер порта (от 1024 до 65535) для приложения А. На этот момент операционной системе, выполняющей приложение А, известны два IP-адреса и два номера порта, которые уникалыю идентифицируют двупаправлепное соединение между двумя приложениями. Затем операциоипая система инициирует установку TCP-соединения с приложением В. После того как соединение установлено, вызов connect() завершается, а приложение А может начать чтение данных из сокета и запись данных в сокет.

В противоположность этому, приложение В первоначально играет пассивную роль в создании соединения. Приложение В ожидает поступления запросов на определенный порт для установления соединения. В UNIX это реализуется путем создания сокета и вызова bind() для назначения локалыюго номера порта (например, порта 80). Затем приложение В делает системный вызов listen() для прослушивания запросов на соединение от удаленных приложений. Это заставляет операционную систему отвечать на любые запросы на установление ТСР-соединепий с этим портом. Приложение узнает об этих новых TCP-соединениях с помощью системного вызова accept(). По умолчапию вызов accept() ждет запроса на иовое соединение. После получения запроса завершается создание сокета. С этого момента приложение В может начать чтение данных из сокета или запись данных в сокет.

После того, как соединение установлено, любое из приложений может читать или записывать дапиые. Фактически, оба приложения могут читать и записывать одновременно, поскольку сокег предоставляет двунаправленный коммуникационный капал. Web-клиент (приложение А) инициирует взаимодействие. Клиент записывает HTTP-запрос в сокет. Сервер (приложение В) ожидает получения дапных через свой сокет. Затем после поступления данных сервер читает НТТР-запрос из сокета. После обработки запроса сервер записывает HTTP-ответ в сокет. В то же самое время клиент ожидает получения данных через сокет. Подобный образ действий типичен для приложений клиент-сервер. TCP предоставляет гораздо более широкие возможности для поддержания двунаправленного взаимодействия между двумя приложениями. В общем случае и А, и В может первым осуществить запись данных, либо оба приложения могут читать и записывать данные одновременно.

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

Источник: Web-протоколы. Теория и практика. — M.: ЗАО «Издательство БИНОМ», 2002 г. – 592 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100