Tento překlad byl vytvořen pomocí strojového učení a nemusí být 100% přesný. Zobrazit anglickou verzi

Specifikace streamovacího protokolu

Specifikace pro I2P streaming protokol poskytující spolehlivý transport podobný TCP

Přehled

Viz Streaming Library pro přehled Streaming protokolu.

Verze protokolu

Streaming protokol neobsahuje pole verze. Verze uvedené níže jsou pro Java I2P. Implementace a skutečná podpora kryptografie se mohou lišit. Neexistuje způsob, jak zjistit, zda vzdálená strana podporuje konkrétní verzi nebo funkci. Tabulka níže slouží jako obecné vodítko pro data vydání různých funkcí.

Funkce uvedené níže se týkají samotného protokolu. Různé možnosti konfigurace jsou dokumentovány v Streaming Library spolu s verzí Java I2P, ve které byly implementovány.

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
## Specifikace protokolu

Formát paketu

Formát jednotlivého paketu v streaming protokolu je zobrazen níže. Minimální velikost hlavičky, bez NACK nebo dat opcí, je 22 bajtů.

Ve streaming protokolu není žádné pole pro délku. Rámcování je poskytováno nižšími vrstvami - I2CP a 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 byte Integer : Náhodné číslo vybrané příjemcem paketu před odesláním prvního SYN odpovědi paketu a konstantní po celou dobu života připojení, větší než nula. 0 ve SYN zprávě odeslané původcem připojení a v následujících zprávách, dokud není přijata SYN odpověď obsahující stream ID protějšku.

receiveStreamId :: 4 bytový Integer : Náhodné číslo vybrané původcem paketu před odesláním prvního SYN paketu a konstantní po celou dobu života spojení, větší než nula. Může být 0, pokud není známo, například v RESET paketu.

sequenceNum :: 4 byte Integer : Sekvenční číslo pro tuto zprávu, začínající na 0 ve zprávě SYN a zvyšované o 1 v každé zprávě kromě prostých ACK a retransmisí. Pokud je sequenceNum 0 a příznak SYN není nastaven, jedná se o prostý ACK paket, který by neměl být potvrzován.

ackThrough :: 4 byte Integer : Nejvyšší pořadové číslo paketu, které bylo přijato na receiveStreamId. Toto pole je ignorováno v počátečním připojovacím paketu (kde receiveStreamId je neznámé id) nebo pokud je nastaven příznak NO_ACK. Všechny pakety až do tohoto pořadového čísla (včetně) jsou potvrzeny (ACKed), KROMĚ těch uvedených v NACK níže.

Počet NACK :: 1 byte Integer : Počet 4-bajtových NACK v následujícím poli, nebo 8 když se používá společně s SYNCHRONIZE pro prevenci opakování od verze 0.9.58; viz níže.

NACKs :: nc * 4 byte Integer s : Pořadová čísla menší než ackThrough, která ještě nebyla přijata. Dva NACKs paketu představují žádost o ‘rychlé opětovné odeslání’ tohoto paketu. Od verze 0.9.58 se také používá společně se SYNCHRONIZE pro zabránění replay útokům; viz níže.

resendDelay :: 1 bajt Integer : Jak dlouho bude tvůrce tohoto paketu čekat před jeho opětovným odesláním (pokud ještě nebyl potvrzen ACK). Hodnota je v sekundách od vytvoření paketu. V současnosti se při příjmu ignoruje.

flags :: 2 bytová hodnota : Viz níže.

velikost option :: 2 byte Integer : Počet bytů v následujícím poli

option data :: 0 nebo více bytů : Podle specifikace flags. Viz níže.

payload :: zbývající velikost paketu

Pole příznaků a dat voleb

Pole flags výše specifikuje některá metadata o paketu a může vyžadovat, aby byla zahrnuta určitá dodatečná data. Flags jsou následující. Všechny specifikované datové struktury musí být přidány do oblasti options v daném pořadí.

Pořadí bitů: 15….0 (15 je MSB)

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.
### Poznámky k podpisům proměnné délky

Před vydáním 0.9.11 byl podpis v poli možností vždy 40 bajtů.

Od verze 0.9.11 má podpis proměnnou délku. Typ a délka podpisu se odvozují z typu klíče použitého v možnosti FROM_INCLUDED a z dokumentace Signature .

Od verze 0.9.39 je podporována možnost OFFLINE_SIGNATURE. Pokud je tato možnost přítomna, přechodný SigningPublicKey se používá k ověření všech podepsaných paketů a délka a typ podpisu jsou odvozeny z přechodného SigningPublicKey v této možnosti.

  • Když paket obsahuje jak FROM_INCLUDED, tak SIGNATURE_INCLUDED (jako v SYNCHRONIZE), lze odvození provést přímo.

  • Když paket neobsahuje FROM_INCLUDED, závěr musí být učiněn z předchozího SYNCHRONIZE paketu.

  • Když paket neobsahuje FROM_INCLUDED a nebyl žádný předchozí SYNCHRONIZE paket (například zbloudilý CLOSE nebo RESET paket), lze odvození provést z délky zbývajících opcí (protože SIGNATURE_INCLUDED je poslední opcí), ale paket bude pravděpodobně zahozen, protože není k dispozici FROM pro validaci podpisu. Pokud budou v budoucnu definována další pole opcí, musí být zohledněna.

Prevence opětovného přehrání

Aby se zabránilo Bobovi v použití útoku opětovného přehrání uložením platného podepsaného SYNCHRONIZE paketu přijatého od Alice a jeho pozdějším odesláním oběti Charlie, musí Alice zahrnout Bobův destination hash do SYNCHRONIZE paketu následovně:

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

Po přijetí SYNCHRONIZE, pokud je pole NACK count 8, musí Bob interpretovat pole NACKs jako 32-bajtový hash destinace a musí ověřit, že odpovídá jeho hash destinace. Musí také obvyklým způsobem ověřit podpis paketu, protože pokrývá celý paket včetně polí NACK count a NACKs. Pokud je NACK count 8 a pole NACKs neodpovídá, musí Bob paket zahodit.

Toto je vyžadováno pro verze 0.9.58 a vyšší. Toto je zpětně kompatibilní se staršími verzemi, protože NACK nejsou očekávány v SYNCHRONIZE paketu. Destinations neznají a nemohou vědět, jakou verzi druhá strana používá.

Pro SYNCHRONIZE ACK paket odeslaný z Boba do Alice není nutná žádná změna; nezahrnujte NACK do tohoto paketu.

Reference

Was this page helpful?