Перейти к содержанию

Типы пакетов

Основное

  • Версия 5 не совместима с ранними версиями протокола.
  • Узлы с версией 5 будут отвечат узлам старшей версии.
  • Строки в пакетах имеют кодировку UTF-8.
  • Литера E означает, что данные зашифрованы.

Информация о поддерживаемых алгоритмах шифрования и подписи находится в разделе Криптография

1. Пакеты данных

Все Пакеты данных начинаются с:

  • Типа пакета (1 байт);
  • Версии протокола (1 байт).

Все Пакеты данных всегда пересылаются обёрнутыми в Коммутационные Пакеты (2.).

1.1 Почтовый пакет (шифрованый)

Письмо или фрагмент письма для одного получателя.
Часть пакета зашифрована ключом получателя.

Поле Размер Описание
TYPE 1 байт Значение = 'E'
VER 1 байт Версия протокола
KEY 32 байт DHT-ключ пакета, SHA-256 хэш полей LEN+DATA
TIME 4 байт Дата, когда пакет был сохранён на узле (int32)
DV 32 байт Хэш Подтверждения Удаления, SHA-256 хеш поля DA. Также используеся как контрольная сумма для валидации расшифрованного пакета
ALG 1 байт Идентификатор алгоритма, используемого для шифрования.
LEN 2 байт Длина поля DATA
DATA байт[] E Данные для расшифровки и Почтовый пакет (расшифрованый)

ToDo: add info about alg-specific prefixes

1.2 Почтовый пакет (расшифрованый)

Формат хранения Неполных Писем (письма, для которых не хватает частей для компоновки целого письма).

Поле Размер Описание
TYPE 1 байт Значение = 'U'
VER 1 байт Версия протокола
MSID 32 байт Идентификатов письма в двоичном формате
DA 32 байт Ключ Подтверждения Удаления, случайно сгенерирован.
FRID 2 байт Порядковый номер части письма (0..NFR-1)
NFR 2 байт Количество частей письма.
MLEN 2 байт Длина полей CALG+MSG
CALG 1 байт Алгоритм сжатия (см. ниже)
MSG байт[] Содержание письма (MLEN байт)

Алгоритмы сжатия

В зависимости от реализации поддерживаются различные алгоритмы сжатия.

Значение Описание i2p.i2p-bote pboted
0 Uncompressed да да
1 LZMA да да
2 ZLIB [VER 5] нет да
3 BZIP2 [VER 5] нет нет
4 ZSTD [VER 5] нет нет
5 LZ4 [VER 5] нет нет
6 Snappy [VER 5] нет нет

1.3 Индексный пакет

Содержит DHT-ключи для одного и более Почтовых пакетов, Хэш Подтверждения Удаления и временную метку UNIX для каждого элемента.

Поле Размер Описание
TYPE 1 байт Значение = 'I'
VER 1 байт Версия протокола
DH 32 байт SHA-256 хэш Почтового Назначения
NP 4 байт Число записей
KEY1 32 байт DHT-ключ первого Почтового пакета
DV1 32 байт Хэш Подтверждения Удаления для KEY1 (SHA-256 хэш Авторизации Удаления их Почтового пакета)
TIM1 4 байт Время, в которое KEY1 был добавлен на узел. (int32)
KEY2 32 байт DHT-ключ второго Почтового пакета
DV2 32 байт Хэш Подтверждения Удаления для KEY2 (SHA-256 хэш Авторизации Удаления их Почтового пакета)
TIM2 4 байт Время, в которое KEY2 был добавлен на узел. (int32)
... ... ...
KEYn 32 байт DHT-ключ n-ного Почтового пакета
DVn 32 байт Хэш Подтверждения Удаления для KEYn (SHA-256 хэш Авторизации Удаления их Почтового пакета)
TIMn 4 байт Время, в которое KEYn был добавлен на узел. (int32)

1.4 Информационный пакет удаления

Содержит информацию об удалённых из DHT элементах, которые могут быть Почтовыми пакетами или Индексными пакетами.

Содержится в Пакете ответа на Запрос удаления.

Поле Размер Описание
TYPE 1 байт Значение = 'T'
VER 1 байт Версия протокола
NP 4 байт Число записей
KEY1 32 байт Первый DHT-ключ
DA1 32 байт Авторизация Удаления для KEY1
TIM1 8 байт Время, в которое KEY1 был добавлен. (int64) [VER 5]
KEY2 32 байт Второй DHT-ключ
DA2 32 байт Авторизация Удаления для KEY2
TIM2 8 байт Время, в которое KEY2 был добавлен. (int64) [VER 5]
... ... ...
KEYn 32 байт n-ный DHT-ключ
DAn 32 байт Авторизация Удаления для KEYn
TIMn 8 байт Время, в которое KEYn был добавлен. (int64) [VER 5]

1.5 Список пиров

Является ответом на Запрос ближайших узлов или на Запрос списка пиров.

Поле Размер Описание
TYPE 1 byte Значение = 'L'
VER 1 byte Версия протокола.
NUMP 2 bytes Число записей в пакете.
IDN1 384 bytes Стандартное I2P назначение. [VER 5]
TYPE1 1 byte Тип сертификата. [VER 5]
LEN1 2 byte Длина дополнительных данных в поле DATA1. [VER 5]
DATA1 byte[] Дополнительные данные. [VER 5]
IDN2 384 bytes Стандартное I2P назначение. [VER 5]
TYPE2 1 byte Тип сертификата. [VER 5]
LEN2 2 byte Длина дополнительных данных в поле DATA2. [VER 5]
DATA2 byte[] Дополнительные данные. [VER 5]
... ... ...
IDNn 384 bytes Стандартное I2P назначение. [VER 5]
TYPEn 1 byte Тип сертификата. [VER 5]
LENn 2 byte Длина дополнительных данных в поле DATAn. [VER 5]
DATAn byte[] Дополнительные данные. [VER 5]

1.6 Контакт

Преобразование имен и Почтовых назначений.

Поле Размер Описание
TYPE 1 byte Значение = 'C'
VER 1 byte Версия протокола.
KEY 32 bytes DHT-ключ (SHA-256 хеш имени в кодировке UTF-8 в нижнем регистре)
DLEN 2 bytes Длина поля DEST.
DEST byte[] Почтовое назначение, 8 bit (не Base64)
SALT 4 bytes A value such that scrypt(KEY
PLEN 2 bytes Длина поля PIC, максимум: 8192 [VER 5]
PIC byte[] Аватар в формате, совместимом с браузерами (JPG, PNG, GIF)
COMP 1 byte Тип сжатия для TEXT
TLEN 2 bytes Длина поля TEXT, максимум: 2048 [VER 5]
TEXT byte[] Текст, заданый пользователем в кодировке UTF8

2. Коммутационные пакеты

Коммутационные пакеты используются для общения узлов I2P/Bote между собой и для обмена информацией и данными.

Могут содержать внутри Пакеты данных, пункт 3.1.

Все Коммутационные пакеты начинаются со:

  • специального Префикса (4 байт);
  • Типа пакета (1 байт);
  • Версии протокола (1 байт);
  • Идентификатора сессии (32 байт).

2.1 Запрос реле

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

Он содержит I2P назначения, время задержки и Коммутационный пакет

Поле Размер Описание
PFX 4 bytes Префикс, должен быть 0x6D 0x30 0x52 0xE9
TYPE 1 byte Значение = 'R'
VER 1 byte Версия протокола.
CID 32 bytes Идентификатора сессии, используется для ответов
HLEN 2 bytes Длина поля HK
HK byte[] HashCash (HLEN байт)
DLY 4 bytes Задержка в секундах перед отправкой
NEXT 384 bytes Пункт назначения для пересылки пакета
RET Ret. Chain Пустая или непустая цепочка возврата
DLEN 2 bytes Длина поля DATA
DATA byte[] E Зашифрованая с помощью ключа получателя. Может содержать Запрос реле, Запрос на хранение или Запрос на удаление.
PAD byte[] Опциональный отступ

2.2 Запрос на возврат реле

Содержит Цепочку возврата и полезную нагрузку. Пункт назначения неизвестен для отправителя или любого другого хопа.

Используется для ответа на Релейный пакет данных.

Поле Размер Описание
PFX 4 bytes Префикс, должен быть 0x6D 0x30 0x52 0xE9
TYPE 1 byte Значение = 'K'
VER 1 byte Версия протокола.
CID 32 bytes Идентификатора сессии, используется для взаимодействия между двумя узлами. Новый идентификатор на каждый хор.
RET Ret. Chain Не пустая цепочка возврата.
DLEN 2 bytes Длина поля DATA.
DATA byte[] E Полезная нагрузка. Шифрована AES-256 на каждом хопе в цепочке возврата.

2.3 Цепочка возврата

Не является пакетом сама по себе. Только как часть Запроса реле или Запроса на возврат реле.

Поле Размер Описание
RL1 2 bytes Длина поля RET1. Ноль означает, что цепь пуста.
RET1 RL1 bytes Хоп 1 в цепочке возрата. Contains a zero byte, followed by the hop's I2P destination and an AES key to encrypt the payload with.
RL2 2 bytes E Length of RET2
RET2 RL2 bytes E Hop 2 in the return chain. Contains a zero byte, followed by the hop's I2P destination and an AES key to encrypt the payload with. This field is encrypted with the PK of hop 2.
RL3 2 bytes E Length of RET3
RET3 RL3 bytes E Hop 3 in the return chain. Contains a zero byte, followed by the hop's I2P destination and an AES key to encrypt the payload with. This field is encrypted with the PKs of hops 3 and 2.
... ... ...
RLn 2 bytes E Length of RETn
RETn RLn bytes E Last hop in the return chain. Contains a zero byte, followed by the hop's I2P destination and an AES key to encrypt the payload with. This field is encrypted with the PKs of hops n...2.
RLn+1 2 bytes E Length of RETn+1
RETn+1 RLn+1 byt E Number of hops (>0) followed by all AES256 keys (one per hop)
RLn+2 2 bytes Value=0 to indicate this is the end of the return chain

2.4 Запрос на получение

Запрос к финальной точке на получение Индексного пакета или Почтового пакета.

В ответ ожидается Пакет ответа с корректным статусом. [VER 5]

Поле Размер Описание
PFX 4 bytes Префикс, должен быть 0x6D 0x30 0x52 0xE9.
TYPE 1 byte Значение = 'G'. [VER 5]
VER 1 byte Версия протокола.
CID 32 bytes Идентификатора сессии, используется для ответов.
DTYP 1 byte Тип данных для получения.
KEY 32 bytes DHT-ключ данных.
KPR 384 bytes Email keypair of recipient
RLEN 2 bytes Length of the RET field
RET byte[] Relay Packet, contains the return chain (RLEN bytes)

2.5 Пакет ответа

Ответ на Запрос на получение, Запрос на доставку, Запрос ближайших узлов или Запрос пиров.

Поле Размер Описание
PFX 4 bytes Префикс, должен быть 0x6D 0x30 0x52 0xE9.
TYPE 1 byte Значение = 'N'.
VER 1 byte Версия протокола.
CID 32 bytes Идентификатора сессии, используется для ответов.
STA 1 byte Код состояния (смотри ниже).
DLEN 2 bytes Длина поля DATA. При значении 0 - без Пакета данных.
DATA byte[] Пакет данных.

Коды состояния

Значение Описание
0 OK
1 Общая ошибка
2 Данные не найдены
3 Недействительный пакет
4 Недействительный HashCash
5 Предоставлено недостаточно HashCash
6 Не осталось места на диске
7 Дублированные данные [VER 5]

2.6 Запрос списка одноранговых узлов

Запрос списка пиров-ретрансляторов высокой доступности.

Пакет ответа с корректным статусом ожидается в ответ. [VER 5]

Поле Размер Описание
PFX 4 bytes Префикс, должен быть 0x6D 0x30 0x52 0xE9.
TYPE 1 byte Значение = 'A'.
VER 1 byte Версия протокола.
CID 32 bytes Идентификатора сессии, используется для ответов.

3 Коммутационные пакеты DHT

3.1 Запрос на извлечение

Запрос к узлу на получение данных для предоставленного типа данных и DHT-ключа к нему.

Пакет ответа с корректным статусом ожидается в ответ. [VER 5]

Поле Размер Описание
PFX 4 bytes Префикс, должен быть 0x6D 0x30 0x52 0xE9.
TYPE 1 byte Значение = 'Q'.
VER 1 byte Версия протокола.
CID 32 bytes Идентификатора сессии, используется для ответов.
DTYP 1 byte Тип запрашиваемых данных (смотри ниже).
KEY 32 bytes DHT-ключ данных.

Типы данных для извлечения

Значение Тип данных
'I' Индексный пакет
'E' Почтовый пакет
'C' Контакт

3.2 Запрос удаления

Запрос к узлу на возврат Информационного пакета удаления для предоставленного DHT-ключа Почтового пакета.

Используется для определения доставки почты.

Пакет ответа с корректным статусом ожидается в ответ. [VER 5]
Пакет ответа должен содержать Информационный пакет удаления.

Поле Размер Описание
PFX 4 bytes Префикс, должен быть 0x6D 0x30 0x52 0xE9.
TYPE 1 byte Значение = 'Y'.
VER 1 byte Версия протокола.
CID 32 bytes Идентификатора сессии, используется для ответов.
KEY 32 bytes DHT-ключ Почтового пакета.

3.3 Запрос на хранение

Запрос к DHT на сохранение данных.

Пакет ответа с корректным статусом ожидается в ответ. [VER 5]

Поле Размер Описание
PFX 4 bytes Префикс, должен быть 0x6D 0x30 0x52 0xE9.
TYPE 1 byte Значение = 'S'.
VER 1 byte Версия протокола.
CID 32 bytes Идентификатора сессии, используется для ответов.
HLEN 2 bytes Длина поля HK.
HK byte[] HashCash (HLEN байт).
DLEN 2 bytes Длина поля DATA.
DATA byte[] Data Packet to store (DLEN bytes). Can be an Index Packet, Email Packet, or Email Destination.

3.4 Запрос на удаление почтового пакета

Запрос на удаление Почтового пакета по DHT-ключу.

Пакет ответа с корректным статусом ожидается в ответ. [VER 5]

Поле Размер Описание
PFX 4 bytes Префикс, должен быть 0x6D 0x30 0x52 0xE9.
TYPE 1 byte Значение = 'D'
VER 1 byte Версия протокола.
CID 32 bytes Идентификатора сессии, используется для ответов.
KEY 32 bytes DHT-ключ почтового пакета к удалению.
DA 32 bytes Авторизация Удаления (SHA-256 должен соответствовать значению Подтверждения Удаления)

3.5 Запрос на удаления индекса

Запрос на удаление одной и более записей (ключей Почтовых пакетов) из хранимого Индексного пакета.

Пакет ответа с корректным статусом ожидается в ответ. [VER 5]

Поле Размер Описание
PFX 4 bytes Префикс, должен быть 0x6D 0x30 0x52 0xE9.
TYPE 1 byte Значение = 'X'
VER 1 byte Версия протокола.
CID 32 bytes Идентификатора сессии, используется для ответов.
DH 32 bytes SHA-256 хэш Почтового назначения (имя Индексного пакета)
N 1 byte Число записей
DHT1 32 bytes Первый DHT-ключ на удаление
DA1 32 bytes Авторизация Удаления (SHA-256 должен соответствовать значению Подтверждения Удаления из Почтового пакета для DHT1)
DHT2 32 bytes Второй DHT-ключ на удаление
DA2 32 bytes Авторизация Удаления (SHA-256 должен соответствовать значению Подтверждения Удаления из Почтового пакета для DHT2)
... ... ...
DHTn 32 bytes n-ый DHT-ключ на удаление
DAn 32 bytes Авторизация Удаления (SHA-256 должен соответствовать значению Подтверждения Удаления из Почтового пакета для DHTn)

3.6 Запрос ближайших узлов

Запрос K-узлов, ближайших к переданому DHT-ключу.

Пакет ответа с корректным статусом ожидается в ответ. [VER 5]

Поле Размер Описание
PFX 4 bytes Префикс, должен быть 0x6D 0x30 0x52 0xE9.
TYPE 1 byte Значение = 'F'
VER 1 byte Версия протокола.
CID 32 bytes Идентификатора сессии, используется для ответов.
KEY 32 bytes DHT-ключ

Последнее обновление: 2023-03-10