Кэширующий прокси-сервер

Автор работы: Пользователь скрыл имя, 10 Октября 2011 в 19:40, дипломная работа

Описание

Данный вид прокси-серверов так же используется и провайдерами. Как говорилось выше, Интернет состоит из большого количества серверов. Некоторые из них содержат веб-сайты, а некоторые являются лишь транспортными узлами, перенаправляющими трафик от пользователя к веб-сайту и обратно. Провайдеры заинтересованы в уменьшении объема трафика. Для этого они применяют технологию кэширования на своих серверах, чтобы отвечать на часть пользовательских запросов, не пересылая их дальше внутренней сети. Данный метод описан в RFC 2616, позволяющий сообщить прокси-серверам, что содержимое желательно кэшировать (Cache-Control: public).

Содержание

Введение………………….………………………………………………………3

1.ПОСТАНОВКА ЗАДАЧИ……………………………………………………..5

2.ОБЗОР СЕТЕЙ И ПРОКСИ-СЕРВЕРОВ…………………………………….6

2.1. Локальная сеть………………………………………………………..6

2.2. Функции различных прокси-серверов………………………………8

2.3. Сравнение «Кэширующего прокси-сервера» с другими прокси-серверами……………..……………………………………………….…..22

2.3.1. Squid………………………………………………………….22

2.3.2. DeleGate……………………...……………...………………..24

2.3.3. WinGate…………………………………………………........26

2.3.4. UserGate………………………………………………………27

2.3.5. Traffic Inspector……………………………………………....28

3. АРХИТЕКТУРА ПРИЛОЖЕНИЯ…………………………………………....30

3.1. Обоснование выбора языка программирования…………………….30

3.2. Протокол TCP…………………………………………………………31

3.3. Формат заголовка HTTP……………………………………………...35

3.4. Сокеты…………………………………………………………………38

3.5. Разработка структуры приложения………………………………....40

4.СОЗДАНИЕ ПРОГРАММЫ «КЭШИРУЮЩИЙ ПРОКСИ-СЕРВЕР» ...…42

4.1 Библиотеки и компоненты, которые использовались при разработке программы……………..……………………………………………….....42

4.2 Реализация функций программы «Кэширующий прокси-сервер»...47

5. КРАТКАЯ ИНСТРУКЦИЯ ПОЛЬЗОВАТЕЛЯ…………………...………...56

Заключение……………………………………………………………………….60

Список литературы…..…………………………………………………………..61

Работа состоит из  2 файла

Диплом-текст.doc

— 873.50 Кб (Скачать документ)

     И для клиента, и для сервера  важна идея оконечной точки коммуникации, которая называется «сокетом». Сокет  однозначно идентифицирует соединение м помощью функции socket(). Роль сокета затем уточняется с помощью функций connect() или accept(). Так или иначе, клиентская оконечная оконечная точка соединяется с серверной, после чего может начаться обмен данными. В случае протоколов UDP и TCP сокет представляет собой комбинацию адреса и порта локального компьютера с адресом и портом удаленного компьютера.

     Типичная  последовательность создания клиентского  сокета начинается с вызова функции  socket(), которая запрашивает ресурсы у операционной системы и получает от нее, в частности, дескриптор сокета и номер локального порта. Затем надлежит определить адрес и номер порта удаленного хоста, с которым требуется установить соединение. Само соединение устанавливается путем вызова функции connect(). Если операция выполнилась успешно, то можно передавать данные. Для чтения из локального порта служат функции read() и recv(), а для записи в удаленный порт – функции write() и send(). 

