Ü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 Version | Streaming Features |
|---|---|
| 0.9.58 | Bob's hash in NACKs field of SYN packet |
| 0.9.39 | OFFLINE_SIGNATURE option |
| 0.9.36 | I2CP protocol number enforced |
| 0.9.20 | FROM_INCLUDED no longer required in RESET |
| 0.9.18 | PINGs and PONGs may include a payload |
| 0.9.15 | EdDSA Ed25519 sig type |
| 0.9.12 | ECDSA P-256, P-384, and P-521 sig types |
| 0.9.11 | Variable-length signatures |
| 0.7.1 | Protocol numbers defined in I2CP |
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)
| Bit | Flag | Option Order | Option Data | Function |
|---|---|---|---|---|
| 0 | SYNCHRONIZE | -- | -- | Similar to TCP SYN. Set in the initial packet and in the first response. FROM_INCLUDED and SIGNATURE_INCLUDED must also be set. |
| 1 | CLOSE | -- | -- | 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. |
| 2 | RESET | -- | -- | Abnormal close. SIGNATURE_INCLUDED must also be set. Prior to release 0.9.20, due to a bug, FROM_INCLUDED must also be set. |
| 3 | SIGNATURE_INCLUDED | 5 | variable length Signature | Currently 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. |
| 4 | SIGNATURE_REQUESTED | -- | -- | Unused. Requests every packet in the other direction to have SIGNATURE_INCLUDED |
| 5 | FROM_INCLUDED | 2 | 387+ byte Destination | Currently 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. |
| 6 | DELAY_REQUESTED | 1 | 2 byte Integer | Optional 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. |
| 7 | MAX_PACKET_SIZE_INCLUDED | 3 | 2 byte Integer | The maximum length of the payload. Send with SYNCHRONIZE. |
| 8 | PROFILE_INTERACTIVE | -- | -- | Unused or ignored; the interactive profile is unimplemented. |
| 9 | ECHO | -- | -- | Unused except by ping programs. If set, most other options are ignored. See the streaming docs. |
| 10 | NO_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. |
| 11 | OFFLINE_SIGNATURE | 4 | variable length OfflineSig | Contains 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-15 | unused | Set to zero for compatibility with future uses. |
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
- [Destination] Destination
- [Integer] Integer
- [OfflineSig] OfflineSignature
- [Signature] Signature
- [SigningPrivateKey] SigningPrivateKey
- [SigningPublicKey] SigningPublicKey
- [STREAMING] Streaming-Bibliothek