МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Тема 1. Общий принцип работы Интернет приложений Цель: изучить общий с Интернет-приложениями. принцип организации работы пользователей Задачи: разобраться в схеме взаимодействия клиента и сервера при работе пользователей в среде Интернет; изучить основные методы отправки запросов Web-серверу; познакомиться с организацией CGI-протокола и возможностями его использования для разработки Интернет-приложений; познакомиться с основными функциями Web-серверов и современным состоянием их использования в среде Интернет. Оглавление 1.1. Схема взаимодействия клиента и Web-сервера. Принципы передачи информации ........................................................................................................... 1 1.1.1. Организация взаимодействия клиента и сервера в сети Интернет ......... 1 1.1.2. Методы отправки запросов Web-серверу ................................................ 4 1.2. Общий интерфейс шлюза CGI (Common Gateway Interface) ........................... 5 1.3. Основные функции Web-серверов .................................................................. 8 Вопросы для самопроверки.................................................................................... 8 1.1. Схема взаимодействия клиента и Web-сервера. Принципы передачи информации 1.1.1. Организация взаимодействия клиента и сервера в сети Интернет Вся сеть Интернет построена по принципу «клиент-серверной» архитектуры. Эта архитектура прежде всего относится к разделению некоторой конкретной задачи в ходе ее решения на два взаимодействующих процесса. При этом один из процессов инициирует диалог с другим процессом в ходе решения данной задачи. Это весьма близко к обслуживанию в магазинах: множество клиентов обслуживает один продавец, который в ответ на запросы покупателей выдает им конкретные товары и получает за них деньги. Первый процесс принято называть «клиентом» в данной архитектуре, а второй — «сервером». Серверный процесс может обслуживать множество клиентов. Кто же является клиентом, и кто его обслуживает при работе в Интернете? На это вопрос достаточно тяжело ответить коротко. Каждый раз, когда вы садитесь перед компьютером и перемещаетесь по Web-пространству, вы становитесь клиентами, с точки зрения сети Internet. Каждый раз, щелкая по очередной ссылке, вы запрашиваете новый Web-документ, посылая запрос на сервер, содержащий требуемый документ. Сервер, которому вы отослали запрос — это Web-сервер. Сервер получает запрос, берет нужный документ 1 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE и посылает его назад следующим образом. браузеру. Эту схему графически можно представить Рис. 1.1. Взаимодействие Web-сервера и Web-клиента Взаимодействие клиента и сервера в сети Интернет осуществляется по протоколу HTTP (HyperText Transfer Protocol, протокол передачи гипертекста). Этот протокол является базовой основой технологий WWW. Internet построен по многоуровневому принципу, от физического уровня, связанного с физическими аспектами передачи двоичной информации, и до прикладного уровня, обеспечивающего интерфейс между пользователем и сетью. HTTP — это протокол прикладного гипертекстовой информацией в Internet. уровня, разработанный для обмена HTTP предоставляет набор методов для указания целей запроса, отправляемого серверу. Эти методы основаны на дисциплине ссылок, где для указания ресурса, к которому должен быть применен данный метод, используется универсальный идентификатор ресурсов (Universal Resource Identifier) в виде местонахождения ресурса (Universal Resource Locator, URL) или в виде его универсального имени (Universal Resource Name, URN). Сообщения по сети при использовании протокола HTTP передаются в формате, схожем с форматом почтового сообщения Internet (RFC-822) или с форматом сообщений MIME (Multipurpose Internet Mail Exchange). HTTP используется для коммуникаций между различными пользовательскими программами и программами-шлюзами, предоставляющими доступ к существующим Internet-протоколам, таким как SMTP (протокол электронной почты), NNTP (протокол передачи новостей), FTP (протокол передачи файлов), Gopher и WAIS. HTTP разработан для того, чтобы позволять таким шлюзам через промежуточные программы-серверы (proxy) передавать данные без потерь. Протокол реализует принцип запрос/ответ. Запрашивающая программа — клиент инициирует взаимодействие с отвечающей программой — сервером и посылает запрос, содержащий: метод доступа; адрес URI; версию протокола; сообщение (похожее по форме на MIME) с информацией о типе передаваемых данных, информацией о клиенте, пославшем запрос, и, возможно, с содержательной частью (телом) сообщения. Ответ сервера содержит: строку состояния, в которую входит версия протокола и код возврата (успех или ошибка); 2 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE сообщение (в форме, похожей на MIME), в которое входит информация сервера, метаинформация (т. е. информация о содержании сообщения) и тело сообщения. В протоколе не указывается, кто должен открывать и закрывать соединение между клиентом и сервером. На практике соединение, как правило, открывает клиент, а сервер после отправки ответа инициирует его разрыв. Давайте рассмотрим более подробно, в какой форме отправляются запросы на сервер. Форма запроса клиента Клиент отсылает серверу запрос в одной из двух форм: в полной или сокращенной. Запрос в первой форме называется соответственно полным запросом, а во второй форме — простым запросом. Простой запрос содержит метод доступа и адрес ресурса. Формально это можно записать так: <Простой-Запрос>:= <Метод> <символ пробел><Запрашиваемый-URI> <символ новой строки> В качестве метода могут быть указаны GET, POST, HEAD, PUT, DELETE и др. Наиболее распространенными являются методы GET, POST и HEAD. В качестве запрашиваемого URI чаще всего используется URL — адрес ресурса. Пример простого запроса: GET http://phpbook.info/ Здесь GET — это метод доступа, т. е. метод, который должен быть применен к запрашиваемому ресурсу, а http://phpbook.info/ — это URL — адрес запрашиваемого ресурса. Полный запрос содержит строку состояния, несколько заголовков (заголовок запроса, общий заголовок или заголовок содержания) и, возможно, тело запроса. Формально общий вид полного запроса можно записать так: <Полный запрос>:= <Строка состояния> (<Общий заголовок>|<Заголовок запроса>| <Заголовок содержания>) <символ запроса>] новой строки> [<содержание Квадратные скобки здесь обозначают необязательные элементы заголовка, через вертикальную черту перечислены альтернативные варианты. Элемент <Строка состояния> содержит метод запроса и URI ресурса (как и простой запрос), и, кроме того, используемую версию протокола HTTP. Например, для вызова внешней программы можно задействовать следующую строку состояния: POST http://phpbook.info/cgi-bin/test HTTP/1.0 В данном случае используется метод POST и протокол HTTP версии 1.0. 3 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE В обеих формах запроса важное место занимает URI запрашиваемого ресурса. Чаще всего URI используется в виде URL — адреса ресурса. При обращении к серверу можно применять как полную форму URL, так и упрощенную. Полная форма содержит тип протокола доступа, адрес сервера ресурса и адрес ресурса на сервере (см. рис.1.2). В сокращенной форме опускают протокол и адрес сервера, указывая только местоположение ресурса от корня сервера. Полную форму используют, если возможна пересылка запроса другому серверу. Если же работа происходит только с одним сервером, то чаще применяют сокращенную форму. Рис. 1.2. Полная форма URL 1.1.2. Методы отправки запросов Web-серверу Любой запрос клиента к серверу должен начинаться с указания метода. Метод сообщает о цели запроса клиента. Протокол HTTP поддерживает достаточно много методов, но реально используются только три: POST, GET и HEAD. Метод GET позволяет получить любые данные, идентифицированные с помощью URI в запросе ресурса. Если URI указывает на программу, то возвращается результат работы программы, а не ее текст (если, конечно, текст не есть результат ее работы). Дополнительная информация, необходимая для обработки запроса, встраивается в сам запрос (в строку статуса). При использовании метода GET в поле тела ресурса возвращается собственно затребованная информация (текст HTMLдокумента, например). Существует разновидность метода GET — условный GET. Этот метод сообщает серверу о том, что на запрос нужно ответить, только если выполнено условие, содержащееся в поле if-Modified-Since заголовка запроса. Если говорить более точно, то тело ресурса передается в ответ на запрос, если этот ресурс изменялся после даты, указанной в if-Modified-Since. Метод HEAD аналогичен методу GET, только не возвращает тело ресурса и не имеет условного аналога. Метод HEAD используют для получения информации о ресурсе. Это может пригодиться, например, при решении задачи тестирования гипертекстовых ссылок. Метод POST разработан для передачи на сервер такой информации, как аннотации ресурсов, новостные и почтовые сообщения, данные для добавления в базу данных, т. е. для передачи информации большого объема и достаточно 4 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE важной. В отличие от методов GET и HEAD, в POST передается тело ресурса, которое и является информацией, получаемой из полей форм или других источников ввода. 1.2. Общий интерфейс шлюза CGI (Common Gateway Interface) Работа с документами Web-сервера осуществляется при помощи браузера (например, IE, Opera или Mozilla), который является клиентом по отношению к серверу и отсылает ему запросы, созданные в соответствии с протоколом HTTP. В процессе выполнения задания сервер может связываться с другими серверами. Однако инициатором запроса всегда является клиент, а сервер может отослать свою или чужую страницу HTML, адрес которой запросил клиент. Однако часто трудно заготовить все возможные страницы HTML для пользователя — они могут быть стереотипными, и отличаться лишь малой толикой информационного наполнения. Но в соответствии с протоколом HTTP клиент может передать серверу некоторые данные, но кто же будет готовить ему новую страницу в соответствии с переданными данными? Разработчики предложили решение этой проблемы, создав CGI (Common Gateway Interface — Общий интерфейс шлюза). Спецификация Common Gateway Interface предложена группой NCSA (Национального центра суперкомпьютерных приложений). Интерфейс CGI был специально разработан для расширения возможностей WWW за счет подключения всевозможного внешнего программного обеспечения. Такой подход логично продолжал принцип публичности и простоты разработки и наращивания возможностей WWW. Шлюз предусматривает единое окружение и набор протоколов для внешних приложений, взаимодействующих с Web-сервером. Таким образом, любое приложение может использовать CGI для обеспечения интерфейса между приложением и Web-сервером. Это значительно расширяет диапазон возможностей Web-сервера, включая те свойства, которыми обладает потенциально неограниченное число внешних приложений. То есть теперь некоторое CGI-приложение может генерировать бесчисленное количество различных HTML-страниц и передавать их Web-серверу, а тот в свою очередь может возвращать их клиенту, который как раз и запросил данную страницу. С помощью CGI можно создавать CGI-программы, называемые шлюзами, которые во взаимодействии с такими прикладными системами, как система управления базой данных, электронная таблица, деловая графика и др., смогут выдать на экран пользователя динамическую информацию. Программа-шлюз запускается WWW-сервером в реальном масштабе времени. WWW-сервер обеспечивает передачу запроса пользователя шлюзу, а она в свою очередь, используя средства прикладной системы, возвращает результат обработки запроса на экран пользователя. Программа-шлюз может быть закодирована на языках C/C++, Fortran, Perl, TCL, Unix Schell, Visual Basic, Apple Script, PHP. Как выполнимый модуль, она записывается в поддиректорий с именем cgi-bin WWW-сервера. На рис. 1.3 показан принцип взаимодействия Web-сервера с клиентами с использованием CGI-протокола. 5 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Рис. 1.3. Взаимодействие Web-сервера с клиентами с использованием CGI–протокола Для передачи данных об информационном запросе от сервера к шлюзу сервер использует командную строку и переменные окружения. Эти переменные окружения устанавливаются в тот момент, когда сервер выполняет программу шлюза (cм. рис. 1.4). Рис. 1.4. Информационные потоки при взаимодействии Web-сервера с CGI-приложением При отправке данных на сервер любым методом передаются не только сами данные, введенные пользователем, но и ряд переменных, называемых переменными окружения, характеризующими клиента, историю его работы, пути к файлам и т. п. Вот некоторые из переменных окружения: REMOTE_ADDR — IP-адрес хоста (компьютера), отправляющего запрос; REMOTE_HOST — имя хоста, с которого отправлен запрос; HTTP_REFERER — адрес страницы, ссылающейся на текущий скрипт; REQUEST_METHOD — метод, который был использован при отправке запроса; 6 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE QUERY_STRING — информация, находящаяся в URL после знака вопроса; SCRIPT_NAME — виртуальный путь к программе, которая должна выполняться; HTTP_USER_AGENT — информация о браузере, который использует клиент; CONTENT_TYPE — при использовании метода передачи POST в этой переменной хранится строка с названием типа данных, присланных браузером. Если браузер присылает текстовые данные (как это бывает в большинстве случаев), тип данных может быть application/x-www-formurlencoded. Однако возможно применение и других типов данных, например multipart/form-data. В этом случае от браузера могут быть приняты как текстовые, так и двоичные файлы. Как правило, программа CGI анализирует содержимое некоторых переменных среды, получает данные от удаленного пользователя через стандартный поток ввода, а результат обработки этих данных записывает в стандартный поток вывода. Метод GET обеспечивает получение данных от браузера с помощью переменной среды с именем QUERY_STRING. Значение этой переменной равно param1. Это значение соответствует строке параметров, передаваемой программе после знака? Метод передачи данных GET прост в использовании, однако он подходит только для передачи относительно коротких текстовых строк. Причина этого лежит в ограничении, которое накладывается операционной системой на размер строки переменной среды (не более 255 символов). Если необходимо передать текстовые данные большого объема (например, содержимое полей диалоговых панелей), более предпочтителен метод POST: тогда программа GCI получает данные от браузера, выполняя чтение из стандартного потока ввода. Если данные передаются методом POST (о чем программа CGI может узнать, анализируя переменную среды REQUEST_METHOD), то объем передаваемых данных записывается в переменную среды с именем CONTENT_LENGTH. Заметим, при использовании метода GET содержимое переменной среды CONTENT_LENGTH анализировать не нужно. Каждый раз, когда удаленный пользователь обращается к расширению CGI, на сервере Web запускается программа, которая выполняется как отдельный процесс, причем в собственном адресном пространстве. На запуск процесса требуется время, и если ваш сервер пользуется популярностью, то программы CGI могут полностью его загрузить. В результате увеличится время реакции сервера, что может оттолкнуть от него пользователей. Развитие Web-серверов привело к тому, что некоторые CGI-приложения стали выполняться не как отдельные процессы на сервере, а как нитевые (облегченные процессы) в пространстве единого серверного процесса. Такая технология стала называться FastCGI в одних случаях и ISAPI в других. Второе название пришло от фирмы Microsoft, которая предложила расширение для прикладного интерфейса сервера Интернет (Internet Server API) в виде библиотек динамической загрузки DLL. Такое приложение запускается фактически один раз, оно загружается в адресное пространство процесса Web-сервера и начинает свою работу. В памяти всегда находится только одна копия соответствующей библиотеки DLL, поэтому при одновременном обращении к расширению ISAPI нескольких пользователей системные ресурсы расходуются более экономно, а кроме того, не тратится время на дополнительные загрузки расширения. Построение такого многопользовательского рентерабельного (повторно вызываемого) приложения — задача гораздо более сложная, чем построение простого CGI-приложения. Однако 7 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE в последнее время для многих языков серверных скриптов разработаны подобные технологии программирования. В частности для языка PHP существует возможность конфигурирования исполнителя PHP-скриптов, как модуля Web-сервера Apache, что обеспечивает ему подобный принцип исполнения. 1.3. Основные функции Web-серверов Web была создана для распространения гипертекстовых документов в привлекательном графическом формате, но теперь всеобщей заботой стало расширение ее функциональных возможностей. Пользователи стремятся персонифицировать содержимое страниц. Многие компании хотят, чтобы страницы Web могли извлекать информацию из баз данных и составлять отчеты в задаваемой пользователем форме. Что собой представляют Web-серверы? Функции, выполняемые Web-серверами, в сущности очень просты: прием запроса от Web-браузера по протоколу HTTP с использованием TCP/IP; поиск и отсылка файла гипертекста или документа в браузер по HTTP; обслуживание запросов mailto, ftp, telnet и др.; запуск прикладных программ на Web-сервере с передачей и возвратом параметров обработки через интерфейс CGI; обслуживание навигационных карт изображения imagemap; источник загружаемых программ на языке Java; контроль доступа на основе имен и паролей доступа; ведение регистрационного журнала; административное и оперативное управление сервером. В качестве примеров Web-серверов можно привести сервер Apache группы Apache, Internet Information Server (IIS) компании Microsoft, SunOne фирмы Sun Microsystems,WebLogic фирмы BEA Systems, IAS (Inprise Application Server) фирмы Borland, WebSphere фирмы IBM, OAS (Oracle Application Server). В табл. 1 приведена статистика использования различных серверов среди всех доменов Internet от NetCraft http://news.netcraft.com/. Таблица 1. Ведущие разработчики web-серверов Разработчик Февраль 2004 Apache Microsoft SunONE Zeus 31703884 9849971 1657295 755227 Процент ы 67.21 20.88 3.51 1.60 Март 2004 Проценты Изменение 32280582 10099760 1651575 762716 67.20 21.02 3.44 1.59 -0.01 0.14 -0.07 -0.01 Как видно из приведенной таблицы, сервер Apache занимает лидирующие позиции. Именно поэтому и в нашем курсе мы будем ориентироваться на этот самый популярный Web-сервер. Вопросы для самопроверки 1. 2. Какие протоколы используются при передаче сообщений в сети Интернет? Кто выступает в качестве клиента при работе в сети Интернет? 8 МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE 3. Как распределяются функции клиента и сервера при работе в сети Интернет? 4. Кто является инициатором диалога между клиентом и сервером? 5. Что такое простой запрос и чем он отличается от полного запроса? 6. Как расшифровывается аббревиатура HTTP и что она означает? 7. С какого года сеть Интернет использует протокол HTTP? 8. Что такое CGI-протокол, зачем он был предложен и как он может быть использован в Интернете? 9. Что такое ISAPI — как расшифровать данное сокращение, каков принцип организации работы ISAPI-приложений? 10. Что такое реентерабельные программы, как они работают? 9