Программа, моделирующая сетевую архитектуру (реализация)

Feb 15, 2021 06:52

Начало тут: « Программа, моделирующая сетевую архитектуру (разбор задания)».

Программу я написал на языке программирования C++ для работы в контексте интерфейса командной строки. Программа собрана без ошибок в среде «Visual Studio Community 2019». Тестировал в операционной системе «Windows 10 Pro» (использовал интерфейс командной строки программы «Windows PowerShell»). Переключение в режим Юникода выполняется с помощью нестандартной для C++ функции _setmode, поэтому для работы в операционных системах «Linux» программа потребует небольших изменений.

Вот тут можно посмотреть текст программы: 01chapter_37problem.cpp. Она небольшая (111 строк) и несложная.

Пример работы моей программы в интерфейсе командной строки программы «Windows PowerShell»:




Для пояснения работы этой программы я подготовил следующий рисунок:



Рисунок 1
Работа каждого уровня в программе реализована отдельной функцией, каждая из которых имеет название типа такого: «layer1_function_send» (вместо «1» подставляется соответствующий номер уровня от 1 до 7). Хвост «_send» в названиях функций указывает на то, что на соответствующих уровнях происходит подготовка пакета для отправки в узел (хост) назначения (пакет передается от уровня к уровню по нисходящей, от уровня 7 к уровню 1). В узле (хосте) назначения пакет должен подняться от уровня 1 до уровня 7 и названия функций при этом будут другие, вроде «layer1_function_get», так как при получении пакета на соответствующих уровнях нужно будет выполнять обратные действия (постепенно убирать заголовки, добавленные к пакету при отправке). Я не стал реализовывать в модели получение отправленного пакета, так как в задании этого не требуется.

Функция каждого уровня выполняет три задачи: 1) обрабатывает пакет в соответствии с протоколом текущего уровня (в нашей модели на большинстве уровней тут всего лишь к пакету добавляется заголовок со служебной информацией текущего уровня); 2) выводит результат обработки на дисплей; 3) вызывает функцию уровня, лежащего ниже, и передает ей результат обработки пакета.

На рисунке 1 пакет (в нашей модели он изображается символьным массивом) изображен прямоугольником. Белая часть прямоугольника - это так называемая «полезная нагрузка» (по-английски «payload»). Серая часть пакета - это заголовок, добавленный к пакету на текущем уровне.

На уровне 7 (прикладной уровень) весь пакет представляет собой полезную нагрузку (в примере работы программы это фраза «Мама мыла раму», которую ввел пользователь в ответ на запрос программы). Функция уровня 7 передала исходный пакет функции уровня 6. Функция уровня 6 добавила к пакету заголовок, регламентированный протоколом уровня 6, и передала получившийся пакет функции уровня 5.

Для функции уровня 5 всё, что передано ей функцией уровня 6, является полезной нагрузкой. Функция уровня 5 ничего не знает о внутренней структуре пакета, переданного ей функцией уровня 6. Функция уровня 5 добавляет к полученному пакету свой заголовок со своей служебной информацией, регламентированный протоколом уровня 5.

То же самое происходит со спуском пакета на уровень 4, уровень 3 и так далее. На уровне 1 к пакету ничего не добавляется, он просто отправляется по физической среде (электрический провод, оптоволокно или беспроводным способом по воздуху или в космосе) по компьютерной сети к узлу (хосту) назначения.

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

Еще в задании задано ограничение суммы размеров всех заголовков 64 символами. Я считаю, что это ограничение должно контролироваться проектировщиком протоколов каждого уровня. Для нашей модели я решил, что по протоколу уровня 6 к пакету добавляется заголовок размером 11 символов (в примере работы программы фраза «Заголовок_6»), по протоколу уровня 5 - 10 символов («Заголовок5»), по протоколу уровня 4 - 5 символов («Заго4»), по протоколу уровня 3 - 10 символов («Заголовок3»), по протоколу уровня 2 - 4 символа («Заг2»). Итого размер всех заголовков составил 40 символов, что меньше 64, то есть условие задания выполнено.

Первой мыслью еще до написания программы у меня была такая: «Как получатель пакета разберется, где в пакете начинается и заканчивается каждый заголовок и где начинается исходное сообщение (в примере работы программы - «Мама мыла раму»)?» Сначала я думал, что заголовки и исходное сообщение следует отделять друг от друга специальными символами. Но, на самом деле, это не нужно! Дело в том, что функция с хвостом «_send» узла-отправителя и функция с хвостом «_get» узла-получателя, если они принадлежат одному уровню сетевой архитектуры, знают на своем уровне размер заголовка, регламентированного протоколом этого уровня. Этого достаточно!

Например, в нашем примере отправитель на уровне 2 добавил к пакету заголовок размером 4 символа (такой размер регламентирован протоколом уровня 2). Получатель на уровне 2 отрежет от полученного с уровня 1 пакета именно 4 символа спереди и передаст оставшуюся часть выше, уровню 3. И так далее. Функция каждого уровня получателя знает, сколько нужно отрезать от пакета, благодаря тому, что на одном и том же уровне отправитель и получатель используют один и тот же протокол, который регламентирует размер заголовка данного уровня. На текущем уровне получателю не нужно знать размеры заголовков других уровней.

Образование, Программирование

Previous post Next post
Up