3.5. Разработка структуры приложения 

     Для корректного функционирования приложения и отсутствия простоев в ожидании освобождения канала необходимо разделить приложение на два потока: серверный и клиентский. Так для каждого нового подключения программа будет создавать новый экземпляр.

     Так же нам понадобятся сокеты. Точнее Winsock. Сокеты определяют конечные точки взаимодействия (обычно через сеть). Они поддерживают целый ряд протоколов, самыми популярными из которых сегодня являются User Datagram Protocol (UDP) и Transmission Control Protocol (TCP).

     Потоку  сервера понадобится информация о том, на каком порте ему работать, какой каталог будет выбран для кэширования, таймаут и количество записей в кэше. Эта информация будет помещена в отдельный файл.

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

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

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

                  Рисунок 3.5.1. Ожидаемая схема работы программы

 

  1. Создание программы «Кэширующий прокси-сервер»

     4.1. Библиотеки и компоненты, которые использовались при разработке.

     ws2_32.lib – данная библиотека необходима для связи с сокетами Winsock 2.

     stdio.h - заголовочный файл стандартной библиотеки языка Си, содержащий определения макросов, константы и объявления функций и типов, используемых для различных операций стандартного ввода и вывода. Функциональность унаследована от «портативного пакета ввода/вывода» («portable I/O package»), написанного Майком Леском из Bell Labs в начале 1970-х C++ ради совместимости, также использует stdio.h наряду со схожим по функциональности заголовочным файлом cstdio.

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

     Функции, объявленные в stdio.h в общем случае могут быть разделены на две категории: функции для операций с файлами и функции для операций ввода-вывода.

     stdlib.h - заголовок (заголовочный файл) стандартной библиотеки общего назначения языка Си, который содержит в себе функции, занимающиеся выделением памяти, контроль процесса выполнения программы, преобразования типов и другие. Заголовок вполне совместим с C++ и в C++ известен как cstdlib. Название «stdlib» расшифровывается как «standard library» (стандартная библиотека).

     unistd.h – стандартная библиотека GNU C включающая в себя такие функции как fork, pipe и прочие. Для использования этой библитеки необходимо наличие MinGW, нативного программного порта GNU Compiler Collection (GCC) под Microsoft Windows, вместе с набором свободно распространяемых библиотек импорта и заголовочных файлов для Windows API. MinGW позволяет разработчикам создавать нативные приложения Microsoft Windows. В MinGW включены расширения для библиотеки времени выполнения для поддержки функциональности C99.

     Проект MinGW поддерживает и распространяет несколько различных ключевых компонентов  и дополнительных пакетов, включая  различные порты GNU toolchain, такие как  GCC и binutils, переведённые в эквивалентые пакеты. Эти утилиты могут быть использованы из командной строки Windows или интегрированы в IDE.

     В дополнение, компонент MinGW, известный  как MSYS (Minimal SYStem) предоставляет win32-порты  окружения легковесной Unix-подобной оболочки, включающей rxvt и набор инструментов POSIX, достаточный для запуска скриптов autoconf.

     Реализации  заголовочных файлов Win32 и библиотек  импорта Win32 для связывания во время  выполнения программы от начала до её завершения. имеют либеральную лицензию, а порты GNU доступны под GNU General Public License.

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

     Функции объявленные в string.h широко используются, так как являясь частью стандартной библиотеки, они гарантированно работают на всех платформах, поддерживающих Си. Однако, существуют некоторые потенциальные проблемы с безопасностью, такие как переполнение буфера, что побуждает в пользу выбора более безопасных, возможно менее переносимых вариантов. Кроме этого, строковые функции работают только с набором символов ASCII или его совместимыми расширениями, такими как ISO-8859-1; многобайтовые кодировки такие как UTF-8 будут работать, с отличием, что «длина» строки будет определяться как число байтов, а не число символов Юникода, которым они соответствуют. Несовместимые с ASCII строки обычно обрабатываются кодом описанным в wchar.h.

     winsock2.h – это расширенная библиотека сокетов Windows Winsock.h. Является частью библиотеки windows.h

     windows.h – библиотека WinAPI, которая имеет очень широкий спектр применения. Она разрабатывалась как универсальная библиотека библиотека для всевозможных windows-приложений. Однако со временем разработчики отказались от этой идеи и теперь файл windows.h разделили на 3 составляющих по назначению: kernel, user и gdi. Эти файлы носят такие названия:

       fcntl.h – библиотека которая позволяет осуществлять манипуляции с файловыми дескрипторами.

     time.h - заголовочный файл стандартной библиотеки языка программирования С, содержащий типы и функции для работы с датой и временем.

     errno.h - заголовочный файл стандартной библиотеки языка программирования С, содержащий объявление макроса для идентификации ошибок через их код. POSIX-совместимые операционные системы, наподобие Unix и Linux, могут включать другие макросы для определения ошибок через собственные коды errno. Значение errno имеет смысл только тогда, когда системный вызов или функция возвращает признак ошибки.

Сообщение об ошибке может быть получено с  помощью функции strerror или напечатано с помощью perror.

     types.h – заголовочный файл библиотеки C POSIX. Определяет различные типы данных

     stat.h - заголовочный файл библиотеки C POSIX. Необходима для получения информации о файле (stat и пр.)

     signal.h - заголовочный файл, определенный в стандартной библиотеке языка Си, для указания того, как программа обрабатывает сигналы во время ее выполнения. Сигнал может оповещать о некотором отклонении от ожидаемого поведения программы (как например, деление на нуль) или о некоторых асинхронных событиях, произошедших вне программы (например, если кто-то нажал кнопку прерывания программы на клавиатуре).

