Prop. 159 updates
This commit is contained in:
@ -5,7 +5,7 @@ SSU2
|
||||
:author: eyedeekay, orignal, zlatinb, zzz
|
||||
:created: 2021-09-12
|
||||
:thread: http://zzz.i2p/topics/2612
|
||||
:lastupdated: 2022-04-02
|
||||
:lastupdated: 2022-04-10
|
||||
:status: Open
|
||||
:target: 0.9.56
|
||||
|
||||
@ -82,11 +82,14 @@ Design Goals
|
||||
- Make implementation easier by allowing for standard flow control
|
||||
algorithms.
|
||||
|
||||
- Increase speed and reduce latency.
|
||||
- Reduce setup latency.
|
||||
Median setup time is currently about 135 ms for NTCP2 and 187 ms for SSU,
|
||||
even though NTCP2 has an additional round trip; replacing ElGamal in
|
||||
SSU2 should reduce it, but other changes may also help.
|
||||
|
||||
- Maintain or increase maximum throughput compared to SSU 1,
|
||||
as measured over a range of simulated latencies and packet drop percentages on a testnet.
|
||||
|
||||
- Prevent traffic amplification attacks from spoofed source addresses
|
||||
via "address validation".
|
||||
|
||||
@ -156,7 +159,8 @@ Design Goals
|
||||
- Reduce the complexity required to implement I2NP message fragmentation.
|
||||
Bypass fragmentation mechanisms and encoding for complete I2NP messages.
|
||||
|
||||
- Minimize protocol overhead before padding. While padding will be added,
|
||||
- Minimize protocol overhead before padding, especially for ACKs.
|
||||
While padding will be added,
|
||||
overhead before padding is still overhead.
|
||||
Low-bandwidth nodes must be able to use SSU2.
|
||||
|
||||
@ -2857,6 +2861,9 @@ For Session Confirmed, before header encryption:
|
||||
|
||||
{% endhighlight %}
|
||||
|
||||
See the Session Confirmed Fragmentation section below for more information
|
||||
about the frag field.
|
||||
|
||||
|
||||
For Data messages, before header encryption:
|
||||
|
||||
@ -5086,15 +5093,16 @@ Options Issues:
|
||||
RouterInfo
|
||||
``````````
|
||||
Pass Alice's RouterInfo to Bob.
|
||||
Used in Session Confirmed part 2.
|
||||
Pass Alice's RouterInfo to Bob, or Bob's to Alice.
|
||||
Used optionally in the data phase.
|
||||
Used in Session Confirmed part 2 payload only.
|
||||
Not to be used in the data phase; use an
|
||||
I2NP DatabaseStore Message instead.
|
||||
|
||||
Minimum Size: About 420 bytes, unless the router identity and
|
||||
signature in the router info are compressible, which is unlikely.
|
||||
|
||||
NOTE: Unlike in NTCP2, the Router Info may be fragmented.
|
||||
Session setup is not complete until all fragments are received.
|
||||
NOTE: The Router Info block is never fragmented.
|
||||
The frag field is always 0/1.
|
||||
See the Session Confirmed Fragmentation section above for more information.
|
||||
|
||||
|
||||
.. raw:: html
|
||||
@ -5121,8 +5129,8 @@ Session setup is not complete until all fragments are received.
|
||||
bits 7-2: Unused, set to 0 for future compatibility
|
||||
frag :: 1 byte fragment info:
|
||||
bit order: 76543210 (bit 7 is MSB)
|
||||
bits 7-4: fragment number 0-14, big endian
|
||||
bits 3-0: total fragments 1-15, big endian
|
||||
bits 7-4: fragment number, always 0
|
||||
bits 3-0: total fragments, always 1, big endian
|
||||
|
||||
routerinfo :: Alice's or Bob's RouterInfo
|
||||
|
||||
@ -5131,14 +5139,6 @@ Session setup is not complete until all fragments are received.
|
||||
|
||||
Notes:
|
||||
|
||||
- When used in the data phase, receiver (Alice or Bob) shall validate that
|
||||
it's the same Router Hash as originally sent (for Alice) or sent to (for Bob).
|
||||
Then, treat it as a local I2NP DatabaseStore Message. Validate signature,
|
||||
validate more recent timestamp, and store in the local netdb.
|
||||
If the flag bit 0 is 1, and the receiving party is floodfill,
|
||||
treat it as a DatabaseStore Message with a nonzero reply token,
|
||||
and flood it to the nearest floodfills.
|
||||
|
||||
- The Router Info is optionally compressed with gzip,
|
||||
as indicated by flag bit 1.
|
||||
This is different from NTCP2, where it is never compressed,
|
||||
@ -5148,7 +5148,7 @@ Notes:
|
||||
but is very beneficial for large Router Infos with several
|
||||
compressible Router Addresses.
|
||||
Compression is recommended if it allows a Router Info to fit
|
||||
in a single message without fragmentation.
|
||||
in a single Session Confirmed packet without fragmentation.
|
||||
|
||||
- Maximum size of first or only fragment in the Session Confirmed message:
|
||||
MTU - 113 for IPv4 or MTU - 133 for IPv6.
|
||||
@ -5161,22 +5161,9 @@ Notes:
|
||||
94% of current router infos are smaller than 1147 witout gzipping.
|
||||
97% of current router infos are smaller than 1147 when gzipped.
|
||||
|
||||
- TO BE REMOVED, see Session Confirmed Fragmentation above for the replacement mechanism.
|
||||
Maximum size of a follow-on fragment in a Data message:
|
||||
MTU - TBD for IPv4 or MTU - TBD for IPv6.
|
||||
Assuming 1500 byte default MTU, and no other blocks in the message,
|
||||
TBD for IPv4 or TBD for IPv6.
|
||||
Assuming 1280 byte minimum MTU, and no other blocks in the message,
|
||||
TBD for IPv4 or TBD for IPv6.
|
||||
|
||||
- If the Router Info is compressed AND fragmented,
|
||||
the data is compressed first and then fragmented.
|
||||
The fragments are not individually compressed.
|
||||
|
||||
- State machine handling and retransmission for a fragmented router info
|
||||
in the handshake will be quite complex; it would be much easier
|
||||
to simply require the router info to be unfragmented,
|
||||
and avoid outbound SSU2 connections if the local router info is too large.
|
||||
- The frag byte is now unused, the Router Info block is never fragmented.
|
||||
The frag byte must be set to fragment 0, total fragments 1.
|
||||
See the Session Confirmed Fragmentation section above for more information.
|
||||
|
||||
- Flooding must not be requested unless there are published
|
||||
RouterAddresses in the RouterInfo. The receiving router
|
||||
@ -5184,23 +5171,12 @@ Notes:
|
||||
RouterAddresses in it.
|
||||
|
||||
- This protocol does not provide an acknowledgment that the RouterInfo
|
||||
was stored or flooded (either in the handshake or data phase).
|
||||
was stored or flooded.
|
||||
If acknowledgment is desired, and the receiver is floodfill,
|
||||
the sender should instead send a standard I2NP DatabaseStoreMessage
|
||||
with a reply token.
|
||||
|
||||
|
||||
Issues:
|
||||
|
||||
- May also be used in data phase, instead of a I2NP DatabaseStoreMessage.
|
||||
For example, Bob could use it to start off the data phase.
|
||||
However, may NOT be fragmented in the data phase; use
|
||||
a I2NP DatabaseStoreMessage instead.
|
||||
|
||||
- Is it allowed for this to contain the RI for routers other than the
|
||||
originator, as a general replacement for DatabaseStoreMessages,
|
||||
e.g. for flooding by floodfills?
|
||||
|
||||
|
||||
I2NP Message
|
||||
````````````
|
||||
@ -5250,7 +5226,6 @@ This uses the same 9 bytes for the I2NP header
|
||||
as in [NTCP2]_ (type, message id, short expiration).
|
||||
|
||||
Total number of fragments is not specified.
|
||||
TODO include total length so that receiver can allocate a buffer?
|
||||
|
||||
|
||||
.. raw:: html
|
||||
@ -5267,13 +5242,13 @@ TODO include total length so that receiver can allocate a buffer?
|
||||
+----+----+----+----+----+----+----+----+
|
||||
|
||||
blk :: 4
|
||||
size :: 2 bytes, big endian, size of type + msg id + exp + partial message to follow
|
||||
size :: 2 bytes, big endian, size of data to follow
|
||||
Fragment size is (size - 9).
|
||||
type :: 1 byte, I2NP msg type, see I2NP spec
|
||||
msg id :: 4 bytes, big endian, I2NP message ID
|
||||
short exp :: 4 bytes, big endian, I2NP message expiration, Unix timestamp, unsigned seconds.
|
||||
Wraps around in 2106
|
||||
message :: Partial I2NP message body, bytes 0 - (size -1)
|
||||
message :: Partial I2NP message body, bytes 0 - (size - 10)
|
||||
|
||||
{% endhighlight %}
|
||||
|
||||
@ -5310,11 +5285,11 @@ An additional fragment (fragment number greater than zero) of an I2NP message.
|
||||
+----+----+----+----+----+----+----+----+
|
||||
|
||||
blk :: 5
|
||||
size :: 2 bytes, big endian, size of frag + msg id + partial message to follow
|
||||
size :: 2 bytes, big endian, size of data to follow
|
||||
Fragment size is (size - 5).
|
||||
frag :: Fragment info:
|
||||
Bit order: 76543210 (bit 7 is MSB)
|
||||
bits 7-1: fragment # 1 - 127 (0 not allowed)
|
||||
bits 7-1: fragment number 1 - 127 (0 not allowed)
|
||||
bit 0: isLast (1 = true)
|
||||
msg id :: 4 bytes, big endian, I2NP message ID
|
||||
message :: Partial I2NP message body
|
||||
@ -5941,9 +5916,7 @@ or Bob's address, sent to Bob by Alice.
|
||||
|
||||
Intro Key
|
||||
``````````````
|
||||
Sent by Alice in the Session Confirmed, when the RI
|
||||
is fragmented, so that Bob may encrypt
|
||||
the header for ACKs before receiving and verifying the full RI.
|
||||
UNUSED, to be removed
|
||||
|
||||
.. raw:: html
|
||||
|
||||
@ -6377,63 +6350,6 @@ A token received on IPv4 may not be used for IPv6 or vice versa.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Router Info Fragmentation
|
||||
===========================
|
||||
|
||||
TO BE REMOVED, see Session Confirmed Fragmentation above for the replacement mechanism.
|
||||
|
||||
SSU 1 contains a mechanism for Router Identity fragmentation in the Session Confirmed message
|
||||
but it is unused, as the Router Identity is only 391 bytes
|
||||
(387 for old DSA-SHA1 routers) and so fragmentation was never required.
|
||||
The full Router Info was sent in a subsequent I2NP database store message in the data phase
|
||||
and was fragmented as necessary.
|
||||
|
||||
In SSU2, the full Router Info is sent in the Session Confirmed message
|
||||
(as in NTCP2), and validation of the signature
|
||||
(and matching the static key in the Router Identity to that received in the Noise handshake)
|
||||
is a vital part of the handshake.
|
||||
|
||||
Median Router Info sizes in the network are about 800 bytes, with a maximum size
|
||||
of about 2000 bytes (uncompressed) or 1300 bytes (compressed).
|
||||
Maximum Router Info sizes are expected to increase in the future,
|
||||
due to additional Router Addresses.
|
||||
If both SSU and SSU2 addresses are supported, or if multiple addresses for
|
||||
different IPv4 or IPv6 IPs are supported (currently supported by i2pd but not Java i2p)
|
||||
the sizes could increase significantly.
|
||||
|
||||
The Router Info block supports optional gzip compression.
|
||||
Compression is optional because it usually is of little benefit
|
||||
for small Router Infos, where there is little compressible content,
|
||||
but is very beneficial for large Router Infos with several
|
||||
compressible Router Addresses.
|
||||
Compression is recommended if it allows a Router Info to fit
|
||||
in a single message without fragmentation.
|
||||
|
||||
While a typical MTU and Router Info size would allow the Router Info to be sent
|
||||
unfragmented, fragmentation will be necessary and this protocol must support it.
|
||||
The Router Info block contains a fragmentation field (unlike in NTCP2 where it is not required).
|
||||
|
||||
If fragmentation is required, the first fragment is sent in the Session Confirmed message,
|
||||
and subsequent fragments are sent in Data messages.
|
||||
However, the session must be considered as in a pending state until all Router Info
|
||||
fragments are received by Bob.
|
||||
|
||||
Alice must NOT send any I2NP blocks before all Router Info blocks are sent.
|
||||
Alice MAY send I2NP blocks in the same message as the last RouterInfo fragment.
|
||||
Bob MUST either queue or discard any I2NP blocks received from Alice before all Router Info blocks
|
||||
are received and the signature and static key are validated.
|
||||
Bob must NOT send any I2NP blocks to Alice before all Router Info blocks
|
||||
are received and the signature and static key are validated.
|
||||
|
||||
TODO: Another alternative to fragmentation is to make the RI much more compressible,
|
||||
by padding the Router Identity (between the two keys) with zeros.
|
||||
This would be 320 bytes of zeros assuming a 32-byte X25519 crypto key and
|
||||
a 32-byte EdDSA signing key.
|
||||
|
||||
|
||||
|
||||
I2NP Message Fragmentation
|
||||
===========================
|
||||
|
||||
|
Reference in New Issue
Block a user