Пакеты протокола PRP Примечание Длина пакета (Length) указана с учетом длины поля подписи (KeyedHash, 16 bytes) и длины полей заголовка (PType, OutCounter, InCounter, Length и Reserved, 8 bytes). В C++реализации библиотек протокола в поле Length содержится длина поля данных (Data), то есть отличается на 24 байта от общей длины пакета. Формат пакета Название PType OutCounter Размер в байтах 1 2 InCounter 2 Length Reserved Data KeyedHash Length = 24 bytes 2 1 Зависит от типа пакета 16 0x80 Запрос на подключение Имя java-класса: PrpPacketConnectionRequest Содержимое поля Data: Название Размер в байтах Origin ID 4 bytes Destination ID 4 bytes Random number Login name 4 bytes 12 bytes Зашифрованный DES-ом DH 136 bytes Pub Key Length = 184 bytes 0x81 Запрос на восстановление подключения Имя java-класса: PrpPacketReconnectionRequest Содержимое поля Data: Название Размер в байтах Origin ID 4 Destination ID 4 Random number 4 Описание Тип пакета Порядковый номер исходящего пакета Порядковый номер последнего полученного пакета Общая длина пакета Данные Поле подписи пакета Описание Идентификатор конечной точки инициатора этого соединения Идентификатор конечной точки с которой нужно создать соединение Случайное число Имя пользователя в службе. Если меньше 12 символов, остаток заполняется пробелами Публичный ключ ДиффиХелмана Описание Идентификатор конечной точки инициатора этого соединения. Идентификатор конечной точки с которой нужно создать соединение. Равно полю Random number CON# 3 DH Pub Key 128 + 1 из преыдущего ответа на подключение или восстановление. Уникальный номер соединения. Публичный ключ ДиффиХелмана. Length = 167 bytes Между Random number и CON# стоит 8-битовое поле NULL (предположительно 0-й байт) 0x82 Ответ на подключение Имя java-класса: PrpPacketConnectionResponse Содержимое поля Data: Название Размер в байтах Origin ID 4 Destination ID 4 Random number 4 RET 1 CON# 3 DH Pub Key 128 Описание Идентификатор конечной точки инициатора этого соединения. Либо повторяется из запроса, либо содержит выданный ID. Идентификатор конечной точки с которой нужно создать соединение. Повторяется из запроса. Равно полю Random number + 1 из предыдущего ответа на подключение или восстановление. Содержит код ошибки или 0x00, если соединение успешно установлено Уникальный номер соединения Публичный ключ ДиффиХелмана Length = 168 bytes 0x83 Ответ на восстановление (deprecated?) 0x84 HELLO-запрос (для keep-alive) Имя java-класса: PrpPacketHelloQuery Length = 24 bytes Поле Data пусто 0x85 HELLO-ответ (not realized) Содержимое поля Data: Название Размер в байтах HelloOutCounter 2 Length = 26 bytes 0x86 Пакет уведомляет о потере собеседника Описание Поле OutCounter из пакета hello-запроса Имя java-класса: PrpPacketPartyGone Length = 24 bytes Поле Data пусто 0x87 BAD-Packet – говорит о нарушении последовательности пакетов (not realized) Содержимое поля Data: Название Размер в байтах Описание Counter 4 Поле Counter из последнего корректного пакета Length = 28 bytes Видимо, Counter это OutCounter 0x88 Пакет, содержащий служебное сообщение (not realized) Содержимое поля Data: Название Размер в байтах Описание RET 1 Тип сообщения: 0x0 – OK 0x1 – ERROR 0x2 - FATAL ERROR Text ASCII строка с Cообщение пользователю завершающим нулем Length > 25 bytes 0x8A Инициация смены ключа Имя java-класса: PrpPacketKeyChangeInitiation Содержимое поля Data: Название Размер в байтах DH Pub Key 128 Описание Публичный ключ ДиффиХеллмана. Length = 152 bytes 0x8B Пакет подтверждения смены ключа (not realized) 0xFF Передача данных Имя java-класса: PrpPacketSendData Содержимое поля Data: Название Размер в байтах Data Length > 24 bytes Описание Данные