more docs on swarm connections
This commit is contained in:
parent
fc685a6f0b
commit
0166a89d48
2 changed files with 62 additions and 1 deletions
61
swarm/HowConnectionsWork.txt
Normal file
61
swarm/HowConnectionsWork.txt
Normal file
|
@ -0,0 +1,61 @@
|
|||
This document is related to "SwamConnectionFlow.txt", but should probably be read first. This is not a discussion of how other ipfs implementations
|
||||
work, but rather how the c-ipfs implementation works now. Over time, implementation details may change. But the following will (should?) make
|
||||
other implementations happy to have c-ipfs join the swarm.
|
||||
|
||||
To make this document a little less confusing, let me define some terms:
|
||||
|
||||
connection - a network connection. It could be a pipe, a tcp connection, or anything else. For now, we're only handling TCP
|
||||
|
||||
connection message - a simple struct to store the bytes, the size of the bytes, and any error conditions
|
||||
|
||||
connection handler - an instance of a connection handler handles the traffic across 1 connection
|
||||
|
||||
stream handler - a routine that processes a byte array (coming from / going to) a (stream handler / connection), and can return with a byte array that
|
||||
may (probably will) be sent back to the same (stream handler / connection ).
|
||||
|
||||
Stream handlers are chained together. They pass a connection message, and expect a connection message in return. Let's work with an example.
|
||||
|
||||
A possible (and normal) setup is that incoming data is received by the connection,
|
||||
passed to a multistream stream handler, which unwraps it and passes it to a secio stream handler, which unwraps it and passes it to a multistream
|
||||
stream handler, which unwraps it, and passes it to a yamux stream handler, which unwraps it and determines that it is a kademlia message. It looks up its
|
||||
kademlia stream handler, which unwraps it, processes it, and returns a response (Note: NULL is a valid response, meaning don't bother sending anything
|
||||
back). Then the chain is traversed in the opposite direction.
|
||||
|
||||
connection handler
|
||||
- Multistream
|
||||
-- Secio
|
||||
--- Multistream
|
||||
---- Yamux
|
||||
----- Kademlia
|
||||
---- Yamux
|
||||
--- Multistream
|
||||
-- Secio
|
||||
- Multistream
|
||||
connection handler
|
||||
|
||||
Now lets work with another example.
|
||||
|
||||
A client wants to send a kademlia message to another peer. It asks the peer for its kademlia stream handler (which will create one if necessary), and
|
||||
passes the handler its message. The kademlia handler passes that data to yamux, which passes it to multistream, which passes it to secio, which
|
||||
passes it to multistream, which passes it to the connection handler, which actually sends the message across the wire. Any results are returned in
|
||||
a connection message.
|
||||
|
||||
User has a Kademlia message to send
|
||||
- Kademlia handler
|
||||
-- yamux handler
|
||||
--- Multistream handler
|
||||
---- Secio handler
|
||||
----- Multistream handler
|
||||
------ connection handler
|
||||
----- Multistream handler
|
||||
---- Secio handler
|
||||
--- Multistream handler
|
||||
-- yamux handler
|
||||
- Kademlia handler
|
||||
User processes the response
|
||||
|
||||
Why so much complexity? Because servers can choose to communicate in a variety of ways. It is up to you and the server to decide if you want to
|
||||
talk to each other. You can choose to not use secio, or replace yamux with another stream muxer, etc. You can choose to have multiple connections
|
||||
to one server, or use a stream muxer.
|
||||
|
||||
Now, after all of the discussion above, read the document "SwarmConnectionFlow.txt" to see the typical way swarm peers are connected.
|
|
@ -25,7 +25,7 @@ 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 2 bytes (167, 4) (not sure why just yet)
|
||||
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
|
||||
|
||||
|
|
Loading…
Reference in a new issue