Формат пакета [Заголовок] - 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 Протокол обмена сообщениями (между клиентами через сервер(ы) ) |КЛИЕНТ-КЛИЕНТ| +++[сообщение - текст в кодировке 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 пользователя на другом узле) вложенные данные вложенные данные - данные передаваемые через соединение КЛИЕНТ-КЛИЕНТ