Что такое пир ту пир в телеграмме
Peer-to-Peer в Телеграмме — что это такое?
Сразу коротко ответ: тип передачи данных, когда не используются промежуточные узлы (сервера), данные отправляются напрямую получателю.
Простыми словами: стандартная схема передачи данных в мессенджерах — сперва данные отправляются на сервер, а оттуда — получателю. Имеет промежуточный узел, из-за чего скорость снижается, а также качество аудио. Peer-to-Peer (P2P) позволяет данные сразу напрямую, из-за чего скорость повышается. Главный минус — для передачи нужен адрес получателя, внутри приложения он представлен в виде IP-адреса, который можно вычислить. Другими словами — ваш собеседник может узнать ваш IP-адрес, по которому можно определить например из какого вы города.
Функция Peer-to-Peer по умолчанию активирована.
Обычная сеть, это клиенты и сервер (обрабатывающий запросы клиентов) — данный тип называется многоранговая сеть. Однако одноранговая сеть (peer-to-peer) не содержит серверов (иногда бывают исключения) — здесь каждое устройство может быть клиентом, а также выполнять функции сервера, в результате стабильность сети не зависит от одного узла.
Peer-to-Peer — как отключить в Телеграмме? Сперва откройте настройки, далее выберите раздел Конфиденциальность:
Теперь нажмите Звонки:
Внизу кликните Использовать peer-to-peer:
Теперь выберите желаемый вариант (учтите что можно добавить исключения):
Основной минус Peer-to-Peer в Телеграмме — собеседник сможет увидеть ваш IP-адрес при желании, используя скрытое меню статистики/технических данных. Данное меню активируется путем 10 быстрых нажатий на имя абонента во время звонка, после — появятся примерно такие данные:
Добавить комментарий Отменить ответ
Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.
Peer-to-peer
Понравилась статья? Поделись:
Peer-to-peer (P2P, П2П) – это одноранговая, децентрализованная компьютерная сеть, основанная на равных правах всех участников. Такая структура делает сеть более защищенной, так как нет возможности перекрыть ее отдельные серверы — все участники сети являются и серверами, и клиентами. Технология блокчейна строится на базе P2P-сети.
Содержание
Описание развития технологии peer-to-peer [ править ]
Хотя системы пир-ту-пир ранее использовались во многих областях приложений, архитектура была популяризирована системой обмена файлами Napster, выпущенной в 1999 году. Эта концепция вдохновила новые структуры и философии во многих областях человеческого взаимодействия.
Технические особенности [ править ]
В одноранговой сети задачи или рабочая нагрузка распределяется равномерно между одноранговыми сетями с равными привилегиями. Отдельные узлы предоставляют всем участникам сети часть своих ресурсов, таких как вычислительная мощность, пространство дискового хранилища или пропускная способность сети. При этом отсутствует необходимость централизованной координации серверами или стабильными хостами.
То есть, в отличие от традиционной модели «клиент-сервер» отдельные узлы сети выполняют и функции серверов, и функции клиентов, то есть являются и потребителями, и поставщиками ресурсов сети. В первом случае узел посылает запрос на нужные ресурсы, во втором — реагирует на такой запрос, предлагая собственные ресурсы.
В некоторых случаях в частично децентрализованных сетях присутствуют отдельные серверы, которые координируют работу сети, а также предоставляют информацию о действующих узлах и их статусе.
Новые совместные системы P2P ищут решения, при которых отдельные участники сети предлагают не одинаковые ресурсы, а уникальные, но которые приносят пользу всему виртуальному сообществу. Это позволяет решать более сложные задачи в рамках сети, чем когда все ее узлы делают одно и то же.
Использование P2P в криптовалюте [ править ]
Пиринговые сети используются в целях обмена файлами. В этом случае пользователь дает доступ к файлу на своем компьютере для других участников сети, выступая сервером. Клиент находит файл и начинает скачивать его с компьютера. Возможно скачивание одного файла сразу из нескольких источников.
Другое применение пиринговых сетей — распределенные вычисления. В этом случае сложная задача разбивается на множество маленьких, которые решают участники сети, затем «собирая» результат в единое целое.
Наконец, на базе распределенных сетей разработаны современные пиринговые платежные системы, которые предлагают более справедливые условия для использования. По такому принципу работают все криптовалюты.
Изучая go: пишем p2p мессенджер со сквозным шифрованием
Читать отзывы и документацию о языке не достаточно, чтобы научиться на нем писать более менее полезные приложения.
Обязательно для закрепления нужно создать что-то интересное, чтобы наработки можно было бы использовать в других своих задачах.
Статья ориентирована на новичков интересующихся языком go и пиринговыми сетями.
И для профессионалов, умеющих предлагать разумные идеи или конструктивно критиковать.
Программирую достаточно давно с разной степенью погруженности на java, php, js, python.
И каждый язык программирования хорош в своей сфере.
Основной сферой для Go называют создание распределенных сервисов, микросервисов.
Чаще всего микросервис это небольшая программа, выполняющая свой узкоспециализированный функционал.
Но микросервисы должны ещё уметь общаться друг с другом, поэтому инструмент для создания микросервисов должен позволять легко и без боли организовывать сетевое взаимодействие.
Чтобы проверить это напишем приложение организовывающее децентрализованную сеть равноправных участников (Peer-To-Peer), самое простое — p2p мессенджер (кстати, есть ли русский синоним этому слову?).
В коде активно изобретаю велосипеды и наступаю на грабли, чтобы прочувствовать golang, получить конструктивную критику и рациональные предложения.
Что делаем
Пир (peer) — уникальный экземпляр мессенджера.
Наш мессенджер должен уметь:
Чтобы задачку сделать чуть интереснее, давайте сделаем так, чтобы все это проходило через один сетевой порт.
Если дернуть этот порт по HTTP, то получим реактовское приложение, которое дернет этот же порт, установив web socket соединение.
Если дергать порт по HTTP не с локальной машины, то показываем баннер.
Если к этому порту подключается другой пир, то происходит установка постоянного соединения со сквозным (end-to-end) шифрованием.
Определяем тип входящего соединения
Для начала откроем порт для прослушивания и будем ждать новых соединений.
На новое соединение читаем первые 4 байта.
Берем список глаголов HTTP и сравниваем с ним наши 4 байта.
Теперь определяем с локальной ли машины происходит подключение, и если нет, то отвечаем баннером и «вешаем трубку».
Если же подключение локальное, то отвечаем файлом, соответствующим запросу.
Тут я решил написать обработку самостоятельно, хотя можно было бы воспользоваться имеющимся в стандартной библиотеке обработчиком.
Раз уж я собрал велосипед в обработке запросов файлов, то обработку ws соединения сделаю с помощью библиотеки gorilla/websocket.
Обнаружение пиров
Для поиска пиров в локальной сети воспользуемся мультикастом UDP.
Будем отправлять на Multicast IP адрес пакеты с информацией о нас самих.
И отдельно прослушивать от Multicast IP все UDP пакеты.
Таким образом мы заявляем о себе и узнаем о появлении других пиров.
Можно было бы организовать это на уровне IP и даже в официальной документации пакета IPv4 в качестве примера кода приводится как раз multicast пакета данных.
Протокол взаимодействия пиров
Будем все общение между пирами упаковывать в конверт (Envelope).
На любом конверте всегда есть отправитель и получатель, к этому всему мы добавим команду (которую он с собой несет), идентификатор (пока это случайное число, но можно сделать как хэш содержимого), длина содержимого и само содержимое конверта — сообщение или параметры команды.
Команда, (или же тип содержимого) удачно расположим в самом начале конверта и определим список команд из 4 байт, не пересекающихся с именами глаголов HTTP.
Весь конверт при передаче сериализуется в массив байт.
Рукопожатие
Когда соединение установлено, пир тут же протягивает руку для рукопожатия, сообщая свое имя, публичный ключ и эфемерный публичный ключ для генерации общего сессионного ключа.
В ответ пир получает аналогичный набор данных, регистрирует найденный пир в своем списке и вычисляет (CalcSharedSecret) общий сессионный ключ.
Обмен пирами
После рукопожатия, пиры обмениваются своими списками пиров =)
Для этого отправляется конверт с командой LIST, а в его содержимое кладется JSON список пиров.
В ответ получаем аналогичный конверт.
Находим в списках новых и с каждым из них проделываем попытку соединения, рукопожатия, обмена пирами и так далее…
Обмен пользовательскими сообщениями
Пользовательские сообщения представляют для нас наибольшую ценность, поэтому каждое соединение будем шифровать и подписывать.
О шифровании
В стандартных (гугловых) библиотеках golang из пакета crypto реализовано множество всяких разных алгоритмов (ГОСТовских нет).
Наиболее удобной для подписей считаю кривую Ed25519. Будем использовать библиотеку ed25519 для подписи сообщений.
В самом начале я подумывал использовать пару ключей полученных из ed25519 не только для подписи, но и для генерации сессионного ключа.
Однако, ключи для подписи не применимы для вычисления общего (shared) ключа — над ними еще нужно поколдовать:
Поэтому решено генерить эфемерные ключи, и вообще говоря, это правильный подход не оставляющий злоумышленникам шансов подобрать общий ключ.
Генерация общего ключа вполне стандартная: сначала для нового соединения генерим эфемерные ключи, отправляем в сокет конверт с публичным ключом.
Противоположная сторона делает то же самое, но в другом порядке: получает конверт с публичным ключом, генерит свою пару и отправляет публичный ключ в сокет.
Теперь у каждого участника есть чужой публичный и свой приватный эфемерные ключи.
Перемножив их получаем одинаковый для обоих ключ, который и будем использовать для шифрования сообщений.
Шифровать сообщения будем поштучно давно зарекомендовавшим себя алгоритмом AES в режиме сцепления блоков (CBC).
Вся эта реализации легко находятся в документации golang.
Единственная доработка — авто заполнение сообщения нулевыми байтами для кратности его длины к длине блока шифрования (16 байт).
В далеком 2013 году реализовывал AES (с похожим на CBC режимом) для шифрования сообщений в Telegram в рамках конкурса от Павла Дурова.
Для генерации эфемерного ключа в то время в телеграмм использовался самый обычный протокол Диффи — Хеллмана.
А чтобы исключить нагрузку от фейковых подключений перед каждым обменом ключами клиенты решали задачу факторизации.
Нам нужно показать список пиров и список сообщений с ними, а также реагировать на новые сообщения, увеличивая счетчик рядом с именем пира.
Тут без заморочек — ReactJS + websocket.
Веб-сокет сообщения по сути своеобразные конвертики, только они не содержат в себе шифротекстов.
Все они «наследники» типа WsCmd и при передаче сериализуются в JSON.
Итак, приходит HTTP запрос на корень («/»), теперь чтобы отобразить фронт заглядываем в каталог “front/build” и отдаем index.html
Что ж интерфейс сверстан, теперь выбор для пользователей: запускать его в браузере или в отдельном окошке — WebView.
Для последнего варианта использовал zserge/webview
Для сборки приложения с ним нужно установить ещё либу в систему
В ходе раздумий над GUI нашел множество библиотек для GTK, QT, и очень по гиковски смотрелся бы консольный интерфейс — https://github.com/jroimartin/gocui — по-моему очень даже интересная идея.
Запуск мессенджера
Установка golang
Конечно, сначала нужно установить go.
Для этого настоятельно рекомендую воспользоваться инструкцией golang.org/doc/install.
Упростил инструкцию до bash скрипта
Загрузка приложения в GOPATH
Так уж устроен go, что все библиотеки и даже ваши проекты должны лежать в так называемом GOPATH.
Установка npm и сборка фронта
Как писал выше, наш GUI — веб-приложение с фронтом на ReactJs, поэтому фронт ещё нужно собрать.
Nodejs + npm — тут как обычно.
Теперь стандартно запускаем сборку фронта
Запуск
Перейдем обратно в корень и запустим пир нашего мессенджера.
При запуске можем указать имя своего пира, порт, файл с адресами других пиров и флаг указывающий запускать ли WebView.
Итак, запускаем и чатимся с друзьями по локальной сети.
Отзыв о программировании на golang
Что дальше?
Вот и реализован простейший Peer-To-Peer мессенджер.
Набиты шишки, дальше можно улучшать пользовательский функционал: отправка файлов, картинок, аудио, смайлов и т.д и т.п.
А можно не изобретать свой протокол, и задействовать гугловый Protocol Buffers,
подключить блокчейн и защититься от спама с помощью смарт-контрактов Ethereum.
На смарт-контрактах же организовать групповые чаты, каналы, систему имен, аватарки и профили пользователей.
Еще обязательно запустить seed пиры, реализовать обход NAT и передачу сообщений от пира к пиру.
В итоге получится неплохая замена телеграмма/вотсапа, останется только всех друзей туда пересадить =)
Полезности
В ходе работы над мессенджером нашел интересные для начинающего go разработчика страницы.
Делюсь ими с вами:
Telegram как средство внутренней и внешней политической борьбы или гениальнейший проект большого брата в современной истории
Всё написанное в этой заметке является художественным вымыслом. Совпадения с реальными людьми случайные. Сама история подслушана у бабушек около подъезда. Вся техническая часть упрощена.
Отождествление безопасности с конфиденциальностью переписки в Telegram
В Telegram есть два режима общения — облачный и секретный чаты. Секретный чат преподносится, как безопаснейшее средство общения, которое защищает конфиденциальность пользователей. В описании этого метода общения (в его продвижении) используются следующие фразы: сквозное шифрование, асимметричное шифрование, peer-to-peer, куча громких аббревиатур и прочие очень серьёзные термины и фразы. Даже бабушки у подъезда рассказывают, что серверы Telegram у себя ничего не хранят от секретного чата и доступа к его данным не имеют, даже если бы захотели, потому что там всё зашифровано. Конечно, это миф, но красивый.
Серверная часть Telegram является закрытой. А вот клиентская часть Telegram является открытой. Алгоритмы и API детально расписаны, что ещё больше убеждает людей в безопасности Telegram и наталкивает на мысль о конфиденциальности переписки.
Telegram использует классическое асимметричное шифрование для передачи ключей симметричного шифрования. И единственный канал взаимодействия участников общения — через серверы Telegram, т.е. контролируется третьей стороной. Асимметричное шифрование уязвимо перед классической атакой посредника (MITM, Man in the middle). Именно таким посредником являются сами серверы Telegram. Защититься от MITM можно с помощью дополнительного канала связи с гарантией доставки — сервис Telegram такой функциональности не предоставляет. Или с помощью стороннего независимого доверенного сервиса, который подтвердит ключи (личности) участников общения — сервис Telegram такой функциональности не предоставляет.
В любом момент на стороне серверов Telegram сработает условный рубильник относительно конкретных людей, и вся их секретная переписка перестаёт быть секретной, но они этого даже не заметят. Когда вам кто-то будет рассказывать о том, что сервис Telegram не может получить доступ к секретной переписке — это не соответствует действительности.
Российские гении
В руководстве России, т.е. в ближайшем круге президента, которое имеет контроль над всеми институтами, процессами и ветвями власти в стране, гениальных людей единицы. Остальные выделяются только лояльностью и беспрекословной исполнительностью. Про непубличных гениев никто ничего не знает, на то они и непубличные. А из публичных, например, известен условный Владислав Юрьевич Сурков. Серый кардинал современной России, гениальный «Доктор Зло», который способен реализовать масштабнейшие и сложные по структуре проекты (и которые он реализовал), влияющие на поведение огромной массы людей. Он полностью поглощён тёмной стороной силы — силы денег и власти. Но это не отменяет его гениальность.
Условный Павел Валерьевич Дуров — простой российский гений. Он не совершил никаких открытий, не создал ничего прорывного. Но он гениальный менеджер, способный превратить обычное ничто в «мою прелесть». ВКонтакте и Telegram являются тому доказательством. У каждого человека есть причины делать то, что он делает. Что движет его гений? Деньги? У Дурова их уже предостаточно для любой жизни. Власть? Он ни разу не был замечен в желании бесконечной власти, хоть возможностей у него было много. Борьба за мир во всём мире? Нет, мы же все по сути эгоисты, кто-то больше, кто-то меньше. Тщеславие и страсть? Бинго!
Очень странные дела
Павел Дуров: «Когда переезжаете полицейского, важно проехать взад и вперёд — чтобы вышла вся мякотка«. В этом же 2013 году происходят очень странные события, а именно — человек, похожий на Павла Дурова сбивает сотрудника ДПС и скрывается. В офисе Вконтакте проходят обыски. Силовики давят на Дурова. Заканчивается всё так же быстро и мутно, как и начиналось. Уголовное дело закрыто, все довольны, все свободны.
В этом же 2013 году господин Дуров меняет свой образ на праведника и борца, публично рассуждает о свободе в России (да, какие-то взгляды могут меняться, но сами люди никогда). Начинается история восхождения мессенджера Telegram. Без технологического прорыва, без новшеств. Но продвижение продукта и проекта в целом было организовано Дуровым на высшем уровне, потому что он гений.
Наши дни
Telegram блокируется в России.
Безопасность Telegram уже отождествлена с конфиденциальностью в умах многих людей во всём мире. А ведь маховик этого отождествления ещё только начал раскручиваться. Спросите у прохожих на улице в разных странах, знают ли они о безопасных мессенджерах? И часть из них с уверенностью ответит, что это Telegram. О других безопасных мессенджерах они ничего не знают. И эта уверенность будет только нарастать. Некоторые страны и Россия дали этой уверенности в мировом масштабе мощнейшее ускорение, создав мощнейший инфоповод.
Внутри России небольшая, но очень активная часть населения уже умеет пользоваться VPN и подобными средствами защиты своей конфиденциальности. Получить доступ к их переписке становится всё сложнее. После блокировки Telegram эти люди ещё больше уверуют в конфиденциальность переписки в этой программе. Telegram ещё больше войдёт в их обиход. Эти люди сами себя за волосы вытягивают из своей же зоны безопасности.
И в это же самое время тысячи людей в России «протестуют» (возмущаются) против блокировки Telegram, нагнетая отождествление безопасности Telegram с конфиденциальностью не только в России, но и во всём мире. «Верните нам Telegram», «Я скорблю со всем миром», «Позор Роскомнадзору», «Telegram помогал Гуфу жить», «Моя тян меня бросит без Telegram» и прочие раздирающие душу лозунги и посты можно встретить в последние дни. А условный господин Дуров продолжает публиковать изречения о покалеченных судьбах России и россиян.
Владислав Юрьевич и Павел Валерьевич, мужики, я шляпу не ношу, но надену зимнюю шапку Abibas и перед вами её сниму. Не все ещё осознают масштаба проекта, который вы реализовали. Надеюсь, что доживу до того дня, когда увижу двухчасовую экранизацию, основанную на реальных событиях. Конечно, суть этого проекта — концентрированное зло в дистиллированном виде, но это гениально.
Peer-to-peer
Содержание
Peer-to-peer [ править ]
Частично децентрализованные сети [ править ]
В некоторых peer-to-peer сетях кроме равноправных node присутствуют сервера, которые выполняют административные функции, такие как поддержка базы онлайн пользователей. К частично децентрализованным сетям относятся например eDonkey, BitTorrent, Direct Connect, The Onion Router.
BitTorrent протокол [ править ]
Протокол BitTorrent был разработан в 2001 году Коэном Брахмом, чтобы позволить набору узлов быстро и легко обеспечивать общий доступ к файлам.
Таким образом, протокол не является централизованным (нет никаких выделенных хранилищ с данными), но решает проблему «А где же мне найти, где бы скачать вот этот фрагмент файла».
Для того, чтобы не было проблем с поиском какой-то части файла, трекер сначала предлагает загружать сегменты, которые есть у наименьшего числа участников сети. Это позволяет избежать проблемы, характерной для последовательной загрузки файла, когда много участников скачали почти весь файл, а вот самого конца сейчас ни у кого нет.
Как написать свой BitTorrent [ править ]
Трекер представляет из себя HTTP/HTTPS сервис, который отвечает на HTTP GET запросы. Запрос включает информацию о файле и дополнительную статистическую информацию о торренте. Ответ на запрос содержит список пиров, участвующих в данном торренте.
Потребуется расшифровать и распарсить файл. Из всего, как минимум, понадобится часть announce url и info, в последней содержатся такие поля как piece length(длина кусочка), pieces(список хешей кусочков), paths и lengths для отдельных файлов (структура для торрента с отдельным файлом и несколькими может несколько различаться).
В ответ от сервера клиент получит закодированый список пиров. Используйте Benconde раскодировщик, чтобы в части peers найти список адресов в формате ip_address:port.
Далее, можно пытаться подключаться к любому из пиров по TCP, для начала советуется поддерживать хотя бы одно соединение.
Первое сообщение должно иметь вид handshake:
info_hash и peer_id уже встречались, а для текущей версии протокола ‘pstrlen’=19, ‘pstr’=BitTorrent protoco, ‘Reserved’ восьмибитовая строка. От пира следует ожидать сообщение в аналогичном формате, и после этого проверить, соответствуют ли поля info_hash и peer_id ожидаемому, в случае несоответствия лучше сразу закрыть соединение.
Дальше существует 11 типов возможных сообщений: keep-alive, choke, unchoke, interested, not-interested, have, bitfield, request, piece, cancel, and port. Описание всех видов тут.
Сообщение состоит из 4 байтов задающих длину сообщения, 1 байт задает id сообщения(у сообщения вида Keep-alive этот бит пропускается), и хвост с дополнительной информацией.
Этого уже вполне хватает, чтобы обмениваться файлами с другими пирами.
Децентрализованные сети [ править ]
DHT [ править ]
Рассмотрим пример децентрализованной структурированной P2P сети.
Рассмотрим вариант, предложенный Хордом (Chord). Скажем, что ключами нашей хеш-таблицы будут, например, 160-битные числа (например, SHA-1 хеш объекта). Назначим каждому узлу 160-битное число (как вариант, случайно), и каждый узел будет отвечать за объекты, для ключей которых число в этой вершине ближайшее среди всех чисел вершин.
Для инициализации можно считать, что у нас достаточно мало узлов в сети, каждый узнает ключи других узлов, и инициализирует свою часть хеш-таблицы.
Таким образом, мы рассмотрели пример децентрализованной структурированной P2P сети.
Blockchain [ править ]
Bitcoin [ править ]
Идея создания распределённой криптовалюты сопряжена с трудностями основная из них это проблема Двойного расходования (англ. Double-spending). В отличие от обычных бумажных денег, которые нельзя просто так взять и скопировать. Можно легко сделать копию электронного файла, который содержит информацию о кошельке, и попытаться потратить деньги в один момент в разных частях света. Так как система распределённая нет такого сервера у которого можно было бы запросить информацию о текущем счёте. С одной стороны это сильно усложняет принцип работы, но с другой даёт огромные преимущества связанные с распределённостью.
Как уже говорилось информация о транзакциях разбита на блоки и хранится следующим образом. Основная информация, которую содержит каждый блок.
В качестве хеш функции используется sha-256. Для хеширования списка транзакций используется древовидный хеш.
Blockchain в первую очередь распределённая база данных. Её содержимое хранится на множестве компьютеров по всему миру. Несмотря на то, что данные о всех транзакциях хранятся у всех участников в открытом виде, отельно взятому участнику нет возможности что-либо подменить в базе данных. Так как после любого изменения в блоке у него изменится хеш, а следующий блок знает значения хеша предыдущего, а значит будет очевидно, что блок подделан. Чтобы реально подделать блок нужно изменить не только его, а ещё все следующие. То есть для этого злоумышленнику нужно обладать вычислительными мощностями большими чем у всего остального мира. А это на практике не возможно.
Когда один из участников хочет перевести деньги другому, он рассылает информацию об этой транзакции всем участникам сети. Майнер, получив очередную транзакции проверяет, что она корректная. То есть что у отправителя достаточно денег на счёте. Так как каждый майнер хранит всю историю транзакций, это легко сделать. Если всё хорошо, то транзакция добавляется в список, иначе отвергается.
Сложность математической задачи для создания блока постоянно регулируется и поддерживается так, чтобы новый блок создавался в среднем раз в 10 минут.
Распределённость и общение между серверами через peer-to-peer соединения даёт большие преимущества bitcoin.
Недостатки данной системы.
Другие применения [ править ]
В июне 2016 года Шведский земельный реестр сообщил, что организация тестирует эту технологию с тем, чтобы перевести на её основу базу данных земельных участков в Швеции
Сбербанк в 2017 году запустит документооборот на основе blockchain. Это резко сократит затраты человеческих ресурсов, позволит избежать дублирования информации, перейти к совершенно новому способу подтверждения подлинности документов.