96 lines
No EOL
3.4 KiB
Text
96 lines
No EOL
3.4 KiB
Text
This is a rough outline of how the existing GO version connects to the swarm. This was engineered by parsing log files. So some details may be missing
|
|
or inaccurate.
|
|
|
|
Conneting to the swarm:
|
|
|
|
0) Network connection
|
|
|
|
1) Negotiate Multistream
|
|
|
|
2) Negotiate secio
|
|
|
|
3) Negotiate Multistream over secio
|
|
|
|
4) Negotiate yamux over multistrem over secio. They should reply with the yamux protocol id. Then there are about 6 streams. It appears that odd number
|
|
streams are opened by the "client" and even numbered streams by the "server".
|
|
|
|
It does not seem that these streams are synchronized with one another, although each stream must complete its transmission before another can be sent
|
|
(i.e. yamux header + all data must be sent before another stream can use the connection)
|
|
|
|
The miscellaneous bytes sent still have to be sorted as to why and when they should be sent.
|
|
|
|
Stream 1: Us sending the ID protocol and ID message
|
|
Send a Window Update
|
|
They will send one back
|
|
Send multistream protocol id (18 bytes) plus \n (1 byte)
|
|
Send id protocol (?? bytes) plus \n (1 byte)
|
|
Receive ID protocol back (16 bytes)
|
|
Receive yamux header with 2 bytes (167, 4) (not sure why just yet, but it looks like the id protocol sends the size, then the bytes, and yamux wraps them both)
|
|
Receive 551 bytes (with yamux header) must be the id protocol blob
|
|
Receive window update
|
|
|
|
Stream 2: // them sending the ID protocol and ID message
|
|
They send us a window update
|
|
We send one back
|
|
We send the multistream protocol id (18 bytes) plus \n (1 byte)
|
|
They send the multistream protocol id back
|
|
They send us the id protocol id
|
|
We send the protocol id back
|
|
We send a yamux header with 2 bytes, {161, 4}
|
|
We send a yamux header with 545 bytes
|
|
We send a window update
|
|
We receive a window update
|
|
|
|
Stream 3: // us setting up the kademlia protocol
|
|
Send a window update
|
|
They will send one back
|
|
We receive a multistream protocol id
|
|
We send a yamux protocol id
|
|
We send a multistream protocol id
|
|
We send a yamux header with 1 byte (16)
|
|
We send a kad protocol id
|
|
We receive the kad protocol id back
|
|
We send a window update
|
|
|
|
Stream 4: // them setting up the circuit relay protocol
|
|
They send us a window update
|
|
We send one back
|
|
We send the multistream protocol
|
|
We receive the yamux header with 1 bytes (19)
|
|
We receive the multistream protocol id
|
|
We receive the yamux header with 1 byte (28)
|
|
We receive the circuit relay protocol id
|
|
We send the circuit relay protocol id back
|
|
We recieve the yamux header with 1 byte (2)
|
|
We receive the yamux header with 2 bytes (8, 4)
|
|
We send the value 5 back
|
|
We then send the values { 8, 3, 32, 142, 2 }
|
|
We send a window update
|
|
We receive a window update
|
|
|
|
Stream 5: // us setting up the circuit relay protocol
|
|
We send a window update
|
|
We receive a window update
|
|
We receive the multistream protocol id
|
|
We send the multistream protocol id
|
|
We send a yamux header with 1 byte (28)
|
|
We send the circuit relay protocol id
|
|
We receive the circuit relay protocol id back
|
|
We send the value (2)
|
|
We send a yamux header with 2 decimals (8, 2)
|
|
We read a yamux header with 1 decimal (5)
|
|
We read a yamux header with 5 decimals (8, 3, 32, 142, 2)
|
|
We receive a window update
|
|
We send a window update
|
|
|
|
Stream 6: // them setting up the kademlia protocol
|
|
We receive a window update
|
|
We send them a window update
|
|
We send the multistream protocol id
|
|
We received the decimal (19)
|
|
We receive the multistream protocol id
|
|
We receive the decimal (16)
|
|
We receive the kad protocol id
|
|
We send the kad protocol id back
|
|
We receive a winodw update
|
|
We send a window update |