Diese Übersetzung wurde mittels maschinellem Lernen erstellt und ist möglicherweise nicht 100% korrekt. Englische Version anzeigen

Streaming Protocol Spezifikation

Spezifikation für das I2P-Streaming-Protokoll, das eine TCP-ähnliche zuverlässige Übertragung bereitstellt

Überblick

Siehe Streaming Library für einen Überblick über das Streaming-Protokoll.

Protokollversionen

Das Streaming-Protokoll enthält kein Versionsfeld. Die unten aufgeführten Versionen gelten für Java I2P. Implementierungen und tatsächliche Krypto-Unterstützung können variieren. Es gibt keine Möglichkeit zu bestimmen, ob das entfernte Ende eine bestimmte Version oder Funktion unterstützt. Die untenstehende Tabelle dient als allgemeine Orientierung bezüglich der Veröffentlichungsdaten für verschiedene Funktionen.

Die unten aufgeführten Funktionen beziehen sich auf das Protokoll selbst. Verschiedene Konfigurationsoptionen sind in der Streaming Library zusammen mit der Java I2P-Version dokumentiert, in der sie implementiert wurden.

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
## Protokoll-Spezifikation

Paketformat

Das Format eines einzelnen Pakets im Streaming-Protokoll wird unten gezeigt. Die minimale Header-Größe, ohne NACKs oder Optionsdaten, beträgt 22 Bytes.

Es gibt kein Längenfeld im Streaming-Protokoll. Die Rahmenbildung wird von den unteren Schichten bereitgestellt - I2CP und 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 : Zufallszahl, die vom Paketempfänger vor dem Senden des ersten SYN-Antwortpakets ausgewählt wird und für die Lebensdauer der Verbindung konstant bleibt, größer als null. 0 in der SYN-Nachricht, die vom Verbindungsinitiator gesendet wird, und in nachfolgenden Nachrichten, bis eine SYN-Antwort empfangen wird, die die Stream-ID des Peers enthält.

receiveStreamId :: 4 Byte Integer : Zufallszahl, die vom Paket-Urheber vor dem Senden des ersten SYN-Pakets ausgewählt und für die Lebensdauer der Verbindung konstant ist, größer als null. Kann 0 sein, falls unbekannt, zum Beispiel in einem RESET-Paket.

sequenceNum :: 4 Byte Integer : Die Sequenznummer für diese Nachricht, beginnend bei 0 in der SYN-Nachricht und um 1 in jeder Nachricht erhöht, außer bei einfachen ACKs und Neuübertragungen. Wenn die sequenceNum 0 ist und das SYN-Flag nicht gesetzt ist, handelt es sich um ein einfaches ACK-Paket, das nicht bestätigt werden sollte.

ackThrough :: 4 Byte Integer : Die höchste Paket-Sequenznummer, die auf der receiveStreamId empfangen wurde. Dieses Feld wird beim ersten Verbindungspaket ignoriert (wo receiveStreamId die unbekannte ID ist) oder wenn das NO_ACK-Flag gesetzt ist. Alle Pakete bis einschließlich dieser Sequenznummer werden mit ACK bestätigt, AUSSER denen, die in den NACKs unten aufgelistet sind.

NACK-Anzahl :: 1 Byte Integer : Die Anzahl der 4-Byte-NACKs im nächsten Feld, oder 8 wenn zusammen mit SYNCHRONIZE für Replay-Schutz ab 0.9.58 verwendet; siehe unten.

NACKs :: nc * 4 Byte Integer s : Sequenznummern kleiner als ackThrough, die noch nicht empfangen wurden. Zwei NACKs eines Pakets sind eine Anfrage für eine ‘schnelle Wiederübertragung’ dieses Pakets. Wird seit 0.9.58 auch zusammen mit SYNCHRONIZE zur Replay-Verhinderung verwendet; siehe unten.

resendDelay :: 1 Byte Integer : Wie lange wird der Ersteller dieses Pakets warten, bevor er dieses Paket erneut sendet (falls es noch nicht bestätigt wurde). Der Wert sind Sekunden seit der Paketerstellung. Wird derzeit beim Empfang ignoriert.

flags :: 2-Byte-Wert : Siehe unten.

option size :: 2 Byte Integer : Die Anzahl der Bytes im nächsten Feld

option data :: 0 oder mehr Bytes : Wie durch die Flags spezifiziert. Siehe unten.

payload :: verbleibende Paketgröße

Flags und Optionsdatenfelder

Das Flags-Feld oben spezifiziert einige Metadaten über das Paket und kann wiederum erfordern, dass bestimmte zusätzliche Daten eingeschlossen werden. Die Flags sind wie folgt. Alle spezifizierten Datenstrukturen müssen dem Optionsbereich in der angegebenen Reihenfolge hinzugefügt werden.

Bit-Reihenfolge: 15….0 (15 ist 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.
### Hinweise zu Signaturen mit variabler Länge

Vor Release 0.9.11 war die Signatur im Optionsfeld immer 40 Bytes lang.

Ab Version 0.9.11 ist die Signatur von variabler Länge. Der Signatur-Typ und die Länge werden aus dem Schlüsseltyp abgeleitet, der in der FROM_INCLUDED-Option verwendet wird, und aus der Signature -Dokumentation.

Ab Release 0.9.39 wird die OFFLINE_SIGNATURE-Option unterstützt. Wenn diese Option vorhanden ist, wird der transiente SigningPublicKey verwendet, um alle signierten Pakete zu verifizieren, und die Signaturlänge und der Typ werden aus dem transienten SigningPublicKey in der Option abgeleitet.

  • Wenn ein Paket sowohl FROM_INCLUDED als auch SIGNATURE_INCLUDED enthält (wie bei SYNCHRONIZE), kann die Schlussfolgerung direkt gezogen werden.

  • Wenn ein Paket kein FROM_INCLUDED enthält, muss die Ableitung aus einem vorherigen SYNCHRONIZE-Paket erfolgen.

  • Wenn ein Paket kein FROM_INCLUDED enthält und es kein vorheriges SYNCHRONIZE-Paket gab (zum Beispiel ein verirrtes CLOSE- oder RESET-Paket), kann die Schlussfolgerung aus der Länge der verbleibenden Optionen gezogen werden (da SIGNATURE_INCLUDED die letzte Option ist), aber das Paket wird wahrscheinlich trotzdem verworfen, da kein FROM verfügbar ist, um die Signatur zu validieren. Falls in Zukunft weitere Optionsfelder definiert werden, müssen diese berücksichtigt werden.

Replay-Schutz

Um zu verhindern, dass Bob einen Replay-Angriff durchführt, indem er ein gültiges signiertes SYNCHRONIZE-Paket von Alice speichert und es später an ein Opfer Charlie sendet, muss Alice Bobs Destination-Hash wie folgt in das SYNCHRONIZE-Paket einbinden:

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

Nach dem Empfang einer SYNCHRONIZE muss Bob, wenn das NACK-Anzahl-Feld 8 ist, das NACKs-Feld als einen 32-Byte-Destination-Hash interpretieren und überprüfen, dass dieser mit seinem Destination-Hash übereinstimmt. Er muss auch wie üblich die Signatur des Pakets verifizieren, da diese das gesamte Paket einschließlich der NACK-Anzahl- und NACKs-Felder abdeckt. Wenn die NACK-Anzahl 8 ist und das NACKs-Feld nicht übereinstimmt, muss Bob das Paket verwerfen.

Dies ist für Versionen 0.9.58 und höher erforderlich. Dies ist rückwärtskompatibel mit älteren Versionen, da NACKs in einem SYNCHRONIZE-Paket nicht erwartet werden. Destinations wissen nicht und können nicht wissen, welche Version am anderen Ende läuft.

Für das SYNCHRONIZE ACK-Paket, das von Bob an Alice gesendet wird, ist keine Änderung erforderlich; NACKs dürfen nicht in diesem Paket enthalten sein.

Referenzen

Was this page helpful?