Сигнал  может генерироваться при вызове raise (посылает сигнал текущему процессу) или kill (посылает сигнал любому процессу). Каждая реализация определяет какой  сигнал что генерирует и определяет их генерацию. реализация может определять сигналы, отличающиеся от перечисленных здесь. Стандартный заголовочный файл <signal.h> может определять дополнительные макросы с именами, начинающимися с SIG, для указания значения этих дополнительных сигналов. Все подобные значения являются целыми константными выражениями >= 0.

Можно указывать обработчик сигнала для  всех сигналов кроме двух (SIGKILL и SIGSTOP не могут быть перехвачены, блокированы  или проигнорированы). Обработчик сигнала  — функция, направляющая вызовы окружению, когда принимает соответствующий  сигнал. Целевое окружение приостанавливает выполнение программы пока обработчик сигнала не возвратит значение или вызовет переход (longjmp). Для максимальной переносимости, асинхронный обработчик сигнала должен:

  • совершать (успешный) вызов сигнала функции
  • присваивать значения объектам с типом несвязанная переменная sig_atomic_t
  • возвращать управление обратно вызвавшему его

Если  сигнал оповещает об ошибке внутри программы (а сигнал не асинхронный), то обработчик сигнала может завершить  ее выполнение, вызвав abort, exit или longjmp.

     process.h – библиотека содержит определения типа Process и функций управления сопроцессами.

 

      4.2 Реализация функций «Кэширующего прокси-сервера» 

     В первую очередь необходимо определить набор констант:

#define PATH_MAX 512 - Константа, отвечающая за максимальную длину пути

#define NAME_MAX 256 - Константа, отвечающая за максимальную длину имени файла

#define DEFAULT_DIR "/cache" - Каталог кэшированных файлов.

#define FILENAME_PREFIX "prx."  - Префикс для кэшированных файлов.

#define QUEUE_LEN 5 - Очередь TCP запросов, 5 - универсальный вариант.

#define CLIENT_TIMEOUT 20 - Таймаут для ответа клиента, параметр указывается в секундах.

#define SERVER_TIMEOUT 120 - Таймаут для ответа сервера, параметр указывается в секундах.

#define MAX_ENTRIES – 100 - Максимальное количество элементов в кэше.

#define HASH_SIZE 10000 - Длина хэша.

#define MAX_URL_LEN 1024 - Максимально допустимая длина URL.

#define HOST_LEN 256 - Максимально допустимая длина имени хоста.

#define MAX_REQUEST_LEN 2048 - Максимально допустимая длина строки HTTP-запроса.

#define BUFFER_LEN 1400 - Размер буффера, зависит от MTU.

#define CMD_LEN 256 - Максимальная длина system() command.

int DEBUG = 0 - Режим DEBUG. Данный режим необходим для отслеживания ошибок и выведения дополнительной служебной информации.

int PORT = 3128 - Порт прокси по умолчанию. Это порт, по которому будет ожидаться запрос на подключение от клиентских рабочих станций.

int MAX_AGE = 5- Максимальный срок жизни кэшированных эл-тов, в минутах.

     Далее необходимо описание каждого элемента в кэше:

struct cache_entry

{ char url[MAX_URL_LEN] - URL элемента.

      unsigned hash_value - значение хэша URL элемента.

      struct timeval last_access_time - время последнего посещения. };

     Эти данные будут необходимы при заполнении таблиц и, соответственно, для хранения скэшированных файлов.

     Создаем 2 таблицы:

- cache_table - таблица, содержащая описание по каждому элементу кэша.

- hash_table – хэш таблица, содержащая указатели на записи в таблице кэша.

     Эти таблицы в дальнейшем помогут  отслеживать состояние элементов кэша, сверять их значения с вновь полученными и хранить сведения в течение заданного промежутка времени. Размеры таблиц могут изменяться, аутем изменения констант [MAX_ENTRIES] – для таблицы кэша, и [HASH_SIZE] – для таблицы хэшей. При увеличении размеров таблиц увеличивается расход оперативной памяти, но уменьшается число коллизий.

Титульный лист.doc

— 30.00 Кб (Открыть документ, Скачать документ)

Информация о работе Кэширующий прокси-сервер