Курсовая работа
На тему: Протокол HTTP
Содержание
Содержание. 1
Введение. 4
1.Исследовательский раздел. 8
1.1 Постановка задачи. 8
1.2 Передача данных. 9
1.2.1 Протоколы передачи данных. 9
1.2.2 Протокол TCP. 11
1.2.3 Протокол HTTP. 12
1.3 Системная информация ОС Linux. 18
1.3.1 Расположение системной информации. 18
1.3.2 Файловая система /proc. 19
2.Технологический раздел. 24
2.1 Выбор языка программирования. 24
2.2 Программные средства. 24
2.2.1 Потоки. 24
2.2.2 Семафоры и мьютексы… 25
2.2.3 Сокеты… 26
2.2.4 Сигналы… 27
2.3 Структура модулей программы… 27
2.3.1 Система инициализации. 29
2.3.2 Сервери система управлениядинамическими библиотеками. 31
2.3.3 Система журналирования. 31
2.3.3 Система безопасности. 32
2.4Динамические библиотеки. 33
2.4.1 PROCESSES– информация о процессах. 33
2.4.2 MEMINFO– информация о системной памяти. 34
2.4.3 DISKFREE– информация о свободном месте на дисках. 34
2.4.4 NETWORK– информация о сетевых устройствах. 35
2.4.5 VERSION– версия операционной системы… 35
2.4.6 INDEX – страницапомощи. 36
2.5 Использование программы… 36
2.5.1 Настройка сервера. 36
2.5.2 Доступ к серверу. 37
2.5.3 Завершение работы сервера. 38
Заключение. 40
Списокиспользованной литературы… 42
Введение
В настоящее время наблюдается тенденция к переносубольшого количества приложений в среду Интернет – это позволяет болееэффективно организовывать совместную работу с данными, коммуникацию удаленныхпользователей и быстрое реагирование на возникающие события. Распределенныеприложения, доступ к которым осуществляется посредством линий связи, оказалисьочень удобными – появилась возможность разделять места хранения данных иэффективно организовывать доступ к ним персонала из любой точки земного шара.Разумеется, активное использование распределенных веб-приложений накладываеткрайне высокие требования на платформу, на которой происходит их выполнение –должна обеспечиваться надежная и бесперебойная работа серверов, высокаяскорость доступа и возможность динамического обновления программногообеспечения на серверных компьютерах.
В последние несколько летвсе большую популярность приобретают серверы, работающий под управлениемоперационных систем семейства UNIX: FreeBSD, OpenBSD, Solaris,Linux. Все эти системы спроектированы всоответствии со стандартом POSIXи имеют идентичный программный интерфейс, что позволило с легкостью переноситьприложения, написанные в одной системе, на другую. Кроме того, все эти системыпоказали себя крайне надежными и отказоустойчивыми, по большей части из-запостоянного совершенствования, которое, зачастую, выполняется бесплатноэнтузиастами со всего мира.
UNIX-системы не прижились в качествепользовательских операционных систем в силу своей сложности и необходимостиизучить большое число команд, однако в сфере серверов Интернета подобныесистемы постепенно вытесняют серверные версии Microsoft Windows.
С появлением большогочисла серверов под управлением операционных систем семейства UNIX встал вопрос об администрированииэтих серверов и, в частности, производить административные действия удаленно,посредством сетей передачи данных. Необходимость подобных действий вызвана тем,что физически сервер не всегда может быть доступен: администратор можетобслуживать сразу несколько серверов, физически отстоящих друг от друга назначительное расстояние, что не позволяет получить непосредственный доступ ккаждой машине; также администратор не может находиться на рабочем местепостоянно, тогда как неполадки могут возникнуть в любой момент. Кроме того,серверные компьютеры, к которым предъявляются повышенные требования надежностии безопасности, часто располагают в закрытых помещениях, доступ в которыеразрешен только специальному обслуживающему персоналу. Все это привело ксозданию ряда программных средств, служащих одной цели – возможностиосуществлять удаленное администрирование компьютера.
Одним из первых появилсяпрограммный продукт под названием telnet. Он состоял из клиентской и серверной частей и позволял клиентской частиподключаться к серверной, находящейся на удаленном компьютере. После этогопользователь получал в свое распоряжение так называемый виртуальный терминал –он мог набирать стандартные команды UNIX, которые затем транслировались через сеть на удаленный компьютер telnet-серверу, выполнялись, а результатывыполнения передавались обратно на клиентскую машину. Таким образом,осуществлялась удаленная работа с компьютером, аналогичная по функциональностинепосредственному доступу.
Основной проблемой даннойпрограммной системы являлась безопасность доступа. Авторизация пользователяосуществлялась стандартными средствами UNIX, что приводило к передачи по сетям в открытом видеинформации об учетных записях системы. Эта информация, в свою очередь, моглабыть перехвачена злоумышленниками и использована в целях вывода системы изстроя или получения над ней полного контроля.
Следующим шагом сталосоздание так называемой защищенной оболочки (secure shell или, сокращенно, ssh). Этот программный комплекс по своей структуре былпохож на telnet – также выделялись клиентская исерверная часть и пользователь получал в свое распоряжение виртуальный терминалпри подключении. Однако в данном случае при авторизации пользователяиспользовались уже не стандартные ученые записи UNIX, а собственная база данных пользователей, информацияо которых передавалась в зашифрованном виде. Шифровались также и команды,передаваемые на сервер, и ответная информация. Все это сделало удаленноеадминистрирование достаточно безопасным и привело к росту популярности ssh.
Однако все еще оставалосьнекоторое неудобство при работе с указанными вые программами – они не позволялиоперативно получать информацию о системе в удобном для восприятия виде. Дляполучения данных о состоянии системы необходимо было знать определенные командыоболочки UNIX, а также расположение структурданных, содержащих нужную информацию. Длительность процедуры подключения иполучения информации сделала неудобным постоянное наблюдение за состояниемсистемы и наложила высокие требования на квалификацию обслуживающего персонала.
Программа, разработаннаяв рамках курсового проекта, отчасти решает данную проблему. Она позволяетполучать доступ к информации о состоянии Linux-системы (как самой распространенной среди UNIX-систем) через сеть Интернет,предоставляя данные в удобочитаемом виде, что позволяет пользоваться программойне только персоналу с высокой квалификацией и детальным знанием внутреннегоустройства UNIX, но и обычным пользователям.
Функциональностьпрограммы может быть легко расширена – она использует динамически подключаемыемодули, что позволяет добавлять необходимые возможности без перезапуска самойпрограммы. Хотя изначально программа была предназначена для наблюдения засистемой, добавлением необходимых модулей можно обеспечить и возможностьвоздействия на систему.
Программа обеспечиваетвысокую безопасность подключения: для получения доступа к информации о системеиспользуется собственная база учетных записей, причем данные пользователяпередаются в зашифрованном виде. Кроме того, с помощью программы невозможноповредить удаленной системе, так как, в отличие от виртуального терминала, онапредоставляет доступ только к действиям, определенным администратором при настройкепрограммы.
Подключение к программе,находящейся на удаленном компьютере, может быть произведено из любойоперационной системы, в комплект которой входит Интернет-браузер,поддерживающий стандарты HTTP иHTML, в том числе из пользовательскихсистем, таких как Microsoft Windows и MacOS.
Таким образом,разработанная в рамках курсового проекта программа не претендует на рольполноценной замены традиционным виртуальным терминалам, однако предоставляетфункции, которые могут быть полезными при удаленном администрировании: быстроеполучение в удобочитаемом виде информации о состоянии системы, возможностьподключения к удаленной машине из любой операционной системы с установленнымИнтернет-браузером, а также возможность настройки и усовершенствования программыв соответствии с потребностями администратора.
1.Исследовательский раздел1.1 Постановка задачи
При разработке серверногопрограммного обеспечения необходимо учитывать ряд требований, которые могут неучитываться в процессе разработки пользовательских приложений. Это и повышенныетребования к устойчивости работы, и необходимость рассмотрения вопросабезопасности передачи данных, и наличие надежной системы ограничения доступа, иминимизация используемых программой ресурсов операционной системы.
В случае разработкисерверной программы наблюдения за состоянием Linux-системы был выделен ряд требований, которые впроцессе разработке в той или иной степени были удовлетворены:
· Должна бытьвозможность подключения к программе посредством программного обеспечения,установленного на большинстве компьютеров и самых разнообразных операционныхсистемах, например, Интернет-браузера; это приводит к тому, что программойдолжны в определенной степени поддерживаться распространенные протоколыпередачи данных;
· Программа должнаподдерживать возможность одновременного подключения нескольких клиентов; приэтом не должно быть взаимного влияния между частями программы, отвечающими заобработку запросов от различных клиентов: ошибка при работе с одним из клиентовне должна приводить к краху всей программы и не должна влиять на работу сдругими клиентами;
· Доступподключаемых пользователей к информации о системе должен быть ограничен спомощью механизма учетных записей, причем данные о пользователях должныхраниться в зашифрованном виде;
· Модули,использующиеся для получения информации о системе, должны быть динамическиподключаемыми с целью возможности добавлять новые модули, не прерывая работупрограммы и, тем более, без ее повторной компиляции;
· Программа должнасоответствовать стандарту POSIXи использовать только стандартные библиотеки, входящие в состав большинства UNIX-систем.1.2 Передача данных1.2.1Протоколы передачи данных
Протоколом передачиданных называется ряд правил и утверждений, предназначенных для созданияунифицированного интерфейса между взаимодействующим программным обеспечением.Это позволяет разрабатывать приложения, взаимодействие между которымиопределяется не операционной системой, под управлением которой они работают, апротоколами, учтенными при разработке.
Все современные протоколыпередачи данных классифицированы организацией ISO на уровни, в результате чего появилось понятие моделиOSI (open systems interconnection – соединение открытых систем).Согласно этой модели, существует семь уровней рассмотрения передачи данных:
1. Физический (physical) – представлен линиями связи икоммуникационным оборудованием.
2. Связи (datalink) – представлен драйверами сетевогооборудования и программным обеспечением нижнего уровня.
3. Сетевой (network) – представлен протоколами IPv4 и IPv6.
4. Транспортный (transport) – представлен протоколамитранспортного уровня, такими как TCP, UDP, ICMP и другими.
5. Сеансовый (session) – представлен программнымисредствами, поддерживающими сеансы связи.
6. Представленияданных (presentation) – представлен программнымисредствами, обеспечивающими независимость интерпретации данных от используемойсистемы.
7. Прикладной (application) – представлен множествомпротоколов, направленных на передачу определенных данных – файлов,гипертекстовых документов и т.д. К этим протоколам относятся HTTP, FTP, SMTP идр.
Приложения, как правило, не используют прямоеобращение к программным средствам, реализующим протоколы нижних уровней –вплоть до сетевого. Для протоколов транспортного уровня в современныхоперационных системах предусмотрены специальный интерфейс – сокеты.
Наиболее распространенныепротоколы и взаимосвязь между ними отображены на рисунке 2.1.
/> 1.2.2 Протокол TCP
При разработке программыосновным протоколом передачи информации был выбран протокол транспортногоуровня – TCP (Transmission Control Protocol – протокол контроля передачи). Этотпротокол является надстройкой над протоколом IP и предоставляет некоторую дополнительную функциональность:
· Протоколобеспечивает надежную передачу данных, осуществляя, если необходимо повторнуюотправку или прием пакетов, делая это прозрачно для приложения, в отличие отпротокола IP;
· Последовательностьполучения пакетов строго контролируется: пакеты приходят в том же порядке, вкаком и были отправлены; эта особенность отличает TCP от дейтаграммных протоколов, таких как UDP;
· Протокол TCP имеет принятый в большинствеоперационных систем программный интерфейс, называемый сокетами (sockets), что сильно упрощает его применениепри разработке приложений.
Протокол TCP имеет долгую историю – он былразработан Министерством обороны США для создания ее внутренней оборонной сети ARPAnet и изначально предназначался дляобъединения приложений в составе разнородной вычислительной среды. Впервые протокол был реализован университетом Беркли воперационной системе BSD4.2.В силу популярности этой системы протокол быстро распространился на остальные UNIX-системы и фактически стал основойсовременной сети Интернет, а также большинства локальных сетей. Несмотря на свои преимущества по сравнению с протоколом IP, TCP имеет и свои негативные стороны – он крайнетребователен к вычислительным ресурсам компьютера в силу того, что потокбайтов, которым оперирует программа, при передачи посредством TCP разбивается на множество пакетов,каждый из которых может быть отправлен несколько раз, до тех пор, пока не будетполучен ответ о его приеме. Кроме того, гибкая система адресации требуетналичия в сети специализированных серверов, таких как DNS, DHCP идругих.1.2.3Протокол HTTP
Протокол HTTP (HyperText Transfer Protocol – протокол передачи гипертекста) –это протокол уровня приложения, осуществляющий связь приложений в пределахраспределенных, совместных или разнородных информационных систем. Протоколпозволяет приложениям обмениваться данными, представленными в понятном длявосприятия человеком виде.
Как следует из егоназвания, первоначально HTTPпредназначался для передачи между приложениями так называемого гипертекста (hypertext), представляющего собой особый видданных, созданный в соответствии со стандартом HTML (HyperText Markup Language – язык разметки гипертекста).Гипертекстовый документ состоит из данных, размеченных с помощью тегов (tag) языка HTML, и представляет собой комбинацию текста, изображений,гиперссылок и прочих средств представления данных. Гиперссылки – одна изважнейших составляющих HTML-документа– представляют собой интерактивные области, воздействие на которые приводит кполучению связанных с гиперссылкой данных. Это позволяет пользователю,работающему с гипертекстовой информацией, осуществлять навигацию в пределахнабора документов или даже всей сети Интернет, получая интересующую егоинформацию с помощью контекстных гиперссылок.
Протокол HTTP является надстройкой над протоколом TCP и является средством контроля содержанияпередаваемых данных. В отличие от TCP, который не учитывал структуру передаваемых пакетов, HTTP внедряет в данные метаинформацию,позволяющую получателю корректно интерпретировать полученные данные. На основе HTTP функционирует глобальная сеть Интернет(называемая также World Wide Web или WWW).Первая версия протокола – HTTP/0.9– обладала достаточно ограниченными возможностями, но с активным развитиемвсемирной сети появились новые версии: HTTP/1.0 и HTTP/1.1,позволяющие контролировать передачу по вычислительным сетям не толькогипертекстовой информации, но и произвольные бинарные файлы: звуковые,графические, архивные и пр.
В силу того, что HTTP является надстройкой над протоколом TCP, при передачи данных такжевыделяются две стороны: клиент и сервер.
Клиент являетсяинициатором соединения и запрашивает у сервера некоторые данные или услуги.Клиентом, как правило, является программа, называемая браузером (browser), позволяющая как отображатьгипертекстовую информацию, так и принимать файлы иных форматов. Чтобы получитьнекоторую интересующую информацию, клиент посылает серверу запрос (request), содержащий описание запрашиваемойинформации.
Сервер при передачеданных через HTTP называют веб-сервером (web-server). Эта программа осуществляет обработку запросов отклиентов, передавая запрошенные данные в виде ответов (response), содержащих помимо искомых данныхметаинформацию, их описывающую.
Получение пользователеминтересующих его данных состоит из следующих этапов:
1. Пользовательвводит в строке браузера адрес интересующего его ресурса.
2. Браузер на основеинформации, полученной от пользователя, а также учитывая свои настройки иконфигурацию операционной системы, формирует запрос.
3. Браузерподключается к серверу, расположенном, возможно, на удаленном компьютере, ипередает ему запрос.
4. Сервер,анализируя запрос, выполняет необходимые действия: формирует ответ, включая внего тело запрошенного документа. Если это гипертекстовый документ, онзагружается из файла или же генерируется динамически посредством сценария. Вответ также включается информация о содержащихся в нем данных.
5. Сервер передаетответ браузеру.
6. Браузеранализирует ответ и либо сохраняет полученные данные в файл, либо, в случаегипертекстового документа, анализирует теги HTML и отображает документ на экране.
Следует заметить, что клиентской программой может бытьне только браузер, тем не менее, все шаги, за исключением, может быть, первого,выполняются в любом случае.
Следует заметить, чтоздесь рассматривается непосредственное подключение клиента к серверу,содержащему интересующую информацию, однако, это не всегда возможно в силуразличных обстоятельств. В таком случае подключение может осуществлятьсяпосредством одной или более промежуточных точек подключения. Можно разделить этипромежуточные точки на три группы:
· Прокси-серверы (proxy-server) – программа-посредник, выполняющая функции какклиента, так и сервера с целью создания запросов от имени других клиентов.Запросы обслуживаются прокси-сервером, или пересылаются им с внесением в нихизменений (в этом случае прокси-сервер называется непрозрачным) или безизменений (в этом случае прокси-сервер называется прозрачным). Прокси-серверпозволяет группе компьютеров выступать в качестве одного клиента, что частоприменяется при подключении к Интернету локальных сетей.
· Шлюз (gateway) – как и прокси-сервер, осуществляеттрансляцию запросов, однако, не подвергаю их изменению. Шлюз получает отклиента запрос, как к серверу, содержащему искомый ресурс. Таким образом,клиент не может определить, подключается ли он через шлюз или непосредственно ксодержащему ресурс серверу.
· Туннель (tunnel) – программа-посредник,поддерживающая соединение. Хотя после установки соединения туннель нерассматривается в качестве элемента передачи через протокол HTTP, соединение, как правило,инициируется именно HTTP-запросом.Туннель прерывает свою работу, если хотя бы один из участников обмена даннымизакрывает соединение.
Для сохранения функциональности передачи данных приподключении через промежуточные точки не требуется внесения изменений в запросыи ответы, за исключением случая прокси-сервера: в этом случае в клиентскомзапросе должны содержаться дополнительные поля. Однако, с точки зрения сервера,обмен данными производится непосредственно с клиентом, следовательно, никакихизменений в запросах не происходит. Поэтом при разработке программы возможностьподключения через промежуточные точки не учитывалась.
Запрос, отправляемыйклиентом серверу, служит для точной идентификации запрашиваемого ресурса, атакже содержит сведения, необходимые для корректной обработки запроса.
По своей структуре запроссостоит из трех частей:
· Строка запроса
· Блок заголовков
· Объект
Строка запроса состоит изтрех полей, разделенных символами пробела (ASCII-код 20h,далее SP), и заканчивается комбинацией издвух символов: возврат каретки (ASCII-код0Dh, далее CR) и перевод строки (ASCII-код 0Ah, далее LF). Элементы строки запроса представлены следующими полями:
· Метод (method) – определяет метод обработки,применяемый к запрашиваемому ресурсу. В зависимости от указанного метода форматзапроса может быть различным. Допустимые методы:
o OPTIONS
o GET
o HEAD
o POST
o PUT
o DELETE
o TRACE
При разработке программыбыла введена поддержка только метода GET, в силу того, что именно этот метод браузер указывает в запросе,создаваемом по умолчанию.
· URI (Universal Resource Identifier) ресурса (resource URI) – указывает местоположение запрашиваемого ресурса встандартизованном формате, то есть является адресом ресурса. При использованииметода GET данная строка может включать в себянабор параметров, передаваемых серверу в виде строк формата «имя_параметра =значение_параметра», разделенных символами амперсанда ‘&’. Блок параметровнаходится в конце строки URI иотделяется от адреса символом вопросительного знака ‘?’.
· Версия протокола HTTP – при разработке программы былареализована поддержка приема запросов, соответствующих версиям 1.0 и 1.1,которым соответствуют строки «HTTP/1.0»и «HTTP/1.1» соответственно.
Блок заголовков, следующий за строкой запроса, можетсостоять из одного или более заголовков:
· Заголовок запроса– содержит поля, служащие модификаторами запроса и содержащие информацию озапросе и о конфигурации клиентской машины.
· Заголовок объекта– в случае, если запрос включает в себя некоторый объект (произвольный наборданных), поля этого заголовка описывают объект, указывая его формат, кодировкуи другие параметры.
· Общий заголовок –содержит служебные параметры, необходимые для обеспечения корректности передачии включения дополнительных услуг, таких, как кэширование.
Раздел заголовковоканчивается двумя парами символов CR и LF, что позволяет легко определить фактокончания приема запроса в силу того, что сам запрос подобную комбинациюсимволов содержать не может.
Ответ, отправляемыйсервером клиенту, может быть создан только в результате обработки клиентскогозапроса. Он содержит описание результатов выполнения запроса и, если былизапрошены данные, включает в себя запрошенный ресурс.
По своей структуре ответсостоит из следующих частей:
· Строка состояния
· Блок заголовков
· Объект
Строка состояния состоитиз трех полей, разделенных символами SP, и содержит в конце последовательность символов CR, LF. Элементыстроки состояния:
· Версия протокола HTTP – разработанная программа всегдаиспользует строку «HTTP/1.1».
· Код состояния (status code) – трехсимвольный цифровой код, которыйидентифицирует результат выполнения запроса. Хотя стандартом определендостаточно большой набор кодов состояния, в программе используются следующиекоды:
o 200 – успешноевыполнение;
o 400 –некорректный запрос;
o 401 –несанкционированный доступ;
o 404 – ресурс ненайден;
o 405 –неприменимый метод;
o 505 –неподдерживаемая версия HTTP.
· Фраза состояния (reason phrase) – короткая фраза, поясняющая код состояниявыполнения запроса. Стандартом предложен стандартный набор фраз, однако впрограмме этот набор был несколько модифицирован.
Блок заголовков, следующий за строкой состояния, можетсостоять из одного или более заголовков:
· Заголовок запроса
· Заголовок объекта
· Общий заголовок
Подробное рассмотрение заголовков было произведено вп. 2.2.3.3.
Раздел заголовков оканчивается двумя парами символов CR и LF, после чего следует произвольный набор символов – объект.При работе программы такими объектами могут являться только гипертекстовыедокументы в формате HTML, динамическигенерируемые подключаемыми модулями.1.3 Системная информация ОС Linux1.3.1Расположение системной информации
Всю системную информацию об операционной системе Linux можно разделить на две группы – по признакурасположения этой информации в системе:
1. Статическаяинформация – к этой группе можно отнести все текстовые конфигурационные файлы,оказывающие влияние на процесс загрузки системы, функционирование ее компонент.Подобная информация, как правило, расположена в каталоге /etc и его подкаталогах.
2. Динамическаяинформация – описывает текущее состояние системы. Подобная информация можетбыть получена чтением контекста памяти ядра операционной системы; доступ к этойинформации осуществляется через файловую систему /proc (см. п. 2.3.2).
Методы получения информации можно также разделить нанесколько групп по способу организации взаимодействия с системой:
1. Чтение файлов конфигурациии файлов, расположенных в /proc,с помощью системных вызовов.
2. Вызов системныхутилит, предоставляющих соответствующую информацию.
3. Получениеинформации посредством выполнения специальных системных вызовов.1.3.2Файловая система /proc
Как было указано в п. 2.3.1, для получениядинамической информации о системе необходимо получить доступ к контексту памятиядра. В операционной системе Linuxпамять ядра отображается на устройство /dev/kmem. Однако, чтение непосредственно изэтого устройства может представлять достаточно большую сложность в силу того,что возникает необходимость знать расположение структур данных в памяти ядра. Вранних версиях UNIX-систем доступк информации осуществлялся именно так.
Впоследствии был предложен механизм доступа кструктурам памяти ядра, который существенно облегчал получение системнойинформации: большинство структур данных были отображены в файлы и каталоги,составляющие иерархию, фактически существующую в структурах данных ядра. Все этифайлы и каталоги были объединены в специальную файловую систему — /proc.
Адреса структур данных ядра заносятся в /proc на этапе компиляции системы. Соответственно,программы, обращающиеся к /proc,должны учитывать возможность ее модификации при установке более новой версииядра с, возможно, измененной структурой /proc.
Обращение к файловой системе /proc происходит тем же путем, что и к обычной дисковойфайловой системе – с помощью системных вызовов read() и write(). Следует, однако, заметить, что /proc не связана с каким-либо физическим устройством:содержимое файлов /proc генерируется непосредственно причтении этих файлов, что приводит к невозможности определить их размер обычнымисредствами, а попытка узнать время создания и модификации любого файла приведетк получению текущего времени.
Некоторые файлы системы /procмогут быть использованы и для записи в них данных для изменения состояниясистемы, однако эта возможность не предусматривалась при разработке программы.
Файловая система /proc содержит по одномукаталогу для каждого выполняющегося в данный момент процесса. Именем каталогаявляется идентификатор процесса; в некоторых UNIX-системах идентификатор дополняется нулями дляпридания именам каталогов процессов одинаковой длины, однако, в ОС Linux подобные действия не производятся.
Каталоги процессов динамически создаются иуничтожаются по мере запуска и завершения соответствующих процессов. В каждомкаталоге имеются файлы, предоставляющие доступ к различной информации опроцессе.
Каждый каталог процесса содержит следующие файлы:
· cmdline – содержит список аргументов,переданный процессу при запуске; первым аргументом является имя исполняемогофайла; в случае, если процесс выгружен (например, находится в состоянии зомби),файл будет пуст;
· cwd – является символической ссылкой натекущий рабочий каталог процесса;
· environ – содержит переменные средыпроцесса;
· exe – является символической ссылкой наисполняемый файл процесса; ее чтение является практически единственным способомопределить каталог, содержащий исполняемый файл;
· fd – подкаталог, содержащийсимволические ссылки на файлы, открытые процессом;
· maps – содержит информацию о файлах,отображаемых в адресном пространстве процесса; к числу отображаемых файловотносится исполняемый файл процесса, а также загруженные библиотеки;
· root – является символической ссылкой накорневой каталог процесса;
· stat – содержит статистическую информациюо процессе;
· status – содержит те же данные, что и stat, но в отформатированном виде.
Из соображений безопасности права доступа к некоторымфайлам каталогов процесса предоставлены только владельцу процесса илисуперпользователю.
В файловой системе /proc естьдополнительный элемент, позволяющий программам находить информацию о своемсобственном процессе. Файл /proc/self является символической ссылкой на каталог,соответствующий текущему процессу. Разумеется, содержимое ссылки зависит оттого, какой процесс к ней обращается.
Информация об аппаратуре, установленной на компьютере,может быть получена из следующих файлов файловой системы /proc:
· /proc/cpuinfo – содержит информацию о центральном процессоре (илипроцессорах, если их больше одного); файл содержит информацию вотформатированном виде; помимо указания модели процессора, файл содержитуказание доступных процессорных функций, таких как расширенные инструкции MMX;
· /proc/devices – содержит список старших номеров всех символьных иблочных устройств, установленных в системе;
· /proc/pci – содержит информацию обо всех устройствах,подключенных к шине PCI, включаяустройства, встроенные в материнскую плату;
· /proc/ide – каталог, содержащий файлы, которые описываютустройства, подключенные к шинам IDE и SCSI.
· /proc/net/dev –содержит информацию о сетевых платах и их конфигурации.
Информация о конфигурации и состоянии ядра системыпредставлена в следующих файлах:
· /proc/version – содержит строку, описывающую номер версии имодификации ядра; в нее также включена дополнительная информация: имяпользователя, осуществившего компиляцию, дата компиляции и версия компилятора;
· /proc/meminfo – хранит сведения об использовании системной памяти;указываются данные как о физической памяти, так и об области подкачки;
· /proc/modules – полный список установленных модулей ядра втекстовом виде.
Информация о файловых системах представлена следующимифайлами:
· /proc/filesystems – список файловых систем,поддерживаемых ядром;
· /proc/mounts – содержит перечень смонтированных файловых систем;каждая строка файла содержит имя устройства, имя точки монтирования, типфайловой системы и флаги монтирования.
2.Технологический раздел2.1 Выбор языка программирования
В настоящее время в UNIX-подобных операционных системах представлено большоеколичество самых разнообразных языков программирования, каждый из которыхобладает своими преимуществами. При разработке программы был выбран язык C и соответствующий ему компилятор изпакета gcc (GNU compilers collection) по следующим причинам:
· В силу того, чтосамо ядро операционной системы написано на языке C, компилятор языка, входящий в состав пакета gcc, постоянно обновляется иисправляется, что практически исключает ошибки при компиляции с его стороны; всвою очередь, это приводит к генерации наиболее оптимизированного кода;
· Язык C предполагает использование простыхконструкций, что выгодно отличает его от остальных языков, особенноинтерпретируемых и объектно-ориентированных, с точки зрения скорости выполненияпрограмм;
· Язык C предоставляет программисту наиболееполный доступ ко всем возможностям программного интерфейса POSIX, что позволяет наиболее эффективноорганизовывать взаимодействие программы с операционной системой.2.2. Программные средства2.2.1Потоки
Разработанная программа имеет возможность параллельнойобработки запросов от нескольких клиентов. Это достигнуто за счет использованияболее чем одного потока управления, осуществляющих обработку запросов.
Потоки в системе Linux реализуются посредством программного интерфейса,предоставляемого входящей в состав Linux библиотеки потоков libpthread.
Создание потока разбивается на несколько этапов:
1. Описание функции,которая будет выполняться в рамках потока. Эта функция не должна содержатьстатических переменных.
2. Создание экземпляраописателя атрибутов потока – структуры типа pthread_attr_t, – и заполнение ее полей всоответствии с необходимыми свойствами создаваемого потока.
3. Созданиепеременной типа pthread_t, которая будет служитьидентификатором создаваемого потока.
4. Создание потока спомощью функции pthread_create(), в которую передается указатель на идентификатор потока,указатель на описатель атрибутов потока, а также адрес поточной функции и ееаргумент.
После создания поток выполняется параллельно состальными потоками процесса и завершает свою работу при выполнении в поточнойфункции оператора return илипринудительном завершении извне.2.2.2Семафоры и мьютексы
Для обеспечения безопасности доступа выполняющихсяпотоков к разделяемым переменным, коими являются, например, переменныесостояния систем журналирования и безопасности, используется механизмвзаимоблокировки потоков с помощью объекта ядра – мьютекса.
Мьютекс представляет собой переменную типа pthread_mutex_t, ккоторой применимы две операции:
· pthread_mutex_lock –захват мьютекса; при применении этой операции к захваченному другим потокоммьютексу вызвавший поток блокируется до освобождения мьютекса.
· pthread_mutex_unlock– освобождение мьютекса.
Для контроля числа одновременно обслуживаемых запросовв серверном модуле применяется объект ядра – семафор.
Семафор представляет собой переменную типа sem_t, к которой применимы две основных операции:
· sem_wait – уменьшает на 1 текущее значение семафора; еслитекущее значение равно 0, поток блокируется;
· sem_post – увеличивает на 1 значение семафора.
Начальное значение семафора задается при егоинициализации с помощью функции sem_init().2.2.3Сокеты
Сокет представляет собой объект, предоставляющийпрограммный интерфейс к протоколу TCP/IP и являющийся конечной точкойподключения. Использование сокета ничем не отличается от использования операцийввода-вывода применительно к файловому дескриптору – к сокету применяются те жефункции read() и write(), что и при файловом вводе-выводе.Существуют, однако, специфические функции send() и recv(), расширяющие функциональность стандартных read() и write(), но их использование не являетсяобязательным.
Перед началом процесса передачи данных через сокетнеобходимо совершить ряд действий:
1. Создатьпеременную типа int, которая будетвыступать в качестве дескриптора сокета.
2. Создать описательадреса сокета – структуру типа sockaddr_in, – и заполнить ее поля всоответствии с адресом и портом, через которые планируется устанавливатьсоединение.
3. Создать объект«сокет» с помощью функции socket(). Значение, возвращенное функцией,присваивается дескриптору сокета.
4. Привязать сокет кадресу и порту с помощью функции bind().
5. Начатьпрослушивание адреса и порта на предмет входящих соединений с помощью функции listen().
6. Приниматьсоединения с помощью функции accept().
Следует заметить, что процедура инициализацииклиентского сокета выполняется несколько иначе и не рассматривалась в силутого, что разработанная программа не выступает в качестве клиента.2.2.4Сигналы
Контроль сигналов используется в программе дляпрекращения работы сервера. При поступлении определенного сигнала обнуляетсяпеременная-условие, в результате чего цикл приема сообщений прерывается.
Установка некоторой функции в качестве обработчикасигнала производится следующим образом:
1. Определениефункции – обработчика сигнала.
2. Создание изаполнение описателя параметров обработчика – структуры типа sigaction. Одно из полей описателя содержитадрес функции-обработчика.
3. Назначениеобработчика сигнала с помощью функции sigaction().2.3 Структура модулей программы
Для достижения наибольшей эффективности работыпрограммы, возможности контроля исключительных ситуаций и легкости внесениямодификаций, при разработке программы применялись элементы концепцииструктурного программирования, что привело к необходимости выделять рядмодулей, содержащих функции, сгруппированные по выполняемым ими задачам.
Все модули программы можно разделить на несколькогрупп:
· Системаинициализации – обеспечивает настройку всех систем и запуск сервера.
· Сервер –обеспечивает настройку сетевых средств, принятие входящих подключений ипередачу данных.
· Системауправления подключаемыми библиотеками – предоставляет серверному модулюинтерфейс загрузки динамических библиотек и выполнения содержащихся в нихфункций.
· Системажурналирования – предоставляет всем модулям интерфейс для записи событий вовнешний файл (журнал).
· Система безопасности– обеспечивает управление учетными записями и проверку авторизациипользователя.
· Динамическиебиблиотеки – подключаются во время работы программы по запросам и реализуютполучение системной информации.
· Дополнительныемодули – содержат вспомогательные функции.
Системы и их взаимодействие представлены на рисунке3.1:
Рис. 3.1 />
2.3.1Система инициализации
Система инициализации предназначена дляконфигурирования программы и запуска сервера. С нее начинается выполнениепрограммы в силу того, что она включает в себя функцию main().
При разработке программы были определены следующиепараметры:
· LogMode – режим журналирования, можетпринимать значения short (краткийрежим журналирования) и verbose(вывод расширенных сообщений).
· LogDir – каталог, в который будет осуществлятьсязапись журнальных файлов.
· Address – адрес в формате xxx.xxx.xxx.xxx, который будет использован дляпривязки серверного сокета.
· Port – номер порта, который будетиспользован для привязки серверного сокета.
· MaxClients – максимальное число одновременнообслуживаемых клиентов.
· AccountFile – путь к файлу, содержащему учетныезаписи пользователя.
· ModulesDir – каталог, содержащий подключаемыемодули (в виде динамических библиотек).
Система инициализации производит трехшаговую установкупараметров:
1. Устанавливаютсязначения по умолчанию.
2. Загружаютсязначения из файла конфигурации.
3. Загружаютсязначения из аргументов командной строки.
Каждый последующий шаг имеет приоритет над предыдущим;это означает, что если для параметра существует строка в файле конфигурации, тобудет учитываться значение, загруженное из файла конфигурации; а если значениепараметра указано еще и в командной строке, то будет использовано именно оно.
После определения значений параметров системаинициализации производит настройку соответствующих систем (сервера, системыжурналирования и системы безопасности) через предоставляемый ими интерфейс.
Система инициализации также осуществляет настройкуобработчика сигнала SIGINT (см. п.3.2.2) в целях возможности корректно прервать работу сервера. Для этогосоздается переменная типа int,изначально содержащая значение 1. При возникновении сигнала функция обработкиосуществляет сброс переменной в 0, тем самым делая условие цикла приемаподключений ложным, что приводит к выходу из цикла и завершения работы сервера.2.3.2Сервер и система управления динамическими библиотеками
Серверная система является центральной системойпрограммы и обеспечивает серверные функции: инициализацию сетевых средств,организацию приема входящих подключений, проверку корректности запроса и т.д.
Действия, выполняемые сервером, можно описатьследующим образом:
1. Создание инастройка серверного сокета.
2. Прием входящегоподключения.
3. Создание потока,который будет обрабатывать запрос.
Пункты 2 и 3 повторяются в течение всего времениработы сервера.
Поток, обрабатывающий запрос, выполняет следующиедействия:
1. Принимает запросот клиента.
2. Проверяеткорректность запроса.
3. В случаекорректного запроса обращается к системе безопасности для подтверждениядоступа.
4. В случаеразрешения доступа обращается к системе управления динамическими библиотеками,передав ей имя запрошенного модуля.
5. Системауправления динамическими библиотеками загружает соответствующую библиотеку ивыполняет хранящуюся в ней функцию генерации.
Работа сервера продолжается до тех пор, пока не равнанулю переменная, адрес которой был передан серверному модулю при старте. Этапеременная обнуляется при получении процессом сигнала SIGINT (соответствующего комбинации Ctrl+C наклавиатуре). Использование сигналов описано в п. 3.2.4.2.3.3Система журналирования
Система журналирования обеспечивает запись вжурнальный файл ключевых событий, происходящих во время работы сервера. Вжурнал событий записывается информация о следующих событиях:
· Старт сервера – суказанием адреса и порта привязки.
· Входящееподключение – с указанием адреса клиента.
· Авторизацияклиента.
· Запрос модуля.
· Сообщения оразнообразных ошибках в работе сервера.
Система журналирования самостоятельно генерирует имяфайла на основании текущей даты: журнальные файлы имеют имена вида dd-mm-yyyy.log.
Для защиты своих статических данных система используетмьютекс (см. п. 3.2.2), что приводит к монополизации доступа потоков к системе.Это может несколько замедлить работу, однако разработанное приложение неявляется критичным ко времени, поэтому возникающие задержки вполне допустимы.
Система безопасности служит для проверки возможностидоступа клиента к каким-либо модулям сервера.
Система безопасности может функционировать в двухрежимах:
· Режим проверкидоступа – сервер передает системе имя пользователя и пароль, которые онапытается найти в файле учетных записей. В случае нахождения совпадения доступпредоставляется, в противном – не предоставляется.
· Режимпредоставления доступа – в этом случае доступ предоставляется для всех клиентовнезависимо от указанных имени и пароля. Используется только для тестированиясервера.
Режим работы системы и адрес файла с учетными записямимогут быть заданы в конфигурационном файле.
Система безопасности, как и система журналирования,использует мьютекс (см. п. 3.2.2) для защиты доступа к своим статическимпеременным.2.4 Динамические библиотеки
Динамические библиотеки, подключаемые серверныммодулем во время работы программы, реализуют функциональные возможностипрограммы. Функции, содержащиеся в этих библиотеках, служат для полученияразнообразной системной информации и выдачи ее в HTML-формате клиенту (браузеру).
В следующих подразделах рассматриваются разработанныевместе с программой библиотеки, их назначение и применяемые при разработкесредства.2.4.1PROCESSES – информация опроцессах
Эта динамическая библиотека служит для получения информацииобо всех процессах, существующих в данный момент в системе. Для каждогопроцесса выводится следующая информация:
· Идентификатор (PID) процесса – получается путем чтениясписка каталогов файловой системы /proc и выбора техиз них, название которых состоит только из цифр. В этом случае имя каталога ибудет являться идентификатором процесса.
· Имя исполняемогофайла – считывается из файла statкаталога процесса в /proc.
· Состояниепроцесса – считывается из файла statusкаталога процесса.
· Имя владельцапроцесса – получается с помощью функции stat(), примененной к каталогу процесса. Имя владельца процесса совпадает сименем владельца каталога процесса.
· Имя группывладельца процесса – аналогично имени владельца процесса, получается с помощьюфункции stat().
· Размеррезидентной части процесса – считывается из файла statm из каталога процесса.
Результаты работы динамической библиотеки отображаютсяв клиентском браузере в виде таблицы.2.4.2MEMINFO – информация осистемной памяти
Результат работы этой динамической библиотекипредставляет собой таблицу, содержащую информацию о распределении системнойпамяти. Среди ключевых полей таблицы можно отметить:
· Общее количестводоступной физической памяти.
· Размер свободнойчасти памяти.
· Размер памяти,разделяемой между процессами.
· Количествобуферов ввода-вывода.
· Информация обобласти подкачки.
Предоставляемая информация извлекается из файла /proc/meminfo. 2.4.3 DISKFREE– информация о свободном месте на дисках
Данная динамическая библиотека отображает в видетаблицы информацию о смонтированных в данный момент дисковых файловых системах,а также информацию о доступном и свободном пространстве на дисках.
Информация получается с помощью команды оболочки fd (файл /bin/fd). Для того, чтобы перенаправитьданные, выдаваемые при выполнении команды, используется дублирование процесса спомощью функции fork() и загрузка в адресное пространствопорожденного процесса данных программы fd с помощью функции execv(). Выводинформации в дескриптор сокета вместо вывода на консоль осуществляетсяотображением потока данных, выводимых в стандартный поток вывода, на дескрипторсокета с помощью функции dup2().2.4.4NETWORK – информация о сетевыхустройствах
Данная динамическая библиотека позволяет получитьстатистические данные о работе сетевых устройств (сетевых интерфейсов),установленных в системе. Для каждого устройства выводится следующая информация:
· Количествопринятых и отправленных байтов и пакетов.
· Количествовозникших за время приема и передачи ошибок.
· Количествопотерянных при приеме и передаче пакетов.
· Количествоколлизий при передаче.
Информация получается посредством анализа файла /proc/net/dev, содержащего подробную статистическуюинформацию о сетевых устройствах. Некоторая информация, полученная из файла, неучитывалась, так как не представляет большой ценности для системногоадминистратора.2.4.5VERSION – версия операционнойсистемы
Данная динамическая библиотека отображает в окнебраузера версию операционной системы, под управлением которой работает сервер.Информация о версии системы получается из файла /etc/issue.
Данная информация может оказаться полезной приадминистрировании нескольких систем одним администратором – для однозначнойидентификации наблюдаемой системы.2.4.6INDEX – страница помощи
Данная динамическая библиотека отображает в браузерестраницу, содержащую правила подключения к серверу, формат адресной строки,интерпретацию сообщений об ошибках. Также отображается список доступных модулейс их характеристикой.
Эту страницу пользователь получит, явно указав имямодуля «index», или в случае отсутствия указанияимени модуля. Однако, в случае работы системы безопасности в режиме проверкидоступа и указания пустого имени модуля будет выдана страница ошибкиавторизации, а не страница помощи.2.5 Использование программы2.5.1Настройка сервера
Конфигурирование систем программы может бытьосуществлено одним из трех способов:
· Установказначений по умолчанию – параметры всех систем устанавливаются по умолчанию;значения параметров по умолчанию устанавливаются на этапе компиляции программы.
· Загрузкаконфигурации из файла – все параметры загружаются из файла, состоящего из строквида «имя_параметра=значение». Для хранения параметров используется файл linspy.conf, находящийся в одном каталоге с исполняемым файломпрограммы.
· Установказначений из командной строки – в этом случае параметры системы устанавливаютсяв соответствии с переданными аргументами командной строки.
Последний способ наиболее удобен для быстрогоизменения настроек сервера. Все опции командной строки, поддерживаемыепрограммой, представлены в таблице 3.1:
Таблица 3.1
Опция командной строки
Пояснение -h, --help программа выводит описание опций командной строки и завершается; -m dir, --moddir dir устанавливает каталог загрузки динамических библиотек равным dir; может быть использовано для быстрой смены набор библиотек; -v, --verbose включает расширенный режим ведения журнального файла -s mode, --security mode включает или выключает режим проверки доступа в зависимости от значения mode; если mode=“on”, проверка доступа включается, а если mode=“off” – выключается; -a ip, --addr ip устанавливает адрес привязки серверного сокета равным ip; -p num, --port num устанавливает порт привязки серверного сокета равным num; -d, --daemon программа загружается в фоновом режиме (режиме демона). 2.5.2Доступ к серверу
Доступ к серверу через браузер предусматривает знаниепользователем адреса и порта привязки сервера, а также, в случае работы системыбезопасности в режиме проверки доступа, имени пользователя и пароля, которыеприсутствуют в файле учетных записей.
Например, при обращении к модулю «somemodule» при подключении к серверу,привязанному к адресу 123.123.123.123 и порту 8080, при включенной системебезопасности, зная имя пользователя – «mylogin» – и пароль – «mypassword» – строка адреса, которая должнабыть введена в браузере, будет выглядеть следующим образом: 123.123.123.123:8080/somemodule?login=mylogin&password=mypassword
В случае отключенной системы безопасности строкаизменится: 123.123.123.123:8080/somemodule
При возникновении какой-либо ошибки при обработкезапроса – как со стороны корректности запроса, так и со стороны возможностивыполнить запрошенные действия – в окно браузера выдается сообщение об ошибке.
Ошибка может возникнуть в одной из следующих ситуаций:
· Полученныйсервером запрос некорректен – указана неверная версия протокола HTTP, неподдерживаемый метод или самаструктура запроса содержит ошибки.
· Запрошенныймодуль не может быть найден, либо он поврежден.
· Указанные имяпользователя и пароль недействительны.2.5.3Завершение работы сервера
Завершение работы сервера возникает в результатеприема серверным процессом сигнала SIGINT, соответствующего нажатию клавиатурной комбинации Ctrl+C. Однако, если сервер запущен в фоновом режиме (режимедемона), воздействие на него с помощью клавиатуры не представляется возможным.В этом случае следует послать процессу сигнал с помощью команды оболочки kill или killall:
· kill –INT pid, в этом случае необходимо знать PID запущенного процесса;
· killall –INT linspy – здесь поиск процесса ведется по имени исполняемогофайла.
Вторая команда включена в файл shutdown.sh, представляющий собой сценарий оболочки и завершающий работупрограммы.
В случае принудительного завершения работы программы,например, с помощью сигнала SIGKILL,серверный сокет не будет закрыт корректно, что приведет к невозможностинекоторое время привязаться к тем же адресу и порту, к которым осуществляласьпривязка до этого. Кроме того, может возникнуть искажение записываемых вжурнальный файл данных – некоторые сообщения могут оказаться потерянными.
Заключение
Разработанная программа позволяет удаленно наблюдатьза состоянием компьютера, работающего под управлением операционной системы Linux. В программе реализована частичнаяподдержка протокола HTTP/1.1, чтопозволяет подключиться к ней с помощью браузера, работающего под управлениемлюбой современной операционной системы. Также программа с минимальными изменениямиможет быть перенесена на большинство современных UNIX-подобных систем в силу того, что при разработкеиспользовались исключительно средства API POSIX.
Программа полностью удовлетворяет требованиямтехнического задания, обеспечивая:
· Возможность гибкойнастройки программы, в том числе ее привязка к любому адресу и порту.
· Возможностьодновременной обработки запросов от удаленных клиентов за счет использованиямеханизма многопоточности.
· Возможностьограничения количества одновременно обрабатываемых запросов.
· Обеспечениебезопасности за счет необходимости указывать имя пользователя и пароль приподключении к серверу; программа использует собственный файл учетных записей.
· Возможностьподключения с помощью любого браузера, поддерживающего протокол HTTP/1.0 или HTTP/1.1.
Хотя для решения административных задач уже существуютготовые программные решения, а в качестве HTTP‑сервера в среде Linux, как правило, используется сервер Apache, разработанная программа имеет передними определенные преимущества:
· Скорость работы,обеспечиваемая небольшим размером программы и простотой логики ее работы.
· Простота доступак системной информации Linux.
· Удобочитаемостьполучаемой информации, что не накладывает требований на квалификациюпользователя.
Список использованнойлитературы
1. M.Mitchel,J.Oldham, A.Samuel Advanced Linux Programming / Indianapolis, Indiana:Williams, 2004 – 288 с.
2. RFC1945 –HTTP/1.0 Protocol
3. RFC2616 –HTTP/1.1 Protocol
4. E.Nemeth,G.Snyder, S.Seebass, T.Hein UNIX System Administration Handbook 3rd Edition /New Jersey: Prentice Hall, 2003 – 925 c., илл.
5. R.Stevens,B.Fenner, A.Rudoff UNIX Network Programming / Addison Wesley, 2003 – 1024 c., илл.