Шаблоны проектирования сетевых коммуникаций [закрыты]

StackOverflow https://stackoverflow.com/questions/670808

Вопрос

Я пришел к пониманию того, что несколько вопросов, которые я задавал в прошлом, таких как это на самом деле все сводится к более фундаментальному вопросу.

Существуют ли какие-либо хорошо известные шаблоны проектирования сетевых коммуникаций и, в силу своей природы, построения / синтаксического анализа протоколов?Поиск в Google мало что дал.

Обратите внимание, что я не ищу решения для какой-либо конкретной проблемы, я ищу документированные шаблоны проектирования, касающиеся сетевых коммуникаций и их протоколов.

Редактировать:

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

РЕДАКТИРОВАТЬ 2:

Мне трудно поверить, что никто не придумал каких-либо общих шаблонов для сетевого общения.Да, я знаю, что "это зависит", но вы можете сказать это о любом проекте, тем не менее, существует множество шаблонов, которые охватывают общие идеи.

Это было полезно?

Решение

Я бы сказал, что шаблон цепочки ответственности может быть полезен для отправки / получения данных из / в сеть.

Вы создаете серию команд для отправки на сервер от клиента.Каждая команда обрабатывается по цепочке ответственности, при этом добавляются данные для корректной обработки команды.

При отправке данных цепочка может выглядеть следующим образом

Command   --> Wrap some       --> Encrypt --> Send data
to send       data around 
              the command 
              (source, extra 
              information if 
              needed)

При получении данных цепочка может быть аналогичной, но наоборот

Receive Data  -->  Decrypt --> Unwrap extra data --> Execute command

Вы можете ознакомиться с этой статьей для получения дополнительной информации о цепочке ответственности.http://www.vincehuston.org/dp/chain.html

Другие советы

Это довольно широкий вопрос, и для его решения, вероятно, потребуется довольно плотная книга.

Я сам не знаю ни о каком подобном ресурсе, но давайте обдумаем это и рассмотрим, каковы были бы размеры пространства шаблонов сетевых коммуникаций:

способ подключения:{на основе подключения, без подключения}

способ взаимодействия:{ синхронный, асинхронный}

сложность разговора:{команда-ответ, диалоговое окно}

форма сообщения:{ поток произвольной формы, полуструктурированный блок, полностью структурированный блок } ..?

Хорошее место для начала - взять семейство протоколов TCP / IP, сопоставить их с приведенным выше пространством и взглянуть на реализацию (реализации) одного или нескольких образцов, которые занимают уникальное положение в приведенном выше пространстве шаблонов характеристик протоколов.Неплохо было бы посмотреть исходный код вашей любимой операционной системы * nix.

Реализации синтаксического анализатора, вероятно, можно было бы разделить на две широкие категории:{обработка с коммутацией команд, конечный автомат}.

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

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

(Базовые (виртуальные) сетевые средства операционной системы (разумеется) также сильно влияют на реализацию.Возьмем, к примеру, JVM:Обработка каналов на основе выбора NIO, основанная на FSM, будет работать довольно хорошо.)

Надеюсь, это поможет.

Я рекомендую:абстрагируйтесь от сетевых протоколов.

Сначала решите, каковы функциональные возможности, модули и API между ними.Затем решите, по какому протоколу данные будут передаваться по сети.

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

Схема акцептора/соединителя : http://www.cs.wustl.edu /~schmidt/PDF/Акцептор.pdf

Цепочка фильтров основана на цепочке реагирования Gof, она используется во многих сетевых стеках / фреймворках.

Конечные автоматы для кодирования/ декодирования PDU.

Я не разбираюсь в шаблонах проектирования, но изучение существующих протоколов, вероятно, является хорошей отправной точкой, особенно "современных", которые были стандартизированы.

BitTorrent - это очень популярный децентрализованный протокол, который имеет ряд расширений.

OpenSSH - еще один хороший кандидат;он поддерживает согласование функций, несколько типов шифрования и каналы отключения / мультиплексирования.

Протоколы VoIP хороши для потоковых приложений:RTP и H.323

Протоколы сетевой маршрутизации также хороши:BGP (и расширения), LDP, VRRP/CARP.

Я не разбираюсь в шаблонах как таковых, но есть несколько "очевидных" точек отбора.Во-первых, вы хотите использовать ASN.1 или нет (это сильно влияет)?Во-вторых, вам нужен понятный человеку протокол или двоичный?В-третьих, нужны ли вам какие-либо аспекты безопасности в вашем протоколе?

Не то чтобы ответ "хочу использовать ASN.1" заставлял отвечать на довольно много вопросов о разработке протокола.

Я не рассматривал это досконально, но я предполагаю это это хорошо, док:

Также, это похоже, хорошая книга:

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top