Портирование SWIM из UDP в TCP - PullRequest
       8

Портирование SWIM из UDP в TCP

0 голосов
/ 15 сентября 2018

Из-за проблем с сетью я собираюсь разветвляться swim-js и адаптировать его для использования TCP вместо UDP.Я использую это с seneca-mesh (которая использует это через чихание).Сетка Сенека использует плавание для обнаружения других узлов и их команд.В некоторых сервисах есть несколько команд (ничего особенного, скажем, 10), что приводит к большим обновлениям пакетов UDP.Все они имеют размер менее 1500 байт, но некоторые переходы в нашей сети имеют 1400 байт в качестве MTU.

Эта реализация плавания работает таким образом в отношении пакетов UDP:

  1. При отправкенесколько пакетов сначала конвертируют их в буферы с некоторыми пользовательскими заголовками

  2. Он рассчитывает количество байтов, доступных для пакета, на основе предоставленного максимального размера датаграммы и некоторых случайных внутренних значений

  3. Он пытается сгруппировать как можно больше сообщений в одном UDP-пакете и отправить их
  4. Если есть еще пакеты для отправки, он сбрасывает вычисления и начинает группировать их снова, чтобы отправить их в другой пакет

Если какое-либо сообщение превышает максимальный размер дейтаграммы, оно просто отбрасывается, поскольку не может надежно отправить его в нескольких пакетах UDP.

У нас есть две проблемы:

  1. Некоторые пакеты UDP отбрасываются при некоторых сетевых скачках, поскольку они больше, чем их MTU

  2. Когда служба получает несколько команд для объявления, превышающих максимальный размер дейтаграммы, она не сможет работать с остальными (изолированными навсегда ...)

Из-за чегоЯ уже писал выше, я собираюсь использовать порт сетевого уровня swim-js для использования TCP, что обеспечивает надежную связь.Тем не менее, я не очень опытен в необработанной связи по TCP, и есть некоторые проблемы, которые я хочу уточнить, чтобы сделать наилучшую возможную реализацию.

Вот различия между TCP и UDP, которые я считаю более значительными

  1. TCP основан на соединении, в то время как UDP не
  2. Сокеты UDP кажутся двунаправленными, в то время как TCP играет роль клиентского сервера, где сервер прослушивает порт, а клиент используетдругой.Я имею в виду, вы не можете использовать один и тот же канал TCP для отправки и получения

Здесь мои сомнения / опасения:

Должен ли я держать разные соединения открытыми?Как вы, вероятно, знаете, плавание заботится о создании и поддержке меша, посылке пакетов обновлений, пинге и широковещании между несколькими узлами.Используя TCP, каждый раз, когда вы хотите отправить пакет (например, пинг), вам нужно открыть соединение.Если я оставлю соединения открытыми, это вызовет значительную нагрузку на сеть?Лучше ли открыть соединение, отправить все данные и затем закрыть его?

Текущее соединение является асинхронным в том смысле, что вы не ждете ответа при отправке запроса проверки связи.Вы просто отправляете запрос ping, и в любое время вы получите запрос ACK.Будет хорошей идеей сохранить эту модель?Или, поскольку TCP требует сначала установить соединение, может быть лучше ответить, используя то же самое установленное соединение?

С уважением

...