Этот перевод был создан с помощью машинного обучения и может быть не на 100% точным. Просмотреть английскую версию

Спецификация протокола потоковой передачи

Спецификация протокола потокового вещания I2P, обеспечивающего надежную передачу данных наподобие TCP

Обзор

См. Streaming Library для обзора протокола Streaming.

Версии протокола

Протокол потоковой передачи не включает поле версии. Версии, перечисленные ниже, предназначены для Java I2P. Реализации и фактическая поддержка криптографии могут различаться. Невозможно определить, поддерживает ли удаленная сторона какую-либо конкретную версию или функцию. Таблица ниже предназначена для общего ориентирования относительно дат выпуска различных функций.

Функции, перечисленные ниже, относятся к самому протоколу. Различные параметры конфигурации документированы в Streaming Library вместе с версией Java I2P, в которой они были реализованы.

Router VersionStreaming Features
0.9.58Bob's hash in NACKs field of SYN packet
0.9.39OFFLINE_SIGNATURE option
0.9.36I2CP protocol number enforced
0.9.20FROM_INCLUDED no longer required in RESET
0.9.18PINGs and PONGs may include a payload
0.9.15EdDSA Ed25519 sig type
0.9.12ECDSA P-256, P-384, and P-521 sig types
0.9.11Variable-length signatures
0.7.1Protocol numbers defined in I2CP
## Спецификация протокола

Формат пакета

Формат одного пакета в протоколе потокового вещания показан ниже. Минимальный размер заголовка без NACK или данных опций составляет 22 байта.

В протоколе потоковой передачи нет поля длины. Кадрирование обеспечивается нижними уровнями - I2CP и I2NP.

+----+----+----+----+----+----+----+----+
| send Stream ID    | rcv Stream ID     |
+----+----+----+----+----+----+----+----+
| sequence  Num     | ack Through       |
+----+----+----+----+----+----+----+----+
| nc |  nc*4 bytes of NACKs (optional)
+----+----+----+----+----+----+----+----+
     | rd |  flags  | opt size| opt data
+----+----+----+----+----+----+----+----+
   ...  (optional, see below)           |
+----+----+----+----+----+----+----+----+
|   payload ...
+----+----+----+-//

sendStreamId :: 4 байта Integer : Случайное число, выбранное получателем пакета перед отправкой первого ответного пакета SYN и постоянное на протяжении жизни соединения, больше нуля. 0 в сообщении SYN, отправляемом инициатором соединения, и в последующих сообщениях, до получения ответа SYN, содержащего stream ID узла.

receiveStreamId :: 4 байта Integer : Случайное число, выбранное отправителем пакета перед отправкой первого SYN пакета и постоянное в течение жизни соединения, больше нуля. Может быть 0, если неизвестно, например в RESET пакете.

sequenceNum :: 4 байта Integer : Последовательный номер для данного сообщения, начинающийся с 0 в SYN-сообщении и увеличивающийся на 1 в каждом сообщении, за исключением простых ACK и повторных передач. Если sequenceNum равен 0 и флаг SYN не установлен, это простой ACK-пакет, который не должен подтверждаться.

ackThrough :: 4 байта Integer : Наивысший порядковый номер пакета, который был получен на receiveStreamId. Это поле игнорируется в исходном пакете соединения (где receiveStreamId является неизвестным идентификатором) или если установлен флаг NO_ACK. Все пакеты до этого порядкового номера включительно считаются подтвержденными (ACK), ЗА ИСКЛЮЧЕНИЕМ тех, что перечислены в NACK ниже.

Количество NACK :: 1 байт Integer : Количество 4-байтных NACK в следующем поле, или 8 при использовании совместно с SYNCHRONIZE для предотвращения повторов начиная с версии 0.9.58; см. ниже.

NACKs :: nc * 4 байта Integer : Порядковые номера меньше ackThrough, которые ещё не были получены. Два NACK для пакета являются запросом на ‘быструю повторную передачу’ этого пакета. Также используется вместе с SYNCHRONIZE для предотвращения повторного воспроизведения начиная с версии 0.9.58; см. ниже.

resendDelay :: 1 байт Integer : Как долго создатель этого пакета будет ждать перед повторной отправкой этого пакета (если он еще не был подтвержден ACK). Значение указано в секундах с момента создания пакета. В настоящее время игнорируется при получении.

flags :: 2-байтовое значение : См. ниже.

размер опции :: 2 байта Integer : Количество байт в следующем поле

данные опции :: 0 или более байт : Как указано флагами. См. ниже.

payload :: оставшийся размер пакета

Поля флагов и данных опций

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

Порядок битов: 15….0 (15 - старший разряд)

