централизованный / распределенный обмен - PullRequest
2 голосов
/ 09 июля 2011

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

  1. Некоторые клиенты выгружают файл на сервер анонимно

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

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

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

  3. Некоторые клиенты запрашивают файл

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

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

Цель состоит в том, чтобы создать сеть, в рамках которой любой клиент может загружать или скачивать данные без единого другого партнера, который знает, кто это сделал, но с бесплатным и открытым доступом ко всем.

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

Какой была бы ваша оптимальная реализация?

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

В выходные я реализовал систему, которая в основном выполняет все вышеперечисленное, за исключением части 1. Для загрузки я просто внедрил SSL вместо подделки IP-адреса.Система слаба в нескольких областях.Файлы разбиваются на куски по 1 МБ и шифруются, а затем отправляются зарегистрированным партнерам случайным образом.Получатели для каждого чанка хранятся в базе данных.Я боюсь, что это быстро станет слишком большим, чтобы им можно было управлять, но я также хочу избежать необходимости заполнять сеть чанк-запросами.Когда запрашивается файл, центральный узел информирует пиров, обладающих чанками, что они должны отправить чаны x клиенту (в режиме p2p) или на сервер (в прямом режиме), который затем передает файл вниз.Система - это всего лишь один большой взлом, написанный на ruby, который, я думаю, не совсем подходит для этой задачи.Для переписывания я рассматриваю возможность использования C ++ с Boost.Asio.

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

Текущая топография

Сервер Обработка клиентских загрузок, индексация и распространение контента
Сервер Обработка клиентских запросов Клиент для загрузки файлов и запрашивания файловКлиентский сервер принимает чанки и запросы

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

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

Ответы [ 3 ]

6 голосов
/ 10 июля 2011

Я бы хотел, чтобы клиент мог загрузить с использованием какого-либо NAT (случайный ip), понимая, что сервер не сможет отправить подтверждение пакеты обратно клиенту. Является обеспечение целостности данных возможно с заголовок, передающий общее содержание длина и без учета всей загрузить, если есть несоответствие?

Нет, это неосуществимо. Если ваши пакеты имеют размер 1500 байт и у вас потеря пакетов 0,1%, вероятность загрузки файла размером в один мегабайт без потери пакетов составляет 0,999 ^ (1048576/1500) = 0,497 или менее 50%. Кроме того, неясно, как клиент узнает, если загрузка прошла успешно, если у сервера нет способа отправить подтверждения обратно клиенту.

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

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

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

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

0 голосов
/ 19 июля 2011

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

0 голосов
/ 16 июля 2011

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

Да, такая система была бы хороша, как Bittorrent , но с зашифрованными файлами и хэшами незашифрованных данных.В BT вы, конечно, можете добавлять зашифрованные файлы, но тогда хэши будут состоять из зашифрованных данных и, следовательно, не смогут идентифицировать поисковые источники без централизованного хранилища queryKey-> hashCollection, то есть сервера, который выполняет всю работу по идентификации package-источники для каждого клиента. Freenet (http://freenetproject.org/),) предприняла попытку подобной системы, хотя и более ограничена, чем вы пытаетесь.

Для рассмотрения NAT давайте сначала рассмотрим: aClient-> yourServer (и aClient-> aClient позже)

Для связи между клиентом и вашим сервером NAT (и брандмауэры, которые защищают клиентов) не являются проблемой! Поскольку клиенты инициируют соединение с вашим сервером(который имеет либо фиксированный IP-адрес, либо DNS-запись (или dyndns)), вам даже не нужно думать о NAT, сервер может ответить без проблем, поскольку, даже если несколько клиентов находятся за одним корпоративным брандмауэром, брандмауэр (егоNAT) будет искать, с каким клиентом сервер хочет установить связь, и переадресовывать соответственно (без необходимости указывать это).

Теперь «сложная» часть: клиент -> клиент связьчерез брандмауэры / NAT: центральная техника, которую вы можете использовать, это пробивание отверстий (http://en.wikipedia.org/wiki/UDP_hole_punching). Это работает так хорошо, это то, что Skype насes (от одного клиента за корпоративным брандмауэром к другому;(если это не удается, он использует зеркальный сервер)).Для этого вам нужно, чтобы оба клиента знали адрес другого, а затем отправляли несколько пакетов друг другу, так как они получают адреса друг друга ?: Ваш сервер выдает адреса клиентам (для этого требуется, чтобы не только запросчик, но и каждый распространитель был открыт).подключение к вашему серверу периодически).

Прежде чем я расскажу о вашей озабоченности по поводу целостности данных, общее различие между пакетов и пакетов вы могли бы (и я думаю,should) make:

Вам просто нужно учитывать, что вы можете разделить ваши пакеты (домен приложения) (большие) и пакеты, используемые для интернет-передачи (маленькие, между прочим ограниченные MTU):будет медленным, чтобы оба были одинакового размера, размер максимального пакета TCP / IP составляет 576 (минус накладные расходы; посмотрите здесь: http://www.comsci.us/datacom/ippacket.html);Вы могли бы провести несколько экспериментов по поводу того, какой размер пакетов будет хорошим, и я думаю, что все 50k-1M были бы хорошими (но профилирование оптимизировало бы это, поскольку мы не делаем, если большинство файлов, которые вы хотите распространять, большие или маленькие),

О целостности данных : для ваших пакетов вам определенно нужен хеш, я бы порекомендовал напрямую взять криптографический хеш , поскольку это предотвращает взлом (в дополнение к повреждению));вам не нужно записывать размер пакетов, так как если хеш-код неисправен, вам все равно придется повторно передавать пакет.Имейте в виду, что такой вид повреждения пакетов встречается не часто, если вы используете TCP / IP для передачи пакетов (да, вы можете использовать TCP / IP даже в вашем сценарии), он автоматически исправляет (повторно-запросы) ошибки передачи.Огромное преимущество заключается в том, что все компьютеры и маршрутизаторы между ними знают TCP / IP и проверяют наличие повреждений автоматически на каждом шаге между исходным и конечным компьютером, поэтому они могут сами повторно запросить пакет, что делает его очень быстро .Они не будут знать о протоколе целостности пакета, который вы реализуете сами, поэтому с этим пользовательским протоколом пакет должен прибыть в пункт назначения, прежде чем повторный запрос может даже начаться.

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

Реализация центрального сервера индексации не должна быть проблемой, проблема в том, что вы планируете иметь его зашифруйте все файлы, вместо того, чтобы заставлять издателя выполнять эту тяжелую работу (хорошее шифрование очень тяжело).Единственная проблема с шифрованием данных издателем (а не сервером) заключается в том, что вы должны доверять издателю в предоставлении разумных ключевых слов для поиска: теоретически это может дать вам очень привлекательное ключевое слово для поиска, которое каждый клиент желает, вместе со ссылкой.до фиктивных данных (зашифрованные данные трудно отличить от случайных данных).Но решение этой проблемы - краудсорсинг : сделайте так, чтобы ваш сервер хранил рейтинг пользователей, чтобы загрузчики могли голосовать за файлы.Реализация нужной вам таблицы может представлять собой обычную хеш-таблицу отдельных поисковых ключевых слов для идентификаторов клиентов (см. Ниже), у которых есть этот пакет.Сначала издатель является единственным клиентом, который хранит данные, но каждый клиент, который загрузил хотя бы один из пакетов, затем должен быть добавлен в запись хеш-таблицы, поэтому, если издатель выходит в автономный режим и каждый пакет загружается по крайней мереу одного клиента все продолжает работать.Теперь критически важно, чтобы отображение client-ID-> IP-адреса было нетривиальным, поскольку оно часто меняется (например, каждые 24 часа для многих клиентов);чтобы компенсировать это, у вас должна быть другая таблица на вашем сервере, которая выполняет такое сопоставление и заставляет клиентов периодически (например, каждый час) связываться с сервером, чтобы сообщить ему его IP-адрес.Я бы порекомендовал использовать крипто-хэш для идентификаторов клиентов, чтобы один клиент не мог очистить эту таблицу, сообщив вам поддельные идентификаторы.

По любым вопросам и критике просьба комментировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...