Реализуйте свой протокол надежной передачи данных типа Stop and Wait на основе ненадежного транспортного протокола UDP. В вашем протоколе, реализованном на прикладном уровне, отправитель отправляет пакет (frame) с данными, а затем ожидает подтверждения перед продолжением.
Клиент
- отправляет пакет и ожидает подтверждение ACK от сервера в течение заданного времени (тайм-аута)
- если ACK не получен, пакет отправляется снова
- все пакеты имеют номер (0 или 1) на случай, если один из них потерян
Сервер
- ожидает пакеты, отправляет ACK, когда пакет получен
- отправленный ACK должен иметь тот же номер, что и полученный пакет
Вы можете использовать схему, которая была рассмотрена на лекции в рамках обсуждения протокола rdt3.0, как пример:
- В качестве базового протокола используйте UDP. Поддержите имитацию 30% потери пакетов. Потеря может происходить в обоих направлениях (от клиента серверу и от сервера клиенту).
- Должен быть поддержан настраиваемый таймаут.
- Должна быть обработка ошибок (как на сервере, так и на клиенте).
- В качестве демонстрации работоспособности вашего решения передайте через свой протокол файл (от клиента на сервер), разбив его на несколько пакетов перед отправкой на стороне клиента и собрав из отдельных пакетов в единый файл на стороне сервера. Файл и размеры пакетов выберите самостоятельно.
Приложите скриншоты, подтверждающие работоспособность программы.
todo
Поддержите возможность пересылки данных в обоих направлениях: как от клиента к серверу, так и наоборот.
Продемонстрируйте передачу файла от сервера клиенту.
todo
UDP реализует механизм контрольных сумм при передаче данных. Однако предположим, что этого нет. Реализуйте и интегрируйте в протокол свой способ проверки корректности данных на прикладном уровне (для этого вы можете использовать результаты из следующего задания «Контрольные суммы»).
Методы, основанные на использовании контрольных сумм, обрабатывают
Получатель проверяет контрольную сумму, складывая все числа из данных (включая контрольную
сумму), и сравнивает результат с числом, все разряды которого равны
Реализуйте функцию для подсчета контрольной суммы, а также функцию для проверки, что данные соответствуют контрольной сумме.
Требования
- Функция 1 принимает на вход массив байт и возвращает контрольную сумму (число).
- Функция 2 принимает на вход массив байт и контрольную сумму и проверяет,
соответствует ли сумма переданным данным. Размер входного массива ограничен сверху
числом байтов (
$= L$ ), однако данные могут поступать разной длины ($\le L$ ).
Добавьте два-три теста, покрывающих как случаи корректной работы, так и случаи ошибки в данных (сбой битов). Вы можете не использовать тестовые фреймворки и реализовать тестовые сценарии в консольном приложении.
Пусть
todo
Рассмотрим задержку, полученную в фазе медленного старта TCP. Рассмотрим клиент и веб-сервер, напрямую соединенные одним каналом со скоростью передачи данных
$\dfrac{4S}{R} > \dfrac{S}{R} + RTT > \dfrac{2S}{R}$ $\dfrac{𝑆}{𝑅} + 𝑅𝑇𝑇 > \dfrac{4𝑆}{𝑅}$ $\dfrac{𝑆}{𝑅} > 𝑅𝑇𝑇$
todo
Рассмотрим модификацию алгоритма управления перегрузкой протокола TCP. Вместо
аддитивного увеличения, мы можем использовать мультипликативное увеличение. TCP-отправитель увеличивает размер своего окна в
todo
Для облачных сервисов, таких как поисковые системы, электронная почта и социальные сети,
желательно обеспечить малое время отклика если конечная система расположена далеко от датацентра, то значение RTT будет большим, что может привести к неудовлетворительному времени
отклика, связанному с этапом медленного старта протокола TCP.
Рассмотрим задержку получения ответа на поисковый запрос. Обычно серверу требуется три окна
TCP на этапе медленного старта для доставки ответа. Таким образом, время с момента, когда
конечная система инициировала TCP-соединение, до времени, когда она получила последний
пакет в ответ, составляет примерно
Один из способов смягчения этой проблемы и улучшения восприятия пользователем производительности заключается в том, чтобы:
- развернуть внешние серверы ближе к пользователям
- использовать расслоение TCP путем разделения TCP-соединения на внешнем сервере. При расслоении клиент устанавливает TCP-соединение с ближайшим внешним сервером, который поддерживает постоянное TCP-соединение с дата-центром с очень большим окном перегрузки TCP.
При использовании такого подхода время отклика примерно равно:
Расслоение TCP также помогает сократить задержку повторной передачи TCP, вызванную потерями в сетях.
Докажите утверждение
todo