Подслушивание на уровне приложений в одноранговых сетях, очень похожее на TCP

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

    --- N1 ---
   /    |     \
  /     |      \
S ----- N2 ----- N4 ----- D
  \     |      /
   \    |     /
    --- N3 ---

Просто используя TCP, я могу настроить надежный канал связи от S через N2 и от N4 до D. Это нормально.

Моя проблема сейчас такова: я хочу, чтобы N1 и N3 также могли получать (подслушивать) сообщения, отправленные S, N2 и N4, но им не нужно надежно их получать. Вы можете думать об этом как о потоке пакетов. Например, S хочет послать пакет D. Но этот пакет может быть полезен и для N[1-4], поэтому его следует сохранить.

Это, конечно, возможно при использовании неразборчивого режима Wi-Fi на всех узлах, но это было бы излишеством, потому что это означало бы, что каждый узел должен был бы анализировать все пакеты, чтобы увидеть, могут ли они их сохранить.

Простым решением будет отправка UDP-пакетов:

  1. S отправляет широковещательный пакет UDP со временем жизни от 1 до N2 с дополнительной информацией.
  2. N1, N2 и N3 могут получать и сохранять пакет, но только N2 повторно отправляет информацию N4.
  3. Это поведение повторяется до тех пор, пока D не получит пакет.

Но тогда я должен каким-то образом переопределить TCP с точки зрения упорядочения пакетов, контроля перегрузки и надежной связи, что плохо.

Итак, мой вопрос: знаете ли вы о протоколе, поддерживающем такое поведение?


person mreichelt    schedule 16.02.2011    source источник


Ответы (1)


Я сделал то, что вы говорите, и есть несколько способов сделать это. Использование Linux — самая простая и единственная платформа, на которой я действительно это реализовал.

В Linux это можно сделать двумя способами. 1., используйте iptables и NQUEUE и передавайте полученные пакеты в процесс приложения, который делает с ними все, что вы хотите. Используйте правила iptables, чтобы пропускать только интересующие вас пакеты, например пакеты с IP dst N2, N4 и т. д. 2. Используйте libpcap, свяжите свою программу с этой библиотекой и настройте фильтр захвата для захвата интересующих вас пакетов.

person Andy    schedule 22.02.2011
comment
Итак, в основном вы бы рекомендовали делать это на более низком уровне OSI, но тогда также каждый пакет должен быть прочитан (по крайней мере, iptables или libpcap). Я ищу решение на уровне приложений OSI, что означает, что я могу оставить нижние уровни нетронутыми. Окончательная программа должна иметь возможность запускаться как программа пользовательского пространства без необходимости быть пользователем root... - person mreichelt; 22.02.2011
comment
Я предлагаю приложение для пользовательского пространства, но для его запуска вам понадобятся права root, если вы не используете sudo для своего приложения. Однако вы можете разделить приложение на две части: одно корневое и одно некорневое. Вы хотите, чтобы ваше приложение было приложением прикладного уровня, но не хотите использовать неразборчивый режим. С другой стороны, вы хотите, чтобы определенные узлы получали только определенные пакеты, что является операцией сетевого уровня. Вы сами себе противоречите, потому что то, о чем вы просите, всегда будет механизмом, работающим на нескольких уровнях. У вас есть инструменты, чтобы делать то, что вы хотите, вам нужно решить, как действовать дальше. - person Andy; 23.02.2011
comment
Я отмечаю этот ответ как правильный, потому что считаю, что мой подход не так осуществим, как я думал изначально, и Энди указал, что потребуется, чтобы подслушать пакеты. Я думаю, что это возможно, не затрагивая нижние уровни, но для этого потребуется, чтобы приложение работало на каждом узле. - person mreichelt; 28.02.2011