BitFlagOption OrderOption DataFunction
0SYNCHRONIZE----Similar to TCP SYN. Set in the initial packet and in the first response. FROM_INCLUDED and SIGNATURE_INCLUDED must also be set.
1CLOSE----Similar to TCP FIN. If the response to a SYNCHRONIZE fits in a single message, the response will contain both SYNCHRONIZE and CLOSE. SIGNATURE_INCLUDED must also be set.
2RESET----Abnormal close. SIGNATURE_INCLUDED must also be set. Prior to release 0.9.20, due to a bug, FROM_INCLUDED must also be set.
3SIGNATURE_INCLUDED5variable length SignatureCurrently sent only with SYNCHRONIZE, CLOSE, and RESET, where it is required, and with ECHO, where it is required for a ping. The signature uses the Destination's SigningPrivateKey to sign the entire header and payload with the space in the option data field for the signature being set to all zeroes. Prior to release 0.9.11, the signature was always 40 bytes. As of release 0.9.11, the signature may be variable-length, see below for details.
4SIGNATURE_REQUESTED----Unused. Requests every packet in the other direction to have SIGNATURE_INCLUDED
5FROM_INCLUDED2387+ byte DestinationCurrently sent only with SYNCHRONIZE, where it is required, and with ECHO, where it is required for a ping. Prior to release 0.9.20, due to a bug, must also be sent with RESET.
6DELAY_REQUESTED12 byte IntegerOptional delay. How many milliseconds the sender of this packet wants the recipient to wait before sending any more data. A value greater than 60000 indicates choking. A value of 0 requests an immediate ack.
7MAX_PACKET_SIZE_INCLUDED32 byte IntegerThe maximum length of the payload. Send with SYNCHRONIZE.
8PROFILE_INTERACTIVE----Unused or ignored; the interactive profile is unimplemented.
9ECHO----Unused except by ping programs. If set, most other options are ignored. See the streaming docs.
10NO_ACK----This flag simply tells the recipient to ignore the ackThrough field in the header. Currently set in the initial SYN packet, otherwise the ackThrough field is always valid. Note that this does not save any space, the ackThrough field is before the flags and is always present.
11OFFLINE_SIGNATURE4variable length OfflineSigContains the offline signature section from LS2. See proposal 123 and the common structures specification. FROM_INCLUDED must also be set. Contains an OfflineSig: 1) Expires timestamp (4 bytes, seconds since epoch, rolls over in 2106) 2) Transient sig type (2 bytes) 3) Transient SigningPublicKey (length as implied by sig type) 4) Signature of expires timestamp, transient sig type, and public key, by the destination public key. Length of sig as implied by the destination public key sig type.
12-15unusedSet to zero for compatibility with future uses.
### Примечания к подписям переменной длины

До выпуска версии 0.9.11 подпись в поле опций всегда составляла 40 байт.

Начиная с релиза 0.9.11, подпись имеет переменную длину. Тип и длина подписи выводятся из типа ключа, используемого в опции FROM_INCLUDED, и документации по Signature .

Начиная с релиза 0.9.39, поддерживается опция OFFLINE_SIGNATURE. Если эта опция присутствует, временный SigningPublicKey используется для проверки любых подписанных пакетов, а длина подписи и тип выводятся из временного SigningPublicKey в опции.

  • Когда пакет содержит как FROM_INCLUDED, так и SIGNATURE_INCLUDED (как в SYNCHRONIZE), вывод может быть сделан напрямую.

  • Когда пакет не содержит FROM_INCLUDED, вывод должен быть сделан из предыдущего пакета SYNCHRONIZE.

  • Когда пакет не содержит FROM_INCLUDED, и не было предыдущего пакета SYNCHRONIZE (например, случайный пакет CLOSE или RESET), вывод может быть сделан из длины оставшихся опций (поскольку SIGNATURE_INCLUDED является последней опцией), но пакет, вероятно, будет отброшен в любом случае, поскольку нет доступного FROM для проверки подписи. Если в будущем будут определены дополнительные поля опций, их необходимо будет учесть.

Предотвращение повторных атак

Чтобы предотвратить использование Бобом атаки повторного воспроизведения путем сохранения действительного подписанного пакета SYNCHRONIZE, полученного от Алисы, и последующей отправки его жертве Чарли, Алиса должна включить хеш назначения Боба в пакет SYNCHRONIZE следующим образом:

Set NACK count field to 8
Set the NACKs field to Bob's 32-byte destination hash

При получении SYNCHRONIZE, если поле счетчика NACK равно 8, Боб должен интерпретировать поле NACKs как 32-байтовый хеш назначения и должен проверить, что он соответствует его хешу назначения. Он также должен проверить подпись пакета как обычно, поскольку она покрывает весь пакет, включая поля счетчика NACK и NACKs. Если счетчик NACK равен 8, а поле NACKs не совпадает, Боб должен отбросить пакет.

Это требуется для версий 0.9.58 и выше. Это обратно совместимо со старыми версиями, поскольку NACK не ожидаются в пакете SYNCHRONIZE. Destinations не знают и не могут знать, какая версия запущена на другом конце.

Никаких изменений не требуется для пакета SYNCHRONIZE ACK, отправляемого от Bob к Alice; не включайте NACK в этот пакет.

Справочники

Was this page helpful?