2

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

Если я использую UDP, мне все равно придется пинговать 192.168.Х.0 - 192.168.X.255? Или UDP находит способ обойти это? Можно ли каким-то образом обойти брандмауэры, чтобы мне не приходилось заходить на каждый компьютер в моей сети и разрешать входящий трафик на данный порт UDP?

Простите, что я так не замечал этого, я впервые пытаюсь реализовать протокол;)

2 ответа2

3

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

Или вы можете использовать какой-либо существующий протокол обнаружения, такой как Bonjour/Zero Conf или UPnP (Universal Plug 'n Play), для определения местоположения ваших устройств.

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

2

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


Существует очень мало обстоятельств, при которых UDP предпочтительнее TCP:

  • UDP не очень хорошо работает для двусторонней связи. Вы должны создать свою собственную ассоциацию запрос / ответ. Даже когда вы отправляете данные в одном направлении, вы часто хотите, чтобы получатель подтвердил это, то есть данные, отправленные в другом направлении.
  • UDP не надежен. Если пакет потерян или продублирован, это сложно.
  • UDP путешествует по пакетам. Если ваш пакет слишком большой и систематически отбрасывается, это сложно.
  • UDP вводит некоторые проблемы безопасности, такие как упрощение распределенного отказа в обслуживании. По этой причине многие брандмауэры блокируют или строго ограничивают его.
  • Немногие протоколы используют TCP, поэтому закрытые по умолчанию брандмауэры просто не пропускают ни одного из них (кроме DNS, который они жестко ограничивают).
  • UDP не управляет перегрузкой. Если вы затопите сеть, ваши пакеты будут отброшены случайным образом. TCP, с другой стороны, ограничит дебет тем, что может выдержать сеть.

Вы можете отправить пакет UDP на компьютер и посмотреть, если что-то ответит, конечно. Вы можете даже отправить широковещательную рассылку UDP и посмотреть, как далеко она идет, или отправить многоадресную рассылку UDP и надеяться, что она прибудет.

Существует два требования к сетевому пакету (UDP или TCP) для запуска действия на целевом компьютере. Во-первых, все маршрутизаторы и брандмауэры на пути пакета должны пропустить пакет до места назначения. Во-вторых, на целевом компьютере должно быть приложение, которое слушает. Это может быть ваш синхронизатор, или инициатор службы, такой как inetd, или сервер для протокола более высокого уровня, в который синхронизатор встроит такие, как HTTP (S) или SSH.

Если ваши пакеты заблокированы брандмауэром, то в принципе нет способа обойти это. В противном случае брандмауэр просто не выполняет свою работу. Конечно, на практике у брандмауэров есть дыры, например, UPnP (). Скорее всего, вы сможете обойти брандмауэр по TCP (особенно по HTTPS, который брандмауэры обычно не могут блокировать выборочно, поэтому необходимо пропустить, чтобы разрешить просмотр веб-страниц), чем по UDP.

Если на порте назначения ничего не прослушивается, вы снова не сможете взять под контроль целевую машину, чтобы она выполняла ваше приложение. (Это было бы воплощением небезопасности, как некоторые старые непропатченные версии Windows.) Это преимущество совмещения по сравнению с обычным универсальным протоколом, таким как SSH: вам просто нужно включить одну службу, а затем вы можете делать с ней все, что хотите, включая синхронизацию файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .