Skip to content

Latest commit

 

History

History
143 lines (117 loc) · 12.4 KB

lab03.md

File metadata and controls

143 lines (117 loc) · 12.4 KB

Практика 3. Прикладной уровень

Программирование сокетов. Веб-сервер

А. Однопоточный веб-сервер (3 балла)

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

  • веб-сервер создает сокет соединения при контакте с клиентом (браузером) получает HTTP-запрос из этого соединения
  • анализирует запрос, чтобы определить конкретный запрашиваемый файл
  • находит запрошенный файл в своей локальной файловой системе
  • создает ответное HTTP-сообщение, состоящее из содержимого запрошенного файла и предшествующих ему строк заголовков
  • отправляет ответ через TCP-соединение обратно клиенту
  • если браузер запрашивает файл, которого нет на веб-сервере, то сервер должен вернуть сообщение об ошибке «404 Not Found»

Ваша задача – разработать и запустить свой локальный веб-сервер, а затем проверить его работу при помощи отправки запросов через браузер. Продемонстрируйте работу сервера, приложив скрины.

Скорее всего порт 80 у вас уже занят, поэтому вам необходимо использовать другой порт для работы вашей программы.

Формат команды для запуска сервера:

<server.exe> server_port

Демонстрация работы

todo

Б. Многопоточный веб-сервер (2 балла)

Реализуйте многопоточный сервер, который мог бы обслуживать несколько запросов одновременно. Сначала создайте основной поток (процесс), в котором ваш модифицированный сервер ожидает клиентов на определенном фиксированном порту. При получении запроса на TCP-соединение от клиента он будет устанавливать это соединение через другой порт и обслуживать запрос клиента в отдельном потоке. Таким образом, для каждой пары запрос-ответ будет создаваться отдельное TCP-соединение в отдельном потоке.

В. Клиент (2 балла)

Вместо использования браузера напишите собственный HTTP-клиент для тестирования вашего веб-сервера. Ваш клиент будет поддерживать работу с командной строкой, подключаться к серверу с помощью TCP-соединения, отправлять ему HTTP-запрос с помощью метода GET и отображать ответ сервера в качестве результата. Клиент должен будет в качестве входных параметров принимать аргументы командной строки, определяющие IP-адрес или имя сервера, порт сервера и имя файла на сервере. Продемонстрируйте работу клиента, приложив скрины.

Формат команды для запуска клиента:

<client.exe> server_host server_port filename

Демонстрация работы

todo

Г. Ограничение потоков сервера (3 балла)

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

Формат команды для запуска сервера:

<server.exe> server_port concurrency_level

Задачи

Задача 1 (2 балла)

Голосовые сообщения отправляются от хоста А к хосту Б в сети с коммутацией пакетов в режиме реального времени. Хост А преобразует на лету аналоговый голосовой сигнал в цифровой поток битов, имеющий скорость $128$ Кбит/с, и разбивает его на $56$-байтные пакеты. Хосты А и Б соединены одной линией связи, в которой скорость передачи данных равна $1$ Мбит/с, а задержка распространения составляет $5$ мс. Как только хост А собирает пакет, он посылает его на хост Б, который, в свою очередь, при получении всего пакета преобразует биты в аналоговый сигнал. Сколько времени проходит с момента создания бита (из исходного аналогового сигнала на хосте A) до момента его декодирования (превращения в часть аналогового сигнала на хосте Б)?

Решение

todo

Задача 2 (2 балла)

Рассмотрим буфер маршрутизатора, где пакеты хранятся перед передачей их в исходящую линию связи. В этой задаче вы будете использовать широко известную из теории массового обслуживания (или теории очередей) формулу Литтла. Пусть $N$ равно среднему числу пакетов в буфере плюс пакет, который передается в данный момент. Обозначим через $a$ скорость поступления пакетов в буфер, а через $d$ – среднюю общую задержку (т.е. сумму задержек ожидания и передачи), испытываемую пакетом. Согласно формуле Литтла $N = a \cdot d$. Предположим, что в буфере содержится в среднем $10$ пакетов, а средняя задержка ожидания для пакета равна $10$ мс. Скорость передачи по линии связи составляет $100$ пакетов в секунду. Используя формулу Литтла, определите среднюю скорость поступления пакета в очередь, предполагая, что потери пакетов отсутствуют.

Решение

todo

Задача 3 (2 балла)

Рассмотрим рисунок.

Предположим, нам известно, что на маршруте от сервера до клиента узким местом является первая линия связи, скорость передачи данных по которой равна $R_S$ бит/с. Допустим, что мы отправляем два пакета друг за другом от сервера клиенту, и другой трафик на маршруте отсутствует. Размер каждого пакета составляет $L$ бит, а скорость распространения сигнала по обеим линиям равна $d_{\text{распространения}}$.

  1. Какова временная разница прибытия пакетов к месту назначения? То есть, сколько времени пройдет от момента получения клиентом последнего бита первого пакета до момента получения последнего бита второго пакета?
  2. Теперь предположим, что узким местом является вторая линия связи (то есть $R_C &lt; R_S$). Может ли второй пакет находиться во входном буфере, ожидая передачи во вторую линию? Почему? Если предположить, что сервер отправляет второй пакет, спустя $T$ секунд после отправки первого, то каково должно быть минимальное значение $T$, чтобы очередь во вторую линию связи была нулевая? Обоснуйте ответ.

Решение

todo

Задача 4 (4 балла)

На рисунке показана сеть организации, подключенная к Интернету: Предположим, что средний размер объекта равен $850000$ бит, а средняя скорость запросов от браузеров этой организации к веб-серверам составляет $16$ запросов в секунду. Предположим также, что количество времени, прошедшее с момента, когда внешний маршрутизатор организации пересылает запрос HTTP, до момента, пока он не получит ответ, равно в среднем три секунды. Будем считать, что общее среднее время ответа равно сумме средней задержки доступа (то есть, задержки от маршрутизатора в Интернете до маршрутизатора организации) и средней задержки в Интернете. Для средней задержки доступа используем формулу $\dfrac{\Delta}{1 - \Delta \cdot B}$, где $\Delta$ – это среднее время, необходимое для отправки объекта по каналу связи, а B – частота поступления объектов в линию связи.

  1. Найдите $\Delta$ (это среднее время, необходимое для отправки объекта по каналу связи).
  2. Найдите общее среднее время ответа.
  3. Предположим, что в локальной сети организации присутствует кэширующий сервер. Пусть коэффициент непопадания в кэш равен $0.4$. Найдите общее время ответа.

Решение

todo