Формат пакета
[Заголовок] - 2 байта с одинаковым значением, определяющим тип сообщения
[Хвост] - остальная часть пакета. Может быть пустым. Имеет либо фиксированную длину, заданную для данного сообщения,
либо содержит в начале 1 или 2 байта, содержащих размер (в виде целого беззнакового числа, порядок байт-младший байт по младшему адресу) остальной части, не включая байты размера

Протокол авторизации и пересылки данных (между сервером и клиентом)

+++[запрос на подключение] -клиент
0xCA 0xCA Ver_major Ver_minor - версия протокола клиента
-4 байта

===============новый вариант
+++[ответ сервера] - сервер
0x01 0x01 'O' 'K'
===============новый вариант
При удачном прохождении проверки клиент ожидает инициирования защищенного соединения по протоколу TLS, выступая в роли сервера. Сервер выступает в роли TLS-клиента.


+++[различные версии протокола] -сервер
0x02 0x02 Ver_major Ver_minor - версия протокола сервера

после отправки данного пакета сервер разрывает соединение.

	Нижеследующие сообщения передаются через защищенное управляющее соединение клиента с сервером.
|КЛИЕНТ-СЕРВЕР|

+++[запрос на установление соединения с собеседником] - клиент, по установленному защищенному соединению
0x03 0x03 (UIN вызываемого пользователя, в формате little-endian)

+++[запрос на разрешение соединения] - сервер, по установленному защищенному соединению
0x04 0x04 (UIN инициатора, в формате little-endian) 

+++[пользователь с данным UIN не найден (в оффлайне, отказался от разговора)]
- сервер, по установленному защищенному соединению
0x05 0x05 (UIN вызываемого пользователя, в формате little-endian)

+++[разрешение соединения от вызываемого пользователя] -вызываемый клиент, по установленному защищенному соединению
0x06 0x06 (UIN вызывающего пользователя, в формате little-endian)
после отправки данного сообщения вызваемый клиент осуществляет подключение к серверу на  порт обмена данными (_DATA_PORT) и отправляет через это соединение сообщение 0x20 -идентификация нового соединения

+++[пользователь с данным UIN найден и готов общаться] - сервер вызывающему клиенту
0x07 0x07 (UIN вызываемого пользователя, в формате little-endian) 

+++[отказ от общения]-вызываемый клиент
0x08 0x08 (UIN вызывающего пользователя, в формате little-endian)

+++[запрос списка узлов] - клиент
0x09 0x09 (2 случайных байта)

+++[список узлов] - сервер
0x0A 0x0A -- см формат 0xA4 

	Нижеследующие сообщения передаются через соединение сервера с клиентом для передачи данных

+++[идентификация нового соединения] - клиент
0x20 0x20 (UIN вызывающего пользователя) (UIN вызываемого пользователя) 

сервер при получении данного сообщения проверяет UINы. При несовпадении соединение разрывается. После проверки сервер переходит в режим пересылки данных между двумя клиентами. Вызывающий клиент инициирует установку соединения по протоколу TLS



Протокол обмена сообщениями (между клиентами через сервер(ы) ) |КЛИЕНТ-КЛИЕНТ|

+++[сообщение - текст в кодировке UTF8]
0x30 0x30 (длина сообщения в байтах- 2 байта в  формате little-endian) сообщение в кодировке UTF8

+++[отчет о доставке предыдущего сообщения]
0x40 0x40 (2 случайных байта)


Пинг

+++[пинг-запрос]  - может быть отправлен любой стороной, как по управляющему соединению, так и по межклиентскому
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 случайных байта)


+++[поиск клиента] - отправляется всем узлам. Узел-получатель отвечает на это сообщение, только если искомый UIN найден среди локальных клиентов либо в кэше
0xA5 0xA5 (UIN вызываемого пользователя, в формате little-endian)

+++[результат поиска клиента-клиент найден ] - отправляется узлом, получившим 0xA5, если искомый UIN найден среди локальных подключенных клиентов
0xA8 0xA8 (UIN вызываемого пользователя, в формате little-endian)

+++[результат поиска клиента-клиент найден в кэше ] - отправляется узлом, получившим 0xA5, если искомый UIN найден в кэше (т.е есть информация о подключении искомого клиента к другому узлу)
0xA9 0xA9  (размер - два байта, [13-263] )(UIN вызываемого пользователя, в формате little-endian) (адрес узла, на котором может быть искомый UIN, в формате A0|A1|A2 см. описание 0xA4)


+++[запрос на разрешение соединения c клиентом узла-получателя]
0xAA 0xAA (UIN инициатора, в формате little-endian) (UIN вызываемого пользователя, в формате little-endian)

+++[разрешение соединения от вызываемого пользователя]-отправляется после того, как вызываемый локальный клиент ответил сообщением 0x06 и создал новое соединение для обмена сообщениями
0xAB 0xAB (UIN инициатора, в формате little-endian) (UIN вызываемого пользователя, в формате little-endian)

+++[клиент не найден (в оффлайне, отказался от разговора)]
отправляется узлом  в ответ на сообщение 0xD0, адресованное данному UIN-у,
если данный пользователь уже отключился или его нету в списке локальных клиентов,
либо в ответ на 0xAA, если вызываемый клиент отказался от соединения.
0xB8 0xB8 (UIN инициатора, в формате little-endian)(UIN вызываемого пользователя, в формате little-endian)

+++[сообщение, передаваемое клиентами между узлами]
0xD0 0xD0 (длина вложенного сообщения в байтах [8 - 65532] , - 2 байта в  формате little-endian) (UIN локального пользователя-отправителя) (UIN пользователя на другом узле) вложенные данные

вложенные данные - данные передаваемые через соединение КЛИЕНТ-КЛИЕНТ 









