Формат пакета [Заголовок] - 2 байта с одинаковым значением, определяющим тип сообщения [Хвост] - остальная часть пакета. Может быть пустым. Имеет либо фиксированную длину, заданную для данного сообщения, либо содержит в начале 1 или 2 байта, содержащих размер (в виде целого беззнакового числа, порядок байт-младший байт по младшему адресу) остальной части, не включая байты размера UH - user hash - SHA224 хэш от сертификата пользователя в DER формате, 28 байт, является идентификатором пользователя Протокол авторизации и пересылки данных (между сервером и клиентом) +++[запрос на подключение] -клиент 0xCA 0xCA Ver_major Ver_minor - версия протокола клиента -4 байта ===============новый вариант +++[ответ сервера] - сервер 0x01 0x01 'O' 'K' ===============новый вариант При удачном прохождении проверки клиент ожидает инициирования защищенного соединения по протоколу TLS, выступая в роли сервера. Сервер выступает в роли TLS-клиента. +++[различные версии протокола] -сервер 0x02 0x02 Ver_major Ver_minor - версия протокола сервера после отправки данного пакета сервер разрывает соединение. Нижеследующие сообщения передаются через защищенное управляющее соединение клиента с сервером. |КЛИЕНТ-СЕРВЕР| +++[запрос на установление соединения с собеседником] - клиент, по установленному защищенному соединению 0x03 0x03 (UH вызываемого пользователя) +++[запрос на разрешение соединения] - сервер, по установленному защищенному соединению 0x04 0x04 (UH инициатора) +++[пользователь с данным UH не найден (в оффлайне, отказался от разговора)] - сервер, по установленному защищенному соединению 0x05 0x05 (UH вызываемого пользователя) +++[разрешение соединения от вызываемого пользователя] -вызываемый клиент, по установленному защищенному соединению 0x06 0x06 (UH вызывающего пользователя) после отправки данного сообщения вызваемый клиент осуществляет подключение к серверу на порт обмена данными (_DATA_PORT) и отправляет через это соединение сообщение 0x20 -идентификация нового соединения +++[пользователь с данным UH найден и готов общаться] - сервер вызывающему клиенту 0x07 0x07 (UH вызываемого пользователя) +++[отказ от общения]-вызываемый клиент 0x08 0x08 (UH вызывающего пользователя) +++[запрос списка узлов] - клиент 0x09 0x09 (2 псевдослучайных байта) +++[список узлов] - сервер 0x0A 0x0A -- см формат 0xA4 Нижеследующие сообщения передаются через соединение сервера с клиентом для передачи данных +++[идентификация нового соединения] - клиент 0x20 0x20 (UH вызывающего пользователя) (UH вызываемого пользователя) сервер при получении данного сообщения проверяет UH-ы. При несовпадении соединение разрывается. После проверки сервер переходит в режим пересылки данных между двумя клиентами. Вызывающий клиент инициирует установку соединения по протоколу TLS Протокол обмена сообщениями (между клиентами через сервер(ы) ) |КЛИЕНТ-КЛИЕНТ| +++[начало c2c соединения] - клиент клиенту 0xCC 0xCC Ver_major Ver_minor - версия протокола клиента варианты ответа - 0x01,0x02 +++[список прямых адресов клиента] 0x0B 0x0B -- см формат A4 0xA0, 0xA1, 0xA1 - аналогично сообщениям n2n Если клиент настроен для приёма входящих прямых соединений между клиентами (минуя ноду), он может послать список своих адресов. Первыми в списке должны идти адреса локальной сети (если они есть) из подсетей 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, чтобы клиенты, находящиеся в одной локальной сети могли соединиться напрямую. Далее следуют публичные адреса интернета. Если клиент находится за NAT и пробрасывает открытый порт на свой локальный адрес, в адресе должен быть указан внешний порт. Получив анонс, другой клиент может создать соединение с этим адресом и закрыть соединение через ноду +++[попытки прямого соединения провалились] 0x0C 0x0C (2 псевдослучайных байта) отправляется инициатором, если он получил от вызываемого клиента список прямых адресов и все попытки подключения к полученным адресам оказались неуспешны. После получения этого сообщения вызываемый клиент начинает попытки подключения к прямым адресам инициатора, если от инициатора был получен список прямых адресов и прямые подключения разрешены настройками вызываемого +++[переключение на прямое соединение] 0x0D 0x0D (2 псевдослучайных байта) отправляется после успешного TLS хэндшейка на прямом соединении каждой из сторон по соединению через ноду, после отправки этого сообщения все следующие сообщения отправляются по прямому соединению, получатель сообщения соответственно ожидает следующие сообщения уже по прямому соединению. +++[сообщение - текст в кодировке UTF8] 0x30 0x30 (длина сообщения в байтах- 2 байта в формате little-endian) сообщение в кодировке UTF8 +++[отчет о доставке предыдущего сообщения] 0x40 0x40 (2 псевдослучайных байта) +++ [запрос на отправку файла] 0x50 0x50 (длина сообщения - 2 байта, 9..263) (размер файла - 8 байт) имя файла в UTF-8, 1 - 255 байт +++ [подтверждение принятия файла] 0x51 0x51 (2 псевдослучайных байта) после получения этого сообщения отправитель начинает отправку файла +++ [отказ от приёма файла] 0x52 0x52 (2 псевдослучайных байта) +++ [фрагмент файла] 0x53 0x53 (длина фрагмента - 2 байта, 0 - 65532) фрагмент файла +++[управление передачей файла] 0x54 0x54 (команда отправителя) (команда получателя) Команды: 00 - пустая команда (бездействие) 01 - приостановить 02 - возобновить 03 - отменить 04 - отменить из-за ошибки чтения/записи файла Пинг +++[пинг-запрос] - может быть отправлен любой стороной, как по управляющему соединению, так и по межклиентскому 0x68 0x68 (2 псевдослучайных байта) +++[пинг-ответ] 0x69 0x69 (2 псевдослучайных байта) Протокол межсерверного взаимодействия | СЕРВЕР-СЕРВЕР (УЗЕЛ-УЗЕЛ) +++[запрос на подключение сервера] -узел узлу 0xCB 0xCB Ver_major Ver_minor - версия протокола узла (варианты ответа сервера - 0x01,0x02 - те же, что и для клиента) +++[анонс нового узла - IPv4 адрес] 0xA0 0xA0 | IP -адрес нового узла - 4 байта, сетевой порядок байт| номер порта - 2 байта, сетевой порядок байт| +++[анонс нового узла - IPv6 адрес] 0xA1 0xA1 | IPv6 -адрес нового узла - 16 байт, сетевой порядок байт| номер порта - 2 байта, сетевой порядок байт| +++[анонс нового узла - DNS адрес] 0xA2 0xA2 | длина адреса - 1 байт | DNS адрес нового узла| номер порта - 2 байта, сетевой порядок байт| Заявленный в анонсе адрес должнен соответствовать адресу, с которого произошло подключение. Получивший анонс узел должен это проверить. +++[список узлов] 0xA4 0xA4 | размер списка адресов в байтах, 2 байта - 0..65532| список адресов список адресов представляет собой последовательность из элементов 3 возможных типов |0xA0|IP -адрес - 4 байта | номер порта - 2 байта| - 7 байт |0xA1|IPv6 -адрес | номер порта - 2 байта|- 19 байт |0xA2|длина адреса - 1байт| DNS адрес| номер порта - 2 байта| 4 ... 259байт Первым в списке всегда идет собственный адрес узла-отправителя (в данном адресном пространстве). Сообщение может содержать не весь список узлов, а только часть. Весь список в таком случае будет пересылаться по частям. Адреса и номера портов имеют "сетевой" порядок байтов. Размер всего пакета не превышает 64кб +++[запрос списка узлов] @@@ 0x90 0x90 (2 псевдослучайных байта) +++[поиск клиента] - отправляется всем узлам. Узел-получатель отвечает на это сообщение, только если искомый UH найден среди локальных клиентов либо в кэше 0xA5 0xA5 (UH вызываемого пользователя) +++[результат поиска клиента-клиент найден ] - отправляется узлом, получившим 0xA5, если искомый UH найден среди локальных подключенных клиентов 0xA8 0xA8 (UH вызываемого пользователя) +++[результат поиска клиента-клиент найден в кэше ] - отправляется узлом, получившим 0xA5, если искомый UH найден в кэше (т.е есть информация о подключении искомого клиента к другому узлу) 0xA9 0xA9 (размер - два байта, [32-287] )(UH вызываемого пользователя) (адрес узла, на котором может быть искомый UH, в формате A0|A1|A2 см. описание 0xA4) +++[запрос на разрешение соединения c клиентом узла-получателя] 0xAA 0xAA (UH инициатора) (UH вызываемого пользователя) +++[разрешение соединения от вызываемого пользователя]-отправляется после того, как вызываемый локальный клиент ответил сообщением 0x06 и создал новое соединение для обмена сообщениями 0xAB 0xAB (UH инициатора) (UH вызываемого пользователя) +++[клиент не найден (в оффлайне, отказался от разговора)] отправляется узлом в ответ на сообщение 0xD0, адресованное данному UH-у, если данный пользователь уже отключился или его нету в списке локальных клиентов, либо в ответ на 0xAA, если вызываемый клиент отказался от соединения. 0xB8 0xB8 (UH инициатора)(UH вызываемого пользователя) +++[сообщение, передаваемое клиентами между узлами] 0xD0 0xD0 (длина вложенного сообщения в байтах [56 - 65532] , - 2 байта в формате little-endian) (UH локального пользователя-отправителя) (UH пользователя на другом узле) вложенные данные вложенные данные - данные передаваемые через соединение КЛИЕНТ-КЛИЕНТ