lsd0003

LSD0003: Set Union
Log | Files | Refs | README

commit ba17f27036edac9416753f41a3c26a09f12f1ada
parent 52ad87a6bd5fc5428b772dc9047e2660d84d8350
Author: Elias Summermatter <elias.summermatter@seccom.ch>
Date:   Thu,  3 Dec 2020 16:07:48 +0100

Added statemaschine digs and some more text

Diffstat:
Mdraft-summermatter-set-union.xml | 302+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
Astatemaschine/full_diag.jpg | 0
Astatemaschine/full_state_maschine.xml | 2++
3 files changed, 276 insertions(+), 28 deletions(-)

diff --git a/draft-summermatter-set-union.xml b/draft-summermatter-set-union.xml @@ -187,9 +187,30 @@ <section anchor="modeofoperation" numbered="true" toc="default"> <name>Mode of operation</name> + <t> + The set union protocol uses the above discussed topics Invertible Bloom Filter and Strata Estimators. + Depending on the state of the two sets there are different strategies or operation modes how to efficiently + determinate missing elements in two sets of two peers. + </t> <section anchor="modeofoperation_full-sync-client-with-bigger-set" numbered="true" toc="default"> <name>Full sync mode</name> - <t>--- TEXT HERE ---</t> + <t> + The simples mode is the full sync mode. The idea is that if the difference between the sets of the two + peers exceeds a certain threshold the overhead of determinate which elements are different overweight's + the overhead of sending the complete set. In this case its more efficient to just exchange the full set. + </t> + <t> + After the initiating peer (Client) opened a connection to the other peer (Server) the Server answers + with a SE(C) of his set and changes to the "Expecting IBF" state. When the client receives the SE(C) + from the server and the client set size is smaller or equal to the set size of the server the client + changes from the Expect SE State to Full Sending State and starts sending Full element requests containing the set + of the client. + If the set size of the client is larger than the servers set size the client changes into Full Receiving + (HINT: EXPECT IBF in code) mode an sends a Request Full message to the server. + </t> + <t> + If the Server receives + </t> </section> <section anchor="modeofoperation_individual-elements" numbered="true" toc="default"> <name>Individual element sync mode</name> @@ -412,11 +433,43 @@ <section anchor="messages_offer_description" numbered="true" toc="default"> <name>Description</name> <t> - Some description what this messages does + The offer message tells the other peer which hashes match a given IBF key. + This is needed to enable the peer to send a demand for a element that is missing + in the set. + </t> </section> <section anchor="messages_offer_structure" numbered="true" toc="default"> <name>Structure</name> + <figure anchor="figure_offer"> + <artwork name="" type="" align="left" alt=""><![CDATA[ + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | MSG SIZE | MSG TYPE | GNUNET HASH + +-----+-----+-----+-----+ + / / + / / + ]]></artwork> + <!-- <postamble>which is a very simple example.</postamble>--> + </figure> + <t>where:</t> + <dl> + <dt>MSG SIZE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which describes the size + of the message. + </dd> + <dt>MSG TYPE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which contains a message number + in the GNUNET Protocol. For this message the number is 562. + + </dd> + <dt>GNUNET HASH</dt> + <dd> + is a 512-bit GNUNET Hash of the element that is requested with a inquiry message. + </dd> + </dl> </section> </section> @@ -427,11 +480,41 @@ <section anchor="messages_inquiry_description" numbered="true" toc="default"> <name>Description</name> <t> - Some description what this messages does + The Inquiry message tells the other peer to send an offer containing the element hash for the given Key of the IBF. + NOTE: HERE IS AN IMPLEMENTATION BUG UNNECESSARY 32-BIT PADDING! </t> </section> <section anchor="messages_inquiry_structure" numbered="true" toc="default"> <name>Structure</name> + <figure anchor="figure_inquiry"> + <artwork name="" type="" align="left" alt=""><![CDATA[ + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | MSG SIZE | MSG TYPE | SALT | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | IBF KEY | + +-----+-----+-----+-----+-----+-----+-----+-----+ + ]]></artwork> + <!-- <postamble>which is a very simple example.</postamble>--> + </figure> + <t>where:</t> + <dl> + <dt>MSG SIZE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which describes the size + of the message. + </dd> + <dt>MSG TYPE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which contains a message number + in the GNUNET Protocol. For this message the number is 561. + + </dd> + <dt>IBF KEY</dt> + <dd> + is a 64-bit unsigned integer that contains the key for which the inquiry is sent. + </dd> + </dl> </section> </section> @@ -441,11 +524,40 @@ <section anchor="messages_demand_description" numbered="true" toc="default"> <name>Description</name> <t> - Some description what this messages does + The Demand message requests the whole element for a defined Hash from the other peer </t> </section> <section anchor="messages_demand_structure" numbered="true" toc="default"> <name>Structure</name> + <figure anchor="figure_demand"> + <artwork name="" type="" align="left" alt=""><![CDATA[ + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | MSG SIZE | MSG TYPE | GNUNET HASH + +-----+-----+-----+-----+ + / / + / / + ]]></artwork> + <!-- <postamble>which is a very simple example.</postamble>--> + </figure> + <t>where:</t> + <dl> + <dt>MSG SIZE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which describes the size + of the message. + </dd> + <dt>MSG TYPE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which contains a message number + in the GNUNET Protocol. For this message the number is 560. + + </dd> + <dt>GNUNET HASH</dt> + <dd> + is a 512-bit GNUNET Hash of the element that is demanded. + </dd> + </dl> </section> </section> @@ -455,11 +567,34 @@ <section anchor="messages_done_description" numbered="true" toc="default"> <name>Description</name> <t> - Some description what this messages does + The done message signals to the other peer that set operation is done </t> </section> <section anchor="messages_done_structure" numbered="true" toc="default"> <name>Structure</name> + <figure anchor="figure_done"> + <artwork name="" type="" align="left" alt=""><![CDATA[ + 0 8 16 24 32 + +-----+-----+-----+-----+ + | MSG SIZE | MSG TYPE | + +-----+-----+-----+-----+ + ]]></artwork> + <!-- <postamble>which is a very simple example.</postamble>--> + </figure> + <t>where:</t> + <dl> + <dt>MSG SIZE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which describes the size + of the message. + </dd> + <dt>MSG TYPE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which contains a message number + in the GNUNET Protocol. For this message the number is 568. + + </dd> + </dl> </section> </section> @@ -469,11 +604,34 @@ <section anchor="messages_full_done_description" numbered="true" toc="default"> <name>Description</name> <t> - Some description what this messages does + Signals to the other peer that all elements of the set have been sent. </t> </section> <section anchor="messages_full_done_structure" numbered="true" toc="default"> <name>Structure</name> + <figure anchor="figure_full_done"> + <artwork name="" type="" align="left" alt=""><![CDATA[ + 0 8 16 24 32 + +-----+-----+-----+-----+ + | MSG SIZE | MSG TYPE | + +-----+-----+-----+-----+ + ]]></artwork> + <!-- <postamble>which is a very simple example.</postamble>--> + </figure> + <t>where:</t> + <dl> + <dt>MSG SIZE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which describes the size + of the message. + </dd> + <dt>MSG TYPE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which contains a message number + in the GNUNET Protocol. For this message the number is 570. + + </dd> + </dl> </section> </section> @@ -483,11 +641,34 @@ <section anchor="messages_request_full_description" numbered="true" toc="default"> <name>Description</name> <t> - Some description what this messages does + Initiates a full sync and tells the other peer to send all elements. </t> </section> <section anchor="messages_request_full_structure" numbered="true" toc="default"> <name>Structure</name> + <figure anchor="figure_request_full"> + <artwork name="" type="" align="left" alt=""><![CDATA[ + 0 8 16 24 32 + +-----+-----+-----+-----+ + | MSG SIZE | MSG TYPE | + +-----+-----+-----+-----+ + ]]></artwork> + <!-- <postamble>which is a very simple example.</postamble>--> + </figure> + <t>where:</t> + <dl> + <dt>MSG SIZE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which describes the size + of the message. + </dd> + <dt>MSG TYPE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which contains a message number + in the GNUNET Protocol. For this message the number is 559. + + </dd> + </dl> </section> </section> @@ -497,11 +678,45 @@ <section anchor="messages_se_description" numbered="true" toc="default"> <name>Description</name> <t> - Some description what this messages does + The Strata Estimator message contains the strata estimator. </t> </section> <section anchor="messages_se_structure" numbered="true" toc="default"> <name>Structure</name> + <figure anchor="figure_se"> + <artwork name="" type="" align="left" alt=""><![CDATA[ + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | MSG SIZE | MSG TYPE | SETSIZE + +-----+-----+-----+-----+-----+-----+-----+-----+ + SETSIZE | SE-SLICES + +-----+-----+-----+-----+ + / / + / / + ]]></artwork> + <!-- <postamble>which is a very simple example.</postamble>--> + </figure> + <t>where:</t> + <dl> + <dt>MSG SIZE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which describes the size + of the message. + </dd> + <dt>MSG TYPE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which contains a message number + in the GNUNET Protocol. For this message the number is 564. + </dd> + <dt>SETSIZE</dt> + <dd> + is a 64-bit unsigned integer that is defined by the size of the set the SE is + </dd> + <dt>SE-SLICES</dt> + <dd> + is variable in size and contains the same structure as the IBF-SLICES field in the IBF message. + </dd> + </dl> </section> </section> @@ -511,12 +726,10 @@ <section anchor="messages_sec_description" numbered="true" toc="default"> <name>Description</name> <t> - Some description what this messages does + The Strata Estimator Compressed is the same message as the Strata Estimator message but the + field "SE-SLICES" is with gzip compressed and the MSG TYPE is 565. </t> </section> - <section anchor="messages_sec_structure" numbered="true" toc="default"> - <name>Structure</name> - </section> </section> @@ -526,26 +739,59 @@ <section anchor="messages_full_element_description" numbered="true" toc="default"> <name>Description</name> <t> - Some description what this messages does + The Full Element message sends a set of elements because of a peer full sync operation mode. </t> </section> <section anchor="messages_full_element_structure" numbered="true" toc="default"> <name>Structure</name> - </section> - </section> - - - <section anchor="messages_element_requests" numbered="true" toc="default"> - <name>Element Requests</name> - - <section anchor="messages_element_requests_description" numbered="true" toc="default"> - <name>Description</name> - <t> - Some description what this messages does - </t> - </section> - <section anchor="messages_element_requests_structure" numbered="true" toc="default"> - <name>Structure</name> + <figure anchor="figure_full_element"> + <artwork name="" type="" align="left" alt=""><![CDATA[ + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | MSG SIZE | MSG TYPE | E TYPE | PADDING | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | SIZE | AE TYPE | DATA + +-----+-----+-----+-----+ + / / + / / + ]]></artwork> + <!-- <postamble>which is a very simple example.</postamble>--> + </figure> + <t>where:</t> + <dl> + <dt>MSG SIZE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which describes the size + of the message. + </dd> + <dt>MSG TYPE</dt> + <dd> + is a 16-bit unsigned integer of the GNUNET header which contains a message number + in the GNUNET Protocol. For this message the number is 571. + </dd> + <dt>E TYPE</dt> + <dd> + element type is a 16-bit unsigned integer witch defines the element type for + the application. + </dd> + <dt>PADDING</dt> + <dd> + is 16-bit always set to zero + </dd> + <dt>E SIZE</dt> + <dd> + element size is 16-bit unsigned integer that signals the size of the elements data part. + </dd> + <dt>AE TYPE</dt> + <dd> + application specific element type is a 16-bit unsigned integer that is needed to identify + the type of element that is in the data field + </dd> + <dt>DATA</dt> + <dd> + is a field with variable length that contains the data of the element. + </dd> + </dl> </section> </section> diff --git a/statemaschine/full_diag.jpg b/statemaschine/full_diag.jpg Binary files differ. diff --git a/statemaschine/full_state_maschine.xml b/statemaschine/full_state_maschine.xml @@ -0,0 +1 @@ +<mxfile host="embed.diagrams.net" modified="2020-12-03T15:05:28.830Z" agent="5.0 (X11)" etag="UdxWVrhVWdTqgWMnNU7v" version="13.9.9" type="embed"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">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</diagram></mxfile> +\ No newline at end of file