From 8e4bfbbd9459bd4a8c090627d5b3f1295eeb42bd Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Thu, 28 Apr 2022 14:56:52 +0200 Subject: [PATCH] Updated documentation --- docs/manual/_sources/understanding.rst.txt | 109 ++++++++++---------- docs/manual/searchindex.js | 2 +- docs/manual/understanding.html | 111 +++++++++++---------- docs/source/understanding.rst | 109 ++++++++++---------- 4 files changed, 169 insertions(+), 162 deletions(-) diff --git a/docs/manual/_sources/understanding.rst.txt b/docs/manual/_sources/understanding.rst.txt index cec9078..0f579ae 100644 --- a/docs/manual/_sources/understanding.rst.txt +++ b/docs/manual/_sources/understanding.rst.txt @@ -287,8 +287,8 @@ In Reticulum, destinations are allowed to move around the network at will. This protocols such as IP, where an address is always expected to stay within the network segment it was assigned in. This limitation does not exist in Reticulum, and any destination is *completely portable* over the entire topography of the network, and *can even be moved to other Reticulum networks* than the one it was created in, and -still be reachable. To update it's reachability, a destination simply needs to send an announce on any -networks it is part of. +still become reachable. To update it's reachability, a destination simply needs to send an announce on any +networks it is part of. After a short while, it will be globally reachable in the network. Seeing how *single* destinations are always tied to a private/public key pair leads us to the next topic. @@ -298,21 +298,22 @@ Identities ---------- In Reticulum, an *identity* does not necessarily represent a personal identity, but is an abstraction that -can represent any kind of *verified entity*. This could very well be a person, but it could also be the +can represent any kind of *verifiable entity*. This could very well be a person, but it could also be the control interface of a machine, a program, robot, computer, sensor or something else entirely. In general, any kind of agent that can act, or be acted upon, or store or manipulate information, can be represented as an identity. An *identity* can be used to create any number of destinations. -As we have seen, a *single* destination will always have an *identity* tied to it, but not *plain* or *group* +A *single* destination will always have an *identity* tied to it, but not *plain* or *group* destinations. Destinations and identities share a multilateral connection. You can create a destination, and if it is not connected to an identity upon creation, it will just create a new one to use automatically. This may be desirable in some situations, but often you will probably want to create the identity first, and then use it to create new destinations. -Building upon the simple messenger example, we could use an identity to represent the user of the -application. Destinations created will then be linked to this identity to allow communication to -reach the user. In all cases it is of great importance to store the private keys associated with any -Reticulum Identity securely and privately. +As an example, we could use an identity to represent the user of a messaging application. +Destinations can then be created by this identity to allow communication to reach the user. +In all cases it is of great importance to store the private keys associated with any +Reticulum Identity securely and privately, since obtaining access to the identity keys equals +obtaining access and controlling reachability to any destinations created by that identity. .. _understanding-gettingfurther: @@ -331,20 +332,16 @@ In the following sections, two concepts that allow this will be introduced, *pat Reticulum Transport =================== -The term routing has been purposefully avoided until now. The current methods of routing used in IP-based -networks are fundamentally incompatible with the physical link types that Reticulum was designed to handle. -These routing methodologies assume trust at the physical layer, and often needs a lot more bandwidth than -Reticulum can assume is available. +The methods of routing used in traditional networks are fundamentally incompatible with the physical medium +types and circumstances that Reticulum was designed to handle. These mechanisms mostly assume trust at the physical layer, +and often needs a lot more bandwidth than Reticulum can assume is available. Since Reticulum is designed to +survive running over open radio spectrum, no such trust can be assumed, and bandwidth is often very limited. -Since Reticulum is designed to survive running over open radio spectrum, no such trust exists, and bandwidth -is often very limited. Existing routing protocols like BGP or OSPF carry too much overhead to be practically -useable over bandwidth-limited, high-latency links. - -To overcome such challenges, Reticulum’s *Transport* system uses public-key cryptography to +To overcome such challenges, Reticulum’s *Transport* system uses asymmetric elliptic curve cryptography to implement the concept of *paths* that allow discovery of how to get information closer to a certain destination. It is important to note that no single node in a Reticulum network knows the complete path to a destination. Every Transport node participating in a Reticulum network will only -know what the most direct way to get a packet one hop closer to it's destination is. +know the most direct way to get a packet one hop closer to it's destination. .. _understanding-nodetypes: @@ -354,13 +351,13 @@ Node Types Currently, Reticulum distinguishes between two types of network nodes. All nodes on a Reticulum network are *Reticulum Instances*, and some are alo *Transport Nodes*. If a system running Reticulum is fixed in -one place, and is intended to be kept available most of the time, it can be a *Transport Node*, by enabling -it in the configuration. +one place, and is intended to be kept available most of the time, it is a good contender to be a *Transport Node*. +Any Reticulum Instance can become a Transport Node by enabling it in the configuration. This distinction is made by the user configuring the node, and is used to determine what nodes on the network will help forward traffic, and what nodes rely on other nodes for wider connectivity. -If a node is a *Instance* it should be given the configuration directive ``enable_transport = No``, which +If a node is an *Instance* it should be given the configuration directive ``enable_transport = No``, which is the default setting. If it is a *Transport Node*, it should be given the configuration directive ``enable_transport = Yes``. @@ -371,37 +368,37 @@ If it is a *Transport Node*, it should be given the configuration directive ``en The Announce Mechanism in Detail -------------------------------- -When an *announce* is transmitted by from a Reticulum instance, it will be forwarded by any transport node receiving it, but -according to some specific rules: +When an *announce* for a destination is transmitted by from a Reticulum instance, it will be forwarded by +any transport node receiving it, but according to some specific rules: * | If this exact announce has already been received before, ignore it. -* | If not, record into a table which node the announce was received from, and how many times in +* | If not, record into a table which Transport Node the announce was received from, and how many times in total it has been retransmitted to get here. -* | If the announce has been retransmitted *m+1* times, it will not be forwarded. By default, *m* is +* | If the announce has been retransmitted *m+1* times, it will not be forwarded any more. By default, *m* is set to 128. -* | The announce will be assigned a delay *d* = c\ :sup:`h` seconds, where *c* is a decay constant, and *h* is the amount of times this packet has already been forwarded. +* | After a randomised delay, the announce will be retransmitted on all interfaces that have bandwidth + available for processing announces. By default, the maximum bandwidth allocation for processing + announces is set at 2%, but can be configured on a per-interface basis. -* | The packet will be given a priority *p = 1/d*. +* | If any given interface does not have enough bandwidth available for retransmitting the announce, + the announce will be assigned a priority inversely proportional to it's hop count, and be inserted + into a queue managed by the interface. -* | If at least *d* seconds has passed since the announce was received, and no other packets with a - priority higher than *p* are waiting in the queue, and the channel is - not utilized by other traffic, the announce will be forwarded. +* | When the interface has bandwidth available for processing an announce, it will prioritise announces + for destinations that are closest in terms of hops, thus prioritising reachability and connectivity + of local nodes, even on slow networks that connect to wider and faster networks. -* | If no other nodes are heard retransmitting the announce with a greater hop count than when - it left this node, transmitting it will be retried *r* times. By default, *r* is set to 1. Retries - follow same rules as above, with the exception that it must wait for at least *d* = c\ :sup:`h+1` + - t + rand(0, rw) seconds. This amount of time is equal to the amount of time it would take the next - node to retransmit the packet, plus a random window. By default, *t* is set to 10 seconds, and the - random window *rw* is set to 10 seconds. +* | After the announce has been re-transmitted, and if no other nodes are heard retransmitting the announce + with a greater hop count than when it left this node, transmitting it will be retried *r* times. By default, + *r* is set to 1. -* | If a newer announce from the same destination arrives, while an identical one is already in - the queue, the newest announce is discarded. If the newest announce contains different - application specific data, it will replace the old announce, but will use *d* and *p* of the old - announce. +* | If a newer announce from the same destination arrives, while an identical one is already waiting + to be transmitted, the newest announce is discarded. If the newest announce contains different + application specific data, it will replace the old announce. Once an announce has reached a node in the network, any other node in direct contact with that node will be able to reach the destination the announce originated from, simply by sending a packet @@ -409,16 +406,16 @@ addressed to that destination. Any node with knowledge of the announce will be a packet towards the destination by looking up the next node with the shortest amount of hops to the destination. -According to these rules and default constants, an announce will propagate throughout the network -in a predictable way. +According to these rules, an announce will propagate throughout the network in a predictable way, +and make the announced destination reachable in a short amount of time. Fast networks that have the +capacity to process many announces can reach full convergence very quickly, even when constantly adding +new destinations. Slower segments of such networks might take a bit longer to gain full knowledge about +the wide and fast networks they are connected to, but can still do so over time, while prioritising full +and quickly converging end-to-end connectivity for their local, slower segments. -As an example, in a network based only on radio transceivers with an average link distance of 15 -kilometers, an announce will be able to propagate outwards over 12 hops, to a radius of 180 -kilometers, in approximately 20 minutes. - -The design and constants of the decay and delay functionality in the announce propagation is subject -to change and optimisation as real-world usage is explored. The announce propagation speed can be -increased at the cost of increased bandwidth consumption. +In general, even extremely complex networks, that utilize the maximum 128 hops will converge to full +end-to-end connectivity in about one minute, given there is enough bandwidth available to process +the required amount of announces. .. _understanding-paths: @@ -465,7 +462,7 @@ For exchanges of small amounts of information, Reticulum offers the *Packet* API For exchanges of larger amounts of data, or when longer sessions of bidirectional communication is desired, Reticulum offers the *Link* API. To establish a *link*, the following process is employed: * | First, the node that wishes to establish a link will send out a special packet, that - traverses the network and locates the desired destination. Along the way, the nodes that + traverses the network and locates the desired destination. Along the way, the Transport Nodes that forward the packet will take note of this *link request*. * | Second, if the destination accepts the *link request* , it will send back a packet that proves the @@ -476,15 +473,19 @@ For exchanges of larger amounts of data, or when longer sessions of bidirectiona * | When the validity of the *link* has been accepted by forwarding nodes, these nodes will remember the *link* , and it can subsequently be used by referring to a hash representing it. -* | As a part of the *link request* , a Diffie-Hellman key exchange takes place, that sets up an - efficiently encrypted tunnel between the two nodes, using elliptic curve cryptography. As such, - this mode of communication is preferred, even for situations when nodes can directly communicate, - when the amount of data to be exchanged numbers in the tens of packets. +* | As a part of the *link request*, an Elliptic Curve Diffie-Hellman key exchange takes place, that sets up an + efficiently encrypted tunnel between the two nodes. As such, this mode of communication is preferred, + even for situations when nodes can directly communicate, when the amount of data to be exchanged numbers + in the tens of packets, or whenever the use of the more advanced API functions is desired. * | When a *link* has been set up, it automatically provides message receipt functionality, through the same *proof* mechanism discussed before, so the sending node can obtain verified confirmation that the information reached the intended recipient. +* | Once the *link* has been set up, the initiator can remain anonymous, or choose to authenticate towards + the destination using a Reticulum Identity. This authentication is happening inside the encrypted + link, and is only revealed to the verified destination, and no intermediaries. + In a moment, we will discuss the details of how this methodology is implemented, but let’s first recap what purposes this methodology serves. We first ensure that the node answering our request is actually the one we want to communicate with, and not a malicious actor pretending to be so. diff --git a/docs/manual/searchindex.js b/docs/manual/searchindex.js index 8145939..d60d7c2 100644 --- a/docs/manual/searchindex.js +++ b/docs/manual/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["examples","gettingstartedfast","index","interfaces","networks","reference","understanding","using","whatis"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["examples.rst","gettingstartedfast.rst","index.rst","interfaces.rst","networks.rst","reference.rst","understanding.rst","using.rst","whatis.rst"],objects:{"RNS.Destination":{announce:[5,1,1,""],app_and_aspects_from_name:[5,1,1,""],clear_default_app_data:[5,1,1,""],create_keys:[5,1,1,""],decrypt:[5,1,1,""],deregister_request_handler:[5,1,1,""],encrypt:[5,1,1,""],full_name:[5,1,1,""],get_private_key:[5,1,1,""],hash:[5,1,1,""],hash_from_name_and_identity:[5,1,1,""],load_private_key:[5,1,1,""],register_request_handler:[5,1,1,""],set_default_app_data:[5,1,1,""],set_link_established_callback:[5,1,1,""],set_packet_callback:[5,1,1,""],set_proof_requested_callback:[5,1,1,""],set_proof_strategy:[5,1,1,""],sign:[5,1,1,""]},"RNS.Identity":{CURVE:[5,2,1,""],KEYSIZE:[5,2,1,""],TRUNCATED_HASHLENGTH:[5,2,1,""],decrypt:[5,1,1,""],encrypt:[5,1,1,""],from_bytes:[5,1,1,""],from_file:[5,1,1,""],full_hash:[5,1,1,""],get_private_key:[5,1,1,""],get_public_key:[5,1,1,""],get_random_hash:[5,1,1,""],load_private_key:[5,1,1,""],load_public_key:[5,1,1,""],recall:[5,1,1,""],recall_app_data:[5,1,1,""],sign:[5,1,1,""],to_file:[5,1,1,""],truncated_hash:[5,1,1,""],validate:[5,1,1,""]},"RNS.Link":{CURVE:[5,2,1,""],ESTABLISHMENT_TIMEOUT_PER_HOP:[5,2,1,""],KEEPALIVE:[5,2,1,""],get_remote_identity:[5,1,1,""],identify:[5,1,1,""],inactive_for:[5,1,1,""],no_inbound_for:[5,1,1,""],no_outbound_for:[5,1,1,""],request:[5,1,1,""],set_packet_callback:[5,1,1,""],set_remote_identified_callback:[5,1,1,""],set_resource_callback:[5,1,1,""],set_resource_concluded_callback:[5,1,1,""],set_resource_started_callback:[5,1,1,""],set_resource_strategy:[5,1,1,""],teardown:[5,1,1,""]},"RNS.Packet":{ENCRYPTED_MDU:[5,2,1,""],PLAIN_MDU:[5,2,1,""],resend:[5,1,1,""],send:[5,1,1,""]},"RNS.PacketReceipt":{get_rtt:[5,1,1,""],get_status:[5,1,1,""],set_delivery_callback:[5,1,1,""],set_timeout:[5,1,1,""],set_timeout_callback:[5,1,1,""]},"RNS.RequestReceipt":{get_progress:[5,1,1,""],get_request_id:[5,1,1,""],get_response:[5,1,1,""],get_response_time:[5,1,1,""],get_status:[5,1,1,""]},"RNS.Resource":{advertise:[5,1,1,""],cancel:[5,1,1,""],get_progress:[5,1,1,""]},"RNS.Reticulum":{ANNOUNCE_CAP:[5,2,1,""],MTU:[5,2,1,""],should_use_implicit_proof:[5,1,1,""],transport_enabled:[5,1,1,""]},"RNS.Transport":{PATHFINDER_M:[5,2,1,""],deregister_announce_handler:[5,1,1,""],has_path:[5,1,1,""],hops_to:[5,1,1,""],next_hop:[5,1,1,""],next_hop_interface:[5,1,1,""],register_announce_handler:[5,1,1,""],request_path:[5,1,1,""]},RNS:{Destination:[5,0,1,""],Identity:[5,0,1,""],Link:[5,0,1,""],Packet:[5,0,1,""],PacketReceipt:[5,0,1,""],RequestReceipt:[5,0,1,""],Resource:[5,0,1,""],Reticulum:[5,0,1,""],Transport:[5,0,1,""]}},objnames:{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","attribute","Python attribute"]},objtypes:{"0":"py:class","1":"py:method","2":"py:attribute"},terms:{"0":[0,3,5,6,8],"00":[6,7],"000":[],"00000000":6,"00000100":6,"00000111":6,"01":6,"01010000":6,"02":[],"05":0,"07":[],"1":[0,3,5,6,7],"10":[0,3,6,7],"100":[0,3,6],"1000":0,"10000000":6,"1024":0,"11":6,"115200":[3,7],"12":[3,6],"1200":6,"125":3,"125000":3,"127":3,"128":[5,6,8],"13":7,"14":6,"141":[],"15":[3,6],"150":[3,7],"150m":3,"151":6,"16":[3,7],"17":7,"18":[],"180":6,"182":[],"187":7,"2":[0,3,5,6,7],"20":[0,3,6,7],"200":[3,7],"2000000":[],"205":[],"211":[],"23":7,"237":[6,8],"24":3,"240":[],"25":[0,2,8],"255":3,"256":[5,6],"27":7,"270":[],"2f":0,"3":[0,6,7,8],"30":7,"323":[],"33":6,"34":[],"360":5,"3600":0,"367":[],"37":[],"37428":7,"38":7,"383":5,"3e12fc71692f8ec47bc5":1,"3w3lha":[],"4":[6,7],"409":[],"4242":3,"430":6,"45":0,"460":[],"469":7,"476":5,"477":6,"48555":3,"49":7,"49555":3,"4965":[1,7],"5":[0,3,5],"500":[5,6,8],"5001":3,"507":5,"512":[3,5],"5245a8efe1788c6a70e1":7,"55":3,"56b115c30cd386cad69c":7,"5urvjicpzi7q3ybztsef4i5ow2aq4soktfj7zedz53s47r54jnqq":3,"60":0,"600":3,"62":[6,8],"63":7,"64":[6,7],"7":3,"72":3,"74":7,"77":6,"7c565719ec7a8cdb1fe2":[],"7ca6f4e4dc26ae329e61":[],"8":[0,3,7],"80":[5,6,7],"8001":3,"80e29bf7cccaf31431b3":6,"83":[6,7],"86":7,"867":3,"867200000":3,"868":6,"88":3,"9":7,"900":6,"9382f334de63217a4278":7,"95":6,"\u00ec2pd":3,"abstract":6,"break":[5,6,8],"byte":[0,5,6,7,8],"case":[1,3,4,6,7],"class":[0,2,4,8],"default":[0,1,3,4,5,6],"do":[0,1,3,5,6,7,8],"export":1,"final":6,"float":[0,5],"function":[0,1,2,3,4,5,8],"import":[0,1,3,4,6],"int":0,"long":[0,3,6],"new":[0,3,4,5,6,7],"public":[0,2,3,5],"return":[0,5],"short":[6,7],"static":5,"switch":[3,6],"throw":[],"true":[0,1,3,5,7],"try":[0,2,3],"while":[0,1,3,4,5,6,8],A:[0,1,3,4,5,6,8],And:0,As:[1,4,5,6,8],At:[4,6],Be:[5,7],But:6,By:[0,1,3,5,6],For:[1,3,4,5,6,8],IF:[],IN:[0,5],If:[0,1,3,4,5,6,7,8],In:[0,1,3,4,5,6,7,8],It:[0,1,3,5,6,7,8],No:[3,6,8],On:[0,1,3,7],One:5,Or:3,That:6,The:[0,1,2,3,4,5,8],Then:1,There:[1,4,6,8],These:[1,3,6,7],To:[0,1,3,4,6,7,8],Will:5,With:[2,3,4,6,7],_:6,__:6,______:6,_______:6,________:6,________________:6,__init__:0,__main__:0,__name__:0,_exit:0,aarch64:1,ab:0,abil:1,abl:[0,1,4,5,6,7],about:[0,1,3,4,5,6],abov:[1,3,6],absolut:[1,8],accept:[5,6],accept_al:[0,5],accept_app:5,accept_non:5,access:[1,3,4,5,6,7],access_point:3,accomod:6,accord:6,accordingli:0,acheiv:[3,6],achiev:[5,6],acknowledg:8,across:4,act:[1,5,6],action:0,activ:[0,1,5,6],actor:6,actual:[0,1,3,6],ad:[0,2,4,5,8],adapt:4,add:[0,1,3,4,7],add_argu:0,addit:[6,8],addr1:[],addr2:[],address:[0,1,3,4,5,6,8],adher:5,admin:3,administr:7,adress:[0,1,4,5,6,8],advantag:5,adversari:1,advertis:[0,5],advis:6,ae:[6,8],after:[0,4,6,7],again:[1,3,6],against:6,agenc:6,agent:6,agnost:[4,6],agnostic:6,aim:[2,6],air:8,airtim:3,aliv:[5,6],all:[0,1,2,3,4,5,6,7,8],alloc:[3,5,6,7],allow:[0,1,3,4,5,6,7,8],allow_al:[0,5],allow_list:5,allow_non:5,allowed_list:5,almost:[3,6],alo:6,alon:3,along:[4,6],alreadi:[0,1,4,6],als:[],also:[0,1,3,4,5,6,7,8],alter:6,altern:[0,3,7],although:[6,8],alwai:[1,5,6,7],amateur:[3,8],amet:[],amount:[3,4,5,6,8],an:[0,1,3,4,5,6,7,8],android:2,ani:[0,1,3,4,5,6,7,8],announc:[2,3,5],announce_cap:[3,5],announce_handl:0,announced_ident:[0,5],announceloop:0,announcesampl:0,anonym:[1,4,5,6,8],anoth:[1,5,6,7],answer:[6,7],anymor:1,anyon:[0,1,4,5,6],anyth:[3,6],anywher:[0,3],ap:3,apart:[],api:[1,2,6,8],apk:1,app:[0,1,5,6],app_and_aspects_from_nam:5,app_data:[0,5],app_nam:[0,5],app_timeout:0,append:[0,6],appli:[5,6],applic:[0,4,5,6,7],approach:[6,7],approv:6,approxim:6,apt:1,ar:[0,1,3,4,5,6,7,8],arbitrari:[5,6],arbritrari:8,architectur:1,area:[3,4,6,8],arg:0,argon:0,argpars:0,argument:[0,5,7],argumentpars:0,arm64:2,around:6,arriv:[0,6],ask:[0,5],aspect:[0,3,5,6],aspect_filt:[0,5],assign:[6,7],associ:[1,5,6],assum:[3,6],asymmetr:8,attached_interfac:[],attack:1,attempt:5,attribut:5,audit:8,authent:[1,3,4,5,6,8],author:6,auto:[2,5,6],auto_compress:5,autoconfigur:[3,8],autodiscov:3,autointerfac:[3,7],autom:6,automat:[0,1,3,4,5,6,7,8],autonom:[4,6],autoomat:0,avail:[0,1,3,4,5,6,7,8],availadbl:[],averag:6,avoid:[6,7],awai:[0,4,6,7],awar:6,ax25kissinterfac:3,ax:[2,8],b32:[1,3],b:[0,4],back:[0,6,8],background:[1,3],backhaul:4,band:6,bandwidth:[1,3,4,5,6,8],bare:0,barrier:6,base32:3,base:[2,3,4,5,6,7,8],basi:[5,6,8],basic:[0,1,2],baud:3,beacon:3,beam:[],becaus:[4,6],becki:0,becom:[0,1,4],been:[0,1,3,4,5,6,8],befor:[0,1,5,6,7],begin:[0,5],begun:5,behaviour:3,behind:[1,6],being:[3,5,6],beings:6,belief:6,below:[1,3],benefici:7,best:[1,6,8],beta:8,better:3,between:[0,3,4,5,6],bgp:6,bi:6,bidirect:6,billion:[4,6],bin:7,binari:[0,1,6],bind:3,bit:[3,5,6,7,8],bitrat:3,blob:[0,6],block:3,board:[1,6,8],boot:7,both:[1,3,4,5,6,8],bp:[],bridg:2,briefli:6,bring:3,broadcast:[1,2,3,5,6],broadcast_destin:0,broadcastloop:0,brought:[3,7],browser:1,buffer:3,bug:8,build:[0,1,2,3,6,8],built:[1,6,8],bundl:0,c:[0,4,6],cabl:4,cad:[],calcul:[5,6],call:[0,4,5,6,8],callabl:5,callback:[0,5],callsign:3,can:[0,1,2,3,4,5,6,7],cancel:5,candid:4,cannot:0,capabl:6,capac:[5,6],carambola:0,care:[1,5,8],carefulli:1,cargo_build_target:1,carri:[3,5,6],carrier:[4,8],caution:3,caveat:2,cb:6,cbc:8,cd:1,cdma:3,censor:6,censorship:6,central:[4,6],centralis:6,certain:[0,3,4,6],challeng:6,chang:[0,1,3,5,6,7,8],channel:[0,3,4,6,8],channelarg:0,chapter:[1,3,4,6,8],charact:0,characterist:6,cheap:6,check:[0,1,5],checksum:[5,8],choos:[0,1,3],choosen:6,chose:6,chosen:4,chunk:0,ciphertext:5,ciphertext_token:5,cl:0,clear:[0,5,6],clear_default_app_data:5,clear_screen:0,client:[0,1,2,5],client_connect:0,client_disconnect:0,client_ident:0,client_loop:0,client_packet_receiv:0,client_request:0,clone:1,close:[0,4,5],closed_callback:5,closer:6,cluster:6,co:8,code:[1,2,3,6],codingr:3,com:[0,1],combin:[1,4,6],come:[1,6],comma:3,command:[0,1,7],comment:3,common:[1,2,4,6,8],commun:[0,1,3,4,5,6,7,8],compat:[1,3,5,6],compil:1,complet:[0,1,4,5,6,8],complex:6,compon:6,compos:6,compress:[0,5,6],comput:[1,6,8],concaten:5,concept:[2,6],conclud:[0,5],concurr:[6,7],condit:6,config:[0,1,4,7],configarg:0,configdir:5,configpath:0,configur:[0,1,2,3,4,5,6,8],confirm:[6,8],confus:6,congest:6,conjunct:3,connect:[0,2,3,4,5,6,7,8],consequ:[],consid:[6,8],consider:[],consist:6,constant:[5,6],construct:6,consumpt:6,contact:6,contain:[0,4,5,6],content:[4,7],context:6,continu:8,control:[0,1,3,4,5,6],conveni:0,convent:0,converg:2,coordin:[4,5,6,8],core:[4,6,8],correct:[0,6],correctli:0,correspond:6,cost:[6,8],could:[0,1,3,4,5,6,8],count:6,counter:0,cours:[3,6],cover:[6,8],coverag:4,cpu:0,creat:[0,2,3,4,5,6,7],create_kei:5,create_receipt:[0,5],creation:6,creator:6,critic:6,cryptograph:[4,8],cryptographi:[1,6,8],ctrl:0,cull:5,current:[0,1,2,3,5,6],current_download:0,current_filenam:0,curv:[4,5,6,8],curve25519:[4,5,6,8],custom:[3,5,6],custom_network_nam:3,customis:3,d:[4,6,7],daemon:[1,3,5,7],dai:4,data:[0,1,3,4,5,6,8],data_port:3,databit:[3,7],date:[0,1],db:0,dbm:[0,3],debian:[6,7],debug:[],decai:6,decid:[4,5,6],decod:0,decrypt:[5,6],dedic:6,deep:1,def:0,default_timeout:[],defin:[0,3,6],definit:6,degrad:4,degre:3,delai:[1,6,7],deliv:[0,5],deliveri:[0,1,5,8],demand:5,demonstr:[0,3],depend:[1,4,7],deploi:6,deregist:5,deregister_announce_handl:5,deregister_request_handl:5,deriv:[6,8],describ:[3,5,6],descript:[0,7],design:[1,4,6,8],desir:[0,3,6],destin:[0,1,2,3,4,7],destination_1:0,destination_2:0,destination_clos:0,destination_hash:[0,5,7],destination_hexhash:0,detail:[0,1,2,3,5,7,8],detect:0,determin:[1,5,6],dev:[1,3,7],develop:[2,6,8],devic:[1,2,3,4,5,6,7],dh:5,dhcp:3,did:0,differ:[0,1,3,4,5,6,7,8],diffi:[4,6,8],difficult:1,digit:[6,8],dir:0,direct:[0,1,4,5,6],directli:[3,5,6,7,8],directori:[0,7],disabl:[3,6],disable_encrypt:[],disappear:3,disassoci:6,discard:6,disconnect:0,discov:1,discover:3,discoveri:[3,6,7],discovery_port:3,discovery_scop:3,discrimin:4,discuss:[1,6],disk:[0,5],displai:[0,6],dissolv:4,distanc:6,distant:5,distinct:[3,6],distinguish:6,distribut:[0,1,4,5,6,7],divmod:0,document:6,doe:[0,1,2,3,4,5,6],doesn:3,dolor:[],domain:[1,3],don:[0,1,4,5],done:[0,1,4,6],dori:4,dot:[6,7],down:0,downgrad:[],download:[0,3],download_began:0,download_conclud:0,download_finish:0,download_start:0,download_tim:0,driver:[7,8],droid:1,drop:[5,6,7],due:4,duplex:[6,8],dynam:[1,7],e702c42ba8:7,e:[0,4],each:[0,1,3,4,6],earli:1,earlier:6,eas:[3,6],easi:[1,3,6,7,8],easier:[1,4,7],easiest:[1,3,6],easili:[4,6,7,8],eca6f4e4dc26ae329e61:7,ecdh:[6,8],echo:[1,2,7],echo_destin:0,echo_request:0,ed25519:[6,8],edit:1,effeci:[],effici:[0,1,3,6,8],ei:0,either:[3,4,6],elaps:3,elif:0,ellipt:[4,5,6,8],els:[0,4,6],emploi:6,emptor:2,emul:1,enabl:[1,3,4,5,6,7],enable_transport:6,encapsul:[3,8],encod:0,encrypt:[0,1,4,5,6,8],encrypted_mdu:5,encryptionless:[],end:[0,4,5,6,8],endless:3,endpoint:[0,4,5,6],energi:1,engin:[],enhanc:6,enough:1,ensur:[5,6],enter:0,entir:[4,6],entiti:6,entri:[0,1,6],enumer:0,environ:[1,4,6],environment:6,environmentlogg:6,ephemer:[4,5,6,8],equal:[4,6],equip:[4,6],equival:3,equl:[],error:[0,1],especi:3,essenti:[1,6],establish:[0,1,3,4,5,8],established_callback:5,establishment_timeout_per_hop:5,etc:7,eth0:3,eth1:3,ethernet:[1,3,4,6,8],even:[1,4,6,7,8],event:3,eventu:5,everi:[0,3,4,5,6],everyon:[4,6],everyth:[0,4,6],evolv:4,exact:6,exactli:[5,6],exampl:[1,2,3,5,6,7,8],example_util:[0,7],exampleannouncehandl:0,exce:[0,5],except:[0,3,6],exchang:[4,5,6,8],exclud:6,execstart:7,execstartpr:7,execut:[0,1,5,7],exhaust:6,exist:[0,1,3,6,8],exit:[0,1,5,7],exit_handl:0,expand:6,expect:[0,3,5,6,7],experi:[1,6],experiment:[1,8],expiri:3,explain:5,explan:6,explicit:5,explicitli:[],explor:[0,6,8],expos:[3,5],extend:[0,1,5],extern:[1,3,5,8],extra:[1,3,4,7],extrem:[1,8],f:1,fa7ddfab5213f916dea:6,face:1,fact:8,factor:3,fail:[0,5],failed_callback:[0,5],failur:1,fals:[0,3,5],far:[4,6],fast:[2,5],faster:1,fastest:[3,6],featur:[1,6,8],feed:5,feedback:0,feel:1,fernet:8,few:[1,3,4,6,7,8],fewer:5,fibr:8,field:6,file:[0,1,3,4,5,6,7,8],file_resourc:0,file_s:0,filelist:0,filelist_data:0,filelist_receiv:0,filelist_timeout_job:0,filenam:0,filetransf:[1,2,5],filter:[0,4,6],find:[4,6],firewal:[1,3],firmwar:[1,6],first:[0,1,3,5,6],fit:0,five:0,fix:[2,6],flag:[5,6],flexibl:[3,8],flow:[3,4],flow_control:3,flush:0,folder:1,follow:[0,1,3,6,7,8],forcibl:5,foreground:1,foremost:8,form:[1,3,4,5,6],format:[0,2,8],forth:0,forward:[3,5,6,8],forward_ip:3,forward_port:3,found:[0,1,3,4,6,7],four:4,frame:3,frankfurt:[1,7],free:[4,8],freedom:6,freeli:6,frequenc:[3,6],frequent:3,friendli:8,from:[0,1,3,4,5,6,7,8],from_byt:5,from_fil:5,fromhex:0,fruit:0,ftdi_ft230x_basic_uart_43891ckm:7,full:[0,3,5,6,7,8],full_hash:5,full_nam:[5,7],fulli:[6,8],funcion:5,fundament:6,further:[1,2],futur:[4,6],g:0,ga:0,galact:6,gatekeep:6,gatewai:[1,4],gbp:7,gen:[],gener:[0,1,3,4,5,6,8],generalis:8,geograph:4,get:[0,2,3,5,8],get_packet_rssi:0,get_packet_snr:0,get_private_kei:5,get_progress:[0,5],get_public_kei:5,get_random_hash:[0,5],get_remote_ident:[0,5],get_request_id:5,get_respons:5,get_response_tim:5,get_rtt:[0,5],get_statu:5,geti2p:3,ghz:6,gi:0,gigabyt:8,gipsum:[],git:1,github:[0,1],give:[3,6,7],given:[3,4,5,6],global:[0,1,3,4,6,8],go:[0,1,6],goal:[2,3],good:[4,6],got:0,got_respons:0,govern:6,grape:0,graphic:1,great:6,greater:6,greatli:3,group:[3,5,6],group_id:3,grow:4,growth:2,guarante:[1,6],guess:3,guid:[1,5,6],h:[1,6,7],ha:[0,1,3,4,5,6,8],had:6,half:[6,8],hand:[0,1],handheld:6,handl:[0,3,4,5,6,7,8],handler:[0,5],happen:[0,5],hardlin:4,hardwar:[1,3,4,5,6,8],has_path:[0,5],hasattr:0,hash1:6,hash2:6,hash:[0,1,5,6,7],hash_from_name_and_ident:5,hashmap:0,have:[0,1,3,4,5,6,7],hazard:5,head:1,header:6,header_1:6,header_2:6,header_typ:[],hear:6,heard:[5,6],helium:0,hellman:[4,6,8],help:[0,4,6,7,8],her:4,here:[0,1,3,6,7],hexadecim:[0,6,7],hide:1,high:[3,6,8],higher:[4,6,8],highli:6,hill:4,hint:0,hit:0,hmac:8,hoc:8,hold:[5,6],home:4,homebrew:3,hop:[4,5,6,7,8],hops_to:5,host:[0,1,3,6,7],hostnam:3,hour:0,how:[0,1,3,4,6,8],howev:[1,4],http:[0,1],hub:3,huge:[],human:[0,5,6],i2p:[1,2,8],i2p_tunnel:3,i2pd:1,i2pinterfac:[1,3],i:0,id:[3,5,6,7],id_callsign:3,id_interv:3,idea:6,ideal:8,ident:[0,1,2,8],identif:[2,3,8],identifi:[0,3,5,6],identify:6,identifyexampl:0,ie:[],if00:7,ifac:[6,7],ifac_s:3,ifconfig:7,ignor:[3,5,6],ignored_devic:3,illustr:4,immedi:[1,7],impact:6,implement:[0,4,5,6,8],implic:3,implicit:[5,6],imposs:6,improv:[2,3],inactive_for:5,inbound:[3,5],includ:[0,2,3,5,6],incom:[0,3,5],incompat:[5,6],increas:[3,6],incur:3,indefinit:[],independ:[5,6],independt:8,index:[0,1,2],indirectli:6,individu:[5,6],inevit:6,infer:6,info:[5,6],inform:[0,1,2,4,5,6],infrastructur:[1,3,4,6],ingo:5,initi:[0,4,5,6,8],initialis:[0,5,7],input:0,insert:6,inspect:[1,3,4],instal:[1,3,4,7,8],instanc:[0,2,3,5,6,7],instanti:5,instead:[0,3,6,7],integr:[4,6],intend:[4,6],intention:6,inter:5,interact:[0,1,5,6],interchang:3,interconnect:[2,6],interest:6,interfac:[0,2,4,5,6,7],interface_en:[1,3,7],interface_mod:[],intermitt:3,intern:[3,5],internet:[2,3,6,8],interoper:[1,4,6,8],interv:[3,5],intiat:0,introduc:6,introduct:2,intuit:8,invalid:[0,5],investig:4,invis:[1,3],involv:4,io:[1,7],ip:[1,3,6,8],ipsum:[],ipv6:3,is_connected_to_shared_inst:0,is_request:[],is_respons:[],isdir:0,isfil:0,island:4,ism:6,isol:3,issu:4,its:[5,6],itself:[2,6],iv:8,job:0,join:[0,1,4,6],just:[0,1,3,4,6,8],k:0,kb:7,kbp:7,keep:[0,4,5,6,7,8],keepal:[5,6],kei:[0,2,4,5,8],kept:[3,4,5,6],kernel:[3,7,8],keyboardinterrupt:0,keyerror:5,keypair:6,keysiz:5,keystor:4,khz:3,ki:0,kill:[5,6],kilomet:6,kind:[3,4,6],kiss:[2,7,8],kiss_fram:3,kissinterfac:[3,7],know:[0,1,4,5,6],knowledg:[4,6],known:[0,5,6,7],krypton:0,lack:6,laid:6,lan:3,larg:[0,4,5,6,8],larger:[4,6],laser:3,last:[0,3,5],last_unit:0,latenc:[1,6,8],later:[0,1],latest:[0,1,3],latest_client_link:0,launch:1,lavg:[],layer:[3,4,6,8],lead:6,leak:1,learn:[0,1,6],least:[3,6,8],leav:[4,6],ledger:6,left:[5,6],legaci:4,len:0,length:[0,3,5,6],less:[3,6,8],let:[0,1,3,4,6,7],level:[3,6],libffi:1,librari:1,licens:6,light:7,like:[1,3,4,5,6,7,8],limit:[4,6],line:[0,1,4,6,8],link:[2,3,4,8],link_clos:0,link_establish:0,linkexampl:0,linux:[1,6],list:[0,3,5,6,8],list_deliv:0,list_fil:0,list_packet:0,list_receipt:0,list_timeout:0,listdir:0,listen:[0,3,6],listen_ip:3,listen_port:3,littl:6,lki:6,lkr:6,ll:[0,1,8],ln:[1,7],load:[0,5,7],load_private_kei:5,load_public_kei:5,local:[0,1,3,4,5,6,7,8],locat:[1,4,6,7],log:[0,3],log_error:0,log_info:0,loglevel:[0,5],longer:[0,4,6],longest:3,look:[0,1,3,6,7],loop:0,lora32:[],lora:[1,2,6,8],lorawan:6,lorem:[],lot:6,low:[1,3,4,6,8],lower:1,lxmf:1,m:[0,1,6,7],mac:6,machin:6,maco:1,made:[1,5,6],mai:[1,3,5,6],main:0,mainli:4,maintain:6,make:[1,6,7],malici:6,manag:[1,4,5],mani:[0,1,3,4,5,6,7,8],manipul:6,manner:4,manual:[0,1,3,4,5,7],mark:6,markqvist:[0,1],master:[0,5],match:[0,3],maximum:[3,5],mbp:7,mcu:[],mdu:0,mean:[4,6,7],measur:6,mechan:[2,3],medium:[3,4,5,6,8],member:4,memori:6,mention:6,menu:0,menu_mod:0,mesh:[1,3,4,8],messag:[0,1,5,6,7],messeng:6,metadata:1,metavar:0,method:[0,1,3,5,6],methodolog:[6,7],mhz:[3,6],mi:0,microcontrol:6,microwav:[],might:[1,3,4,6,7],millisecond:[0,7],mind:[4,8],minim:[2,6],minimalsampl:0,minimum:[0,4,6],minut:[0,1,3,6],mix:[1,3,4,7],mobil:6,mode:[0,1,3,6,7,8],modem:[3,4,5,6,8],modifi:6,modul:[0,1,6,7,8],moment:[6,8],momentarili:3,monitor:6,moon:0,mor:[],more:[1,3,4,5,6,8],morej:[],most:[1,3,4,6,7],mostli:[3,4],motiv:2,move:[1,6],mqtt:[],mtu:[5,6,8],much:[1,3,4,6],multi:[6,7,8],multicast:3,multilater:6,multipl:[0,3,4,6,7],multipoint:6,must:[0,1,3,4,5,6],mw:3,my:6,mycal:3,myriad:6,n:[0,6],name:[0,2,3,4,5],namespac:0,nano:1,narg:0,natur:3,nears:6,necesarri:4,necessari:[1,5,6],necessarili:6,need:[0,1,2,3,4,6,7,8],neglig:6,neither:6,neon:0,net:3,netifac:1,network:[0,3,5,6,7,8],network_nam:3,never:[3,5,6],newer:6,newest:6,newli:[4,6],next:[1,4,5,6],next_hop:5,next_hop_interfac:5,nicknam:6,no1cll:3,no_inbound_for:5,no_outbound_for:5,nobl:0,noble_ga:0,noble_gas:0,node:[1,2,3,4,7,8],nomad:2,nomadnet:1,non:[1,5,6],none:[0,3,5,6,7],normal:[0,3,5],notat:[6,7],note:[0,1,3,6,7],noth:8,notic:6,notif:[0,5],now:[0,1,4,6,7],nt:0,num:0,number:[0,1,3,4,5,6,7],obfusc:[],object:5,obtain:6,obviusli:6,occasion:1,occur:8,off:[6,8],offer:[1,2,3,5,6],offlin:1,often:[1,4,6,7],oganesson:0,old:6,on_interfac:5,onc:[0,1,4,5,6,8],one:[0,1,3,4,5,6,7,8],ones:3,oneself:6,onli:[0,1,3,4,5,6,7,8],onlin:[],open:[0,3,4,5,6,7,8],openmodem:[3,8],openssl:1,oper:[3,4,5,6,8],opt:6,optic:8,optim:4,optimis:6,option:[0,1,2,4,5,7],order:7,orem:[],organ:4,organis:[3,4],orient:6,origin:[0,4,6],original_hash:[],os:[0,3,6,7,8],ospf:6,other:[1,3,4,5,6,7],otherwis:5,our:[0,6],out:[0,1,3,4,5,6,8],outbound:5,outgo:[0,1,3,5,6,7],outli:4,outlier:4,outlin:[1,6],output:[3,7],outward:6,over:[0,2,3,5,6,7,8],overal:6,overcom:6,overhead:[3,6],overrid:0,oversight:6,overview:[2,3,6],overwhelm:5,own:[0,1,4,5,6],owner:[],p:[0,6],pack:0,packag:[1,3],packb:0,packet:[0,1,2,3,4,7,8],packet_callback:0,packet_deliv:0,packet_hash:0,packet_receipt:[0,5],packet_timed_out:0,packet_typ:[],packetreceipt:[0,5],pad:8,page:[1,2,6],pair:[3,6],palm:[],parallel:1,paramet:[3,4,5],pariti:[3,7],pars:0,parse_arg:0,parser:0,part:[0,4,6],particip:[2,4,6],pass:[0,3,4,5,6],passphras:3,past:[],path:[0,1,3,5,6,7],path_respons:5,pathfind:[],pathfinder_m:5,pattern:6,payload:[5,6],peach:0,peer:[0,1,3,5,6,7],peer_pub_byt:[],peer_sig_pub_byt:[],peopl:6,per:[3,5,6,8],percent:0,percentag:5,perfect:[],perform:[0,1,3,4,6],period:[3,6],perman:7,permissionless:6,persecut:6,persist:[3,7],person:6,perspect:6,pet:0,philosophi:6,physic:[1,3,6,7],pi:[0,4,6,7,8],pick:6,piec:6,ping:[1,7],pip3:[1,7],pip:[1,7],pkcs7:8,pkg:1,place:[4,6,7],plain:[0,3,5,6],plain_mdu:5,plaintext:[0,5],plan:[4,6],platform:[1,6],pleas:[0,1,3,7,8],plenti:6,plu:6,plug:7,pmr:6,point:[1,3,4,6,7],pomelo:0,poorli:4,popular:8,port0:7,port:[2,3,4,6,8],portabl:[3,6],posit:7,possess:6,possibl:[1,3,4,5,6,8],potenti:[0,3,6,7],power:[1,3,6],practic:[6,8],pre:[1,3,5,6],preambl:[3,7],precompil:1,predict:6,prefer:6,prepar:[0,4],prerequisit:5,presenc:5,preserv:[1,5],press:0,pretend:6,pretti:6,prettyhexrep:0,previou:0,previous:[4,5,6],primari:6,principl:[6,8],print:[0,3],print_filelist:0,print_help:0,print_menu:0,prioriti:6,prioritis:[2,4,5],privaci:8,privat:[1,3,5,6,8],privileg:7,probabl:[0,4,6,7,8],probe:7,problem:6,procedur:6,process:[1,3,5,6],product:[],program:[0,2,3,5,6],program_setup:0,programm:6,programmat:6,progress:[0,5,8],progress_callback:5,project:1,prompt:0,proof:[0,5,6,7],proof_packet:0,proof_requested_callback:5,proof_strategi:5,propag:[3,5,6],properli:1,properti:[4,5],propos:1,protocol:[1,2,3,8],prove:[0,6],prove_al:[0,5],prove_app:5,prove_non:5,proven:[5,6],provid:[0,1,2,3,4,5,6,8],prv_byte:5,pub_byt:5,public_inform:0,publicli:1,purchas:[4,6,8],purg:5,purpos:[3,5,6],purposefulli:6,put:0,py:[0,1,7],pyseri:1,python3:[1,7],python:[1,6,7,8],q:[0,7],queri:[0,1],question:3,queu:5,queue:6,quiet:[3,7],quinc:0,quit:0,r:[0,6],radio:[2,3,4,5,6,7,8],radiu:6,radon:0,rais:[0,5],ram:3,rand:6,randint:0,random:[0,5,6],random_text_gener:0,randomli:[0,6],rang:[0,1,3,4,6,8],raspberri:[4,6,7,8],rate:[0,3,7],rather:1,rb:0,re:[0,3,5,6],reach:[2,3,4],reachabl:[0,1,3,4,5,6,7],read:[0,1,6],readabl:[0,5,6],readi:[0,1,3,4,5,8],readili:8,real:[4,6,8],realli:[3,5],reason:[3,6],reassembl:6,reboot:1,recal:[0,5],recall_app_data:5,recap:6,receipt:[0,2,6],receiv:[0,1,3,5,6,7],received_announc:[0,5],recent:6,reception_rssi:0,reception_snr:0,reception_stat:0,recip:1,recipi:6,recommend:[0,1,6],reconstruct:6,record:[1,6],recoveri:3,recreat:6,refer:[0,1,2],regard:6,regist:[0,5],register_announce_handl:[0,5],register_request_handl:[0,5],rel:[6,8],relai:1,relat:1,releas:[1,3,6],relev:[0,3,5,6],reli:6,reliabl:[3,4,6,8],rem:0,remain:[5,6],rememb:6,remot:[0,5],remote_ident:[0,5],remote_identifi:0,remote_identity_hash:[],remote_p:0,remotesensor:6,remov:7,render:1,repeat:1,replac:[1,6,7],repli:[0,7],replic:6,reply_data:0,reply_text:0,report:3,repositori:[1,6],repres:6,represent:[0,6],request:[2,6,7],request_destin:0,request_fail:0,request_id:[0,5],request_packet:0,request_path:[0,5],request_receipt:[0,5],request_receiv:0,requested_at:[0,5],requestexampl:0,requestreceipt:5,requir:[0,1,3,4,6,7,8],research:8,resend:5,reserv:6,resili:8,resourc:[0,1,2],resource_callback:5,resource_sending_conclud:0,resource_strategi:5,respect:3,respond:[0,5],respons:[2,5,6],response_callback:[0,5],response_gener:[0,5],response_tim:[],rest:[4,8],restart:7,restartsec:7,restrict:4,result:[0,6],retain:3,reticulum:[0,3,4],retiiculum:[],retransmiss:6,retransmit:6,retri:6,reveal:[1,5,6,8],review:8,ridicul:6,right:4,rn:[0,1,5,7],rnode:[1,2,6,7,8],rnodeinterfac:[3,7],rnpath:[1,2],rnprobe:[1,2],rnsconfig:1,rnsd:[1,2],rnstatu:[1,2,3],robot:6,rotat:6,round:[0,5,7],rout:[1,3,4,5,6,8],routabl:[],router:3,rprogress:0,rsa:[],rssi:0,rtt:[0,5,6],rttstring:0,rule:6,run:[0,1,3,4,5,6,7,8],runtim:6,rust:1,rw:6,rx:3,s:[0,1,3,4,6,7,8],said:6,same:[1,3,4,5,6,7],satisfi:6,save:[5,6],save_error:0,saved_filenam:0,scalabl:8,scale:6,scenario:[1,2,6],schedul:5,scope:3,screen:0,search:2,second:[0,3,5,6,7,8],secreci:[5,6,8],section:[1,3,4,6],secur:[1,6,8],see:[0,1,3,4,5,6,8],seek:6,seen:6,segment:[3,4,6,8],segment_index:[],select:[0,3],self:[0,4,8],send:[0,3,5,6,7],sender:[0,1,4,6],sendig:0,sensibl:1,sensor:6,sent:[0,1,5,6,7],sentiment:6,separ:[1,3,4,6,7],sequenc:[0,5,6,8],serial:[2,6,8],serialinterfac:3,serv:[0,3,4,6,7],serve_path:0,server:[0,1,2],server_callback:0,server_destin:0,server_fil:0,server_ident:0,server_link:0,server_loop:0,server_packet_receiv:0,servic:[1,2,4],session:6,set:[0,1,3,4,5,6,7,8],set_default_app_data:5,set_delivery_callback:[0,5],set_link_closed_callback:0,set_link_established_callback:[0,5],set_packet_callback:[0,5],set_proof_requested_callback:5,set_proof_strategi:[0,5],set_remote_identified_callback:[0,5],set_resource_callback:5,set_resource_concluded_callback:[0,5],set_resource_started_callback:[0,5],set_resource_strategi:[0,5],set_timeout:[0,5],set_timeout_callback:[0,5],setdaemon:0,setup:[0,1,2,3],sever:[1,4,5,7],sha256:8,sha:[5,6],shall:6,share:[1,4,5,6,7],she:4,shelf:[6,8],shop:0,shorter:3,shortest:6,shorthand:[3,7],should:[0,1,3,4,5,6,8],should_allow_unencrypt:[],should_quit:0,should_use_implicit_proof:5,show:7,shown:0,side:8,sideband:2,sight:4,sign:[5,6],signatur:[5,6,8],significantli:[],similar:[1,3,4,7,8],simpl:[0,6,7,8],simpler:3,simplest:[3,6],simpli:[0,1,3,4,6,7],simplic:6,simultan:6,sinc:[0,1,3,4,5,6],singl:[0,3,5,6,8],singular:6,sit:[],site:[2,3],situat:[1,3,4,6],size:[0,1,3,5,6],size_str:0,sleep:[0,7],slice:0,slightli:1,slottim:[3,7],slow:[0,3,6],slower:5,small:[0,3,4,6,8],smaller:5,snr:0,so:[0,1,3,4,5,6,7,8],softwar:[1,3,6,8],solut:6,solv:6,some:[0,1,3,4,6,7],someon:[1,3],someth:6,somethign:0,soon:5,sort:[3,6],soundmodem:3,sourc:[0,1,4,6,8],space:[0,1,4,6,8],span:6,special:[6,7],specif:[0,2,3,5,8],specifi:[0,1,3,4,5,7],spectrum:[3,6],speed:[3,6,7],split:0,sponsor:8,spread:3,spreadingfactor:3,squelch:3,ssid:3,stabl:[6,8],stack:[0,1,4,6,7,8],stage:[1,6],stai:[0,6,7],standard:[1,6],start:[0,2,3,5,6,7],startlimitintervalsec:[],startup:0,state:0,station:3,stationari:4,statist:0,statu:[0,1,2,3,5,6,7],stdout:0,step:1,still:[0,4,6],stock:0,stop:8,stopbit:[3,7],store:[0,6],store_tru:0,str:0,strategi:5,stream:6,strength:8,strictli:6,string:[0,5],strong:6,structur:6,subject:6,subnet:[1,4],subsequ:6,succe:1,successful:5,successfulli:0,sucessfulli:6,sudo:[1,7],suffic:6,suffici:[1,3,6,7],suffix:0,suit:[1,6],suitabl:[0,1,3,4,6,8],suppli:[4,5,6],support:[0,1,2,4,6,8],sure:[1,7],surveil:6,surviv:6,sy:0,symlink:[1,7],symmetr:[5,6],system:[0,1,2,3,4,5,6,8],systemctl:7,systemd:7,t:[0,1,3,4,5,6,7],tabl:[1,4,6,7],tail:3,tailor:6,take:[0,1,3,6,8],taken:[0,6],tangerin:0,target:[0,7],target_host:[1,3],target_port:[1,3],tcp:[1,2,4,6,8],tcpclientinterfac:[1,3],tcpinterfac:7,tcpserverinterfac:[1,3],tdata:0,teardown:[0,5],teardown_reason:0,teffect:0,tell:[0,3],temperatur:6,ten:6,term:[4,6],termin:[1,5],terminolog:[4,6],termux:1,test:[1,3,6],testnet:[2,7],text:[0,1,4,6],tfile:0,than:[0,1,4,6],thei:[0,1,4,5,6],them:[0,1,3,4,6],thereaft:6,therefor:[6,8],thi:[0,1,2,3,4,5,6,7],thing:1,think:1,those:[4,6],though:[1,6],thourough:8,thousand:6,thread:0,three:[4,6],throough:3,throttl:4,through:[1,3,4,5,6,8],throughout:6,throughput:[6,8],thu:[4,5,6],ti:[0,6],time:[0,1,3,4,5,6,7],timeout:[0,5,7],timeout_callback:[],timeoutarg:0,timestr:0,tnc:[3,5,7,8],to_fil:5,todai:6,todo:[],togeth:6,token:[5,6],too:[0,4,6],tool:[6,8],top:[4,6],topic:6,topographi:[1,4,6],topolog:[3,6],total:[6,8],total_s:0,touch:8,toward:[0,6],tradeoff:6,tradit:4,traffic:[0,1,3,4,5,6,7],tramsit:[],transceiv:[1,3,6,8],transfer:[0,5,6,7,8],transfer_s:0,transform:8,transmiss:[1,3,5,6],transmit:[0,3,6],transpar:[3,6],transpor:[],transport:[0,1,2,3,4,7,8],transport_en:5,transport_id:[],transport_typ:[],travers:6,treat:6,tri:0,trip:[0,5,7],trivial:8,truli:6,truncat:[5,6],truncated_hash:5,truncated_hashlength:5,trust:6,trustless:[4,6,8],ttime:0,ttransfer:0,ttyusb0:[3,7],ttyusb1:3,ttyusb2:3,tun0:3,tune:[],tunnel:[3,6,8],tupl:5,turnaround:3,tutori:1,two:[0,1,3,4,6],tx:3,txpower:3,txtail:[3,7],type:[0,1,2,3,4,5,7],typeerror:5,ubuntu:7,udp:[2,4,6,8],udpinterfac:3,uhf:[7,8],ultim:6,umsgpack:0,uncencrypt:0,uncensor:1,under:7,underli:[4,8],understand:[1,2],unencrypt:[0,5,6],unequivoc:6,unexplor:4,unforg:8,unidentifi:0,unifi:4,uninterest:0,uniqu:[6,8],unit:[0,7],unknown:[0,5,6],unless:[1,3,5,6],unlicens:6,unlik:6,unorganis:4,unpack:0,unpackb:0,unplug:7,unreli:3,unsign:[1,7],unsupport:5,until:[0,5,6],unwant:6,up:[0,1,3,4,6,7,8],updat:[0,1,5,6],upgrad:[1,6],upkeep:3,upon:[0,6],upset:0,urandom:8,us:[0,2,3,4,5,6],usabl:6,usag:[1,3,6,7],usb:[4,6,7],useabl:6,user:[0,1,3,4,6,7],user_input:0,userland:8,usernameher:7,usr:7,utf:0,util:[0,2,3,6],utilis:[1,4,7,8],v:7,valid:[0,3,5,6,7],valu:[3,5,6],valueerror:[0,5],vari:[6,7],variabl:0,varieti:[3,6,8],variou:[0,1,3,4,6],vast:6,ve:1,vendor:0,verbos:7,veri:[1,4,5,6,7,8],verif:[5,6],verifi:[0,5,6],versa:[4,8],version:7,vhf:[4,6,8],via:[1,3,6,7],vice:[4,8],view:[1,6,7],virtual:[3,4,6,8],visibl:0,w:7,wa:[0,3,4,5,6,8],wai:[0,1,3,4,6],wait:[0,6],want:[0,1,3,4,6,7,8],wantedbi:7,warrant:8,wast:3,wb:0,we:[0,1,3,6],websit:3,weight:7,welcom:1,well:[1,3,4,5,6,8],went:0,were:4,what:[0,1,2,5,6],whatev:[5,6],wheel:1,when:[0,1,3,4,5,6,7],whenev:5,where:[1,2,3,4,5,6,7],whereupon:6,whether:[0,3,5,6],which:[0,1,3,4,5,6,7],who:[1,6],wide:[3,6,8],wider:[1,6],wifi:[1,3,4,6,7,8],wildcard:0,willing:4,window:6,wire:[1,2,3,8],wireless:4,wish:6,within:[0,1,3,4,5,6],without:[1,4,6,8],wlan0:3,won:0,work:[1,4,6,7,8],world:[4,6,8],worri:4,would:[1,3,4,5,6],write:[0,1,5,6],written:6,wrong:0,x25519:[5,6,8],x:6,xenon:0,y:0,ye:[1,3,6],year:6,yet:[0,3,6],yi:0,ykzlw5ujbaqc2xkec4cpvgyxj257wcrmmgkuxqmqcur7cq3w3lha:1,you:[0,1,2,3,4,5,6,7,8],your:[0,1,2,3,4,6,8],yourself:[6,8],z:0,zero:[5,8],zeromq:[],zi:0},titles:["Code Examples","Getting Started Fast","Reticulum Network Stack Manual","Supported Interfaces","Building Networks","API Reference","Understanding Reticulum","Using Reticulum on Your System","What is Reticulum?"],titleterms:{"1":[],"2":[],"25":3,"class":5,"function":6,"public":[1,6],"try":1,The:[6,7],With:1,ad:1,android:1,announc:[0,6],api:5,arm64:1,auto:3,ax:3,base:1,basic:6,binari:[],bridg:4,broadcast:0,build:4,can:8,caveat:8,client:3,code:0,common:3,concept:4,configur:7,connect:1,converg:4,creat:1,current:8,deliveri:[],destin:[5,6],detail:6,develop:1,devic:8,doe:8,echo:0,emptor:8,establish:6,exampl:[0,4],fast:1,filetransf:0,fix:7,format:6,further:6,get:[1,6],gipsum:[],goal:6,growth:4,i2p:3,ident:[5,6],identif:0,improv:7,includ:[1,7],indic:2,instanc:1,interconnect:4,interfac:[1,3,8],internet:[1,4],introduct:6,kei:6,kiss:3,link:[0,5,6],lora:[3,4],manual:2,mechan:6,minim:0,motiv:6,name:[6,7],network:[1,2,4],node:6,nomad:1,offer:8,option:3,orem:[],over:[1,4],overview:4,packet:[5,6],particip:1,pathfind:[],port:7,predict:[],prioritis:6,program:[1,7],protocol:6,proven:[],radio:1,reach:6,receipt:5,refer:[5,6],request:[0,5],resourc:[5,6],respons:0,reticulum:[1,2,5,6,7,8],retiiculum:[],rnode:3,rnpath:7,rnprobe:7,rnsd:7,rnstatu:7,run:[],scenario:4,serial:[3,7],server:3,servic:7,setup:6,sideband:1,site:4,specif:6,stack:2,start:1,statu:8,step:[],support:3,system:7,tabl:2,tcp:3,testnet:1,transport:[5,6],type:[6,8],udp:3,understand:6,us:[1,7,8],util:[1,7],what:8,where:8,wire:6,your:7}}) \ No newline at end of file +Search.setIndex({docnames:["examples","gettingstartedfast","index","interfaces","networks","reference","understanding","using","whatis"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["examples.rst","gettingstartedfast.rst","index.rst","interfaces.rst","networks.rst","reference.rst","understanding.rst","using.rst","whatis.rst"],objects:{"RNS.Destination":{announce:[5,1,1,""],app_and_aspects_from_name:[5,1,1,""],clear_default_app_data:[5,1,1,""],create_keys:[5,1,1,""],decrypt:[5,1,1,""],deregister_request_handler:[5,1,1,""],encrypt:[5,1,1,""],full_name:[5,1,1,""],get_private_key:[5,1,1,""],hash:[5,1,1,""],hash_from_name_and_identity:[5,1,1,""],load_private_key:[5,1,1,""],register_request_handler:[5,1,1,""],set_default_app_data:[5,1,1,""],set_link_established_callback:[5,1,1,""],set_packet_callback:[5,1,1,""],set_proof_requested_callback:[5,1,1,""],set_proof_strategy:[5,1,1,""],sign:[5,1,1,""]},"RNS.Identity":{CURVE:[5,2,1,""],KEYSIZE:[5,2,1,""],TRUNCATED_HASHLENGTH:[5,2,1,""],decrypt:[5,1,1,""],encrypt:[5,1,1,""],from_bytes:[5,1,1,""],from_file:[5,1,1,""],full_hash:[5,1,1,""],get_private_key:[5,1,1,""],get_public_key:[5,1,1,""],get_random_hash:[5,1,1,""],load_private_key:[5,1,1,""],load_public_key:[5,1,1,""],recall:[5,1,1,""],recall_app_data:[5,1,1,""],sign:[5,1,1,""],to_file:[5,1,1,""],truncated_hash:[5,1,1,""],validate:[5,1,1,""]},"RNS.Link":{CURVE:[5,2,1,""],ESTABLISHMENT_TIMEOUT_PER_HOP:[5,2,1,""],KEEPALIVE:[5,2,1,""],get_remote_identity:[5,1,1,""],identify:[5,1,1,""],inactive_for:[5,1,1,""],no_inbound_for:[5,1,1,""],no_outbound_for:[5,1,1,""],request:[5,1,1,""],set_packet_callback:[5,1,1,""],set_remote_identified_callback:[5,1,1,""],set_resource_callback:[5,1,1,""],set_resource_concluded_callback:[5,1,1,""],set_resource_started_callback:[5,1,1,""],set_resource_strategy:[5,1,1,""],teardown:[5,1,1,""]},"RNS.Packet":{ENCRYPTED_MDU:[5,2,1,""],PLAIN_MDU:[5,2,1,""],resend:[5,1,1,""],send:[5,1,1,""]},"RNS.PacketReceipt":{get_rtt:[5,1,1,""],get_status:[5,1,1,""],set_delivery_callback:[5,1,1,""],set_timeout:[5,1,1,""],set_timeout_callback:[5,1,1,""]},"RNS.RequestReceipt":{get_progress:[5,1,1,""],get_request_id:[5,1,1,""],get_response:[5,1,1,""],get_response_time:[5,1,1,""],get_status:[5,1,1,""]},"RNS.Resource":{advertise:[5,1,1,""],cancel:[5,1,1,""],get_progress:[5,1,1,""]},"RNS.Reticulum":{ANNOUNCE_CAP:[5,2,1,""],MTU:[5,2,1,""],should_use_implicit_proof:[5,1,1,""],transport_enabled:[5,1,1,""]},"RNS.Transport":{PATHFINDER_M:[5,2,1,""],deregister_announce_handler:[5,1,1,""],has_path:[5,1,1,""],hops_to:[5,1,1,""],next_hop:[5,1,1,""],next_hop_interface:[5,1,1,""],register_announce_handler:[5,1,1,""],request_path:[5,1,1,""]},RNS:{Destination:[5,0,1,""],Identity:[5,0,1,""],Link:[5,0,1,""],Packet:[5,0,1,""],PacketReceipt:[5,0,1,""],RequestReceipt:[5,0,1,""],Resource:[5,0,1,""],Reticulum:[5,0,1,""],Transport:[5,0,1,""]}},objnames:{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","attribute","Python attribute"]},objtypes:{"0":"py:class","1":"py:method","2":"py:attribute"},terms:{"0":[0,3,5,6,8],"00":[6,7],"000":[],"00000000":6,"00000100":6,"00000111":6,"01":6,"01010000":6,"02":[],"05":0,"07":[],"1":[0,3,5,6,7],"10":[0,3,6,7],"100":[0,3,6],"1000":0,"10000000":6,"1024":0,"11":6,"115200":[3,7],"12":3,"1200":6,"125":3,"125000":3,"127":3,"128":[5,6,8],"13":7,"14":6,"141":[],"15":3,"150":[3,7],"150m":3,"151":6,"16":[3,7],"17":7,"18":[],"180":[],"182":[],"187":7,"2":[0,3,5,6,7],"20":[0,3,6,7],"200":[3,7],"2000000":[],"205":[],"211":[],"23":7,"237":[6,8],"24":3,"240":[],"25":[0,2,8],"255":3,"256":[5,6],"27":7,"270":[],"2f":0,"3":[0,6,7,8],"30":7,"323":[],"33":6,"34":[],"360":5,"3600":0,"367":[],"37":[],"37428":7,"38":7,"383":5,"3e12fc71692f8ec47bc5":1,"3w3lha":[],"4":[6,7],"409":[],"4242":3,"430":6,"45":0,"460":[],"469":7,"476":5,"477":6,"48555":3,"49":7,"49555":3,"4965":[1,7],"5":[0,3,5],"500":[5,6,8],"5001":3,"507":5,"512":[3,5],"5245a8efe1788c6a70e1":7,"55":3,"56b115c30cd386cad69c":7,"5urvjicpzi7q3ybztsef4i5ow2aq4soktfj7zedz53s47r54jnqq":3,"60":0,"600":3,"62":[6,8],"63":7,"64":[6,7],"7":3,"72":3,"74":7,"77":6,"7c565719ec7a8cdb1fe2":[],"7ca6f4e4dc26ae329e61":[],"8":[0,3,7],"80":[5,6,7],"8001":3,"80e29bf7cccaf31431b3":6,"83":[6,7],"86":7,"867":3,"867200000":3,"868":6,"88":3,"9":7,"900":6,"9382f334de63217a4278":7,"95":6,"\u00ec2pd":3,"abstract":6,"break":[5,6,8],"byte":[0,5,6,7,8],"case":[1,3,4,6,7],"class":[0,2,4,8],"default":[0,1,3,4,5,6],"do":[0,1,3,5,6,7,8],"export":1,"final":6,"float":[0,5],"function":[0,1,2,3,4,5,8],"import":[0,1,3,4,6],"int":0,"long":[0,3,6],"new":[0,3,4,5,6,7],"public":[0,2,3,5],"return":[0,5],"short":[6,7],"static":5,"switch":[3,6],"throw":[],"true":[0,1,3,5,7],"try":[0,2,3],"while":[0,1,3,4,5,6,8],A:[0,1,3,4,5,6,8],And:0,As:[1,4,5,6,8],At:[4,6],Be:[5,7],But:6,By:[0,1,3,5,6],For:[1,3,4,5,6,8],IF:[],IN:[0,5],If:[0,1,3,4,5,6,7,8],In:[0,1,3,4,5,6,7,8],It:[0,1,3,5,6,7,8],No:[3,6,8],On:[0,1,3,7],One:5,Or:3,That:6,The:[0,1,2,3,4,5,8],Then:1,There:[1,4,6,8],These:[1,3,6,7],To:[0,1,3,4,6,7,8],Will:5,With:[2,3,4,6,7],_:6,__:6,______:6,_______:6,________:6,________________:6,__init__:0,__main__:0,__name__:0,_exit:0,aarch64:1,ab:0,abil:1,abl:[0,1,4,5,6,7],about:[0,1,3,4,5,6],abov:[1,3,6],absolut:[1,8],accept:[5,6],accept_al:[0,5],accept_app:5,accept_non:5,access:[1,3,4,5,6,7],access_point:3,accomod:6,accord:6,accordingli:0,acheiv:[3,6],achiev:[5,6],acknowledg:8,across:4,act:[1,5,6],action:0,activ:[0,1,5,6],actor:6,actual:[0,1,3,6],ad:[0,2,4,5,6,8],adapt:4,add:[0,1,3,4,7],add_argu:0,addit:[6,8],addr1:[],addr2:[],address:[0,1,3,4,5,6,8],adher:5,admin:3,administr:7,adress:[0,1,4,5,6,8],advanc:6,advantag:5,adversari:1,advertis:[0,5],advis:6,ae:[6,8],after:[0,4,6,7],again:[1,3,6],against:6,agenc:6,agent:6,agnost:[4,6],agnostic:6,aim:[2,6],air:8,airtim:3,aliv:[5,6],all:[0,1,2,3,4,5,6,7,8],alloc:[3,5,6,7],allow:[0,1,3,4,5,6,7,8],allow_al:[0,5],allow_list:5,allow_non:5,allowed_list:5,almost:[3,6],alo:6,alon:3,along:[4,6],alreadi:[0,1,4,6],als:[],also:[0,1,3,4,5,6,7,8],alter:6,altern:[0,3,7],although:[6,8],alwai:[1,5,6,7],amateur:[3,8],amet:[],amount:[3,4,5,6,8],an:[0,1,3,4,5,6,7,8],android:2,ani:[0,1,3,4,5,6,7,8],announc:[2,3,5],announce_cap:[3,5],announce_handl:0,announced_ident:[0,5],announceloop:0,announcesampl:0,announec:[],anonym:[1,4,5,6,8],anoth:[1,5,6,7],answer:[6,7],anymor:1,anyon:[0,1,4,5,6],anyth:[3,6],anywher:[0,3],ap:3,apart:[],api:[1,2,6,8],apk:1,app:[0,1,5,6],app_and_aspects_from_nam:5,app_data:[0,5],app_nam:[0,5],app_timeout:0,append:[0,6],appli:[5,6],applic:[0,4,5,6,7],approach:[6,7],approv:6,approxim:[],apt:1,ar:[0,1,3,4,5,6,7,8],arbitrari:[5,6],arbritrari:8,architectur:1,area:[3,4,6,8],arg:0,argon:0,argpars:0,argument:[0,5,7],argumentpars:0,arm64:2,around:6,arriv:[0,6],ask:[0,5],aspect:[0,3,5,6],aspect_filt:[0,5],assign:[6,7],associ:[1,5,6],assum:[3,6],asymmetr:[6,8],attached_interfac:[],attack:1,attempt:5,attribut:5,audit:8,authent:[1,3,4,5,6,8],author:6,auto:[2,5,6],auto_compress:5,autoconfigur:[3,8],autodiscov:3,autointerfac:[3,7],autom:6,automat:[0,1,3,4,5,6,7,8],autonom:[4,6],autoomat:0,avail:[0,1,3,4,5,6,7,8],availadbl:[],averag:6,avoid:[6,7],awai:[0,4,6,7],awar:6,ax25kissinterfac:3,ax:[2,8],b32:[1,3],b:[0,4],back:[0,6,8],background:[1,3],backhaul:4,band:6,bandwidth:[1,3,4,5,6,8],bare:0,barrier:6,base32:3,base:[2,3,4,5,6,7,8],basi:[5,6,8],basic:[0,1,2],baud:3,beacon:3,beam:[],becaus:[4,6],becki:0,becom:[0,1,4,6],been:[0,1,3,4,5,6,8],befor:[0,1,5,6,7],begin:[0,5],begun:5,behaviour:3,behind:[1,6],being:[3,5,6],beings:6,belief:6,below:[1,3],benefici:7,best:[1,6,8],beta:8,better:3,between:[0,3,4,5,6],bgp:[],bi:6,bidirect:6,billion:[4,6],bin:7,binari:[0,1,6],bind:3,bit:[3,5,6,7,8],bitrat:3,blob:[0,6],block:3,board:[1,6,8],boot:7,both:[1,3,4,5,6,8],bp:[],bridg:2,briefli:6,bring:3,broadcast:[1,2,3,5,6],broadcast_destin:0,broadcastloop:0,brought:[3,7],browser:1,buffer:3,bug:8,build:[0,1,2,3,6,8],built:[1,6,8],bundl:0,c:[0,4],cabl:4,cad:[],calcul:[5,6],call:[0,4,5,6,8],callabl:5,callback:[0,5],callsign:3,can:[0,1,2,3,4,5,6,7],cancel:5,candid:4,cannot:0,capabl:6,capac:[5,6],carambola:0,care:[1,5,8],carefulli:1,cargo_build_target:1,carri:[3,5,6],carrier:[4,8],caution:3,caveat:2,cb:6,cbc:8,cd:1,cdma:3,censor:6,censorship:6,central:[4,6],centralis:6,certain:[0,3,4,6],challeng:6,chang:[0,1,3,5,6,7,8],channel:[0,3,4,6,8],channelarg:0,chapter:[1,3,4,6,8],charact:0,characterist:6,cheap:6,check:[0,1,5],checksum:[5,8],choos:[0,1,3,6],choosen:6,chose:6,chosen:4,chunk:0,ciphertext:5,ciphertext_token:5,circumst:6,cl:0,clear:[0,5,6],clear_default_app_data:5,clear_screen:0,client:[0,1,2,5],client_connect:0,client_disconnect:0,client_ident:0,client_loop:0,client_packet_receiv:0,client_request:0,clone:1,close:[0,4,5],closed_callback:5,closer:6,closest:6,cluster:6,co:8,code:[1,2,3,6],codingr:3,com:[0,1],combin:[1,4,6],come:[1,6],comma:3,command:[0,1,7],comment:3,common:[1,2,4,6,8],commun:[0,1,3,4,5,6,7,8],compat:[1,3,5,6],compil:1,complet:[0,1,4,5,6,8],complex:6,compon:6,compos:6,compress:[0,5,6],comput:[1,6,8],concaten:5,concept:[2,6],conclud:[0,5],concurr:[6,7],condit:6,config:[0,1,4,7],configarg:0,configdir:5,configpath:0,configur:[0,1,2,3,4,5,6,8],confirm:[6,8],confus:6,congest:6,conjunct:3,connect:[0,2,3,4,5,6,7,8],consequ:[],consid:[6,8],consider:[],consist:6,constant:5,constantli:6,construct:6,consumpt:[],contact:6,contain:[0,4,5,6],contend:6,content:[4,7],context:6,continu:8,control:[0,1,3,4,5,6],conveni:0,convent:0,converg:[2,6],coordin:[4,5,6,8],core:[4,6,8],correct:[0,6],correctli:0,correspond:6,cost:[6,8],could:[0,1,3,4,5,6,8],count:6,counter:0,cours:[3,6],cover:[6,8],coverag:4,cpu:0,creat:[0,2,3,4,5,6,7],create_kei:5,create_receipt:[0,5],creation:6,creator:6,critic:6,cryptograph:[4,8],cryptographi:[1,6,8],ctrl:0,cull:5,current:[0,1,2,3,5,6],current_download:0,current_filenam:0,curv:[4,5,6,8],curve25519:[4,5,6,8],custom:[3,5,6],custom_network_nam:3,customis:3,d:[4,7],daemon:[1,3,5,7],dai:4,data:[0,1,3,4,5,6,8],data_port:3,databit:[3,7],date:[0,1],db:0,dbm:[0,3],debian:[6,7],debug:[],decai:[],decid:[4,5,6],decod:0,decrypt:[5,6],dedic:6,deep:1,def:0,default_timeout:[],defin:[0,3,6],definit:6,degrad:4,degre:3,delai:[1,6,7],deliv:[0,5],deliveri:[0,1,5,8],demand:5,demonstr:[0,3],depend:[1,4,7],deploi:6,deregist:5,deregister_announce_handl:5,deregister_request_handl:5,deriv:[6,8],describ:[3,5,6],descript:[0,7],design:[1,4,6,8],desir:[0,3,6],destin:[0,1,2,3,4,7],destination_1:0,destination_2:0,destination_clos:0,destination_hash:[0,5,7],destination_hexhash:0,detail:[0,1,2,3,5,7,8],detect:0,determin:[1,5,6],dev:[1,3,7],develop:[2,6,8],devic:[1,2,3,4,5,6,7],dh:5,dhcp:3,did:0,differ:[0,1,3,4,5,6,7,8],diffi:[4,6,8],difficult:1,digit:[6,8],dir:0,direct:[0,1,4,5,6],directli:[3,5,6,7,8],directori:[0,7],disabl:[3,6],disable_encrypt:[],disappear:3,disassoci:6,discard:6,disconnect:0,discov:1,discover:3,discoveri:[3,6,7],discovery_port:3,discovery_scop:3,discrimin:4,discuss:[1,6],disk:[0,5],displai:[0,6],dissolv:4,distanc:6,distant:5,distinct:[3,6],distinguish:6,distribut:[0,1,4,5,6,7],divmod:0,document:6,doe:[0,1,2,3,4,5,6],doesn:3,dolor:[],domain:[1,3],don:[0,1,4,5],done:[0,1,4,6],dori:4,dot:[6,7],down:0,downgrad:[],download:[0,3],download_began:0,download_conclud:0,download_finish:0,download_start:0,download_tim:0,driver:[7,8],droid:1,drop:[5,6,7],due:4,duplex:[6,8],dynam:[1,7],e702c42ba8:7,e:[0,4],each:[0,1,3,4,6],earli:1,earlier:6,eas:[3,6],easi:[1,3,6,7,8],easier:[1,4,7],easiest:[1,3,6],easili:[4,6,7,8],eca6f4e4dc26ae329e61:7,ecdh:[6,8],echo:[1,2,7],echo_destin:0,echo_request:0,ed25519:[6,8],edit:1,effeci:[],effici:[0,1,3,6,8],ei:0,either:[3,4,6],elaps:3,elif:0,ellipt:[4,5,6,8],els:[0,4,6],emploi:6,emptor:2,emul:1,enabl:[1,3,4,5,6,7],enable_transport:6,encapsul:[3,8],encod:0,encrypt:[0,1,4,5,6,8],encrypted_mdu:5,encryptionless:[],end:[0,4,5,6,8],endless:3,endpoint:[0,4,5,6],energi:1,engin:[],enhanc:6,enough:[1,6],ensur:[5,6],enter:0,entir:[4,6],entiti:6,entri:[0,1,6],enumer:0,environ:[1,4,6],environment:6,environmentlogg:6,ephemer:[4,5,6,8],equal:[4,6],equip:[4,6],equival:3,equl:[],error:[0,1],especi:3,essenti:[1,6],establish:[0,1,3,4,5,8],established_callback:5,establishment_timeout_per_hop:5,etc:7,eth0:3,eth1:3,ethernet:[1,3,4,6,8],even:[1,4,6,7,8],event:3,eventu:5,everi:[0,3,4,5,6],everyon:[4,6],everyth:[0,4,6],evolv:4,exact:6,exactli:[5,6],exampl:[1,2,3,5,6,7,8],example_util:[0,7],exampleannouncehandl:0,exce:[0,5],except:[0,3],exchang:[4,5,6,8],exclud:6,execstart:7,execstartpr:7,execut:[0,1,5,7],exhaust:6,exist:[0,1,3,6,8],exit:[0,1,5,7],exit_handl:0,expand:6,expect:[0,3,5,6,7],experi:[1,6],experiment:[1,8],expiri:3,explain:5,explan:6,explicit:5,explicitli:[],explor:[0,6,8],expos:[3,5],extend:[0,1,5],extern:[1,3,5,8],extra:[1,3,4,7],extrem:[1,6,8],f:1,fa7ddfab5213f916dea:6,face:1,fact:8,factor:3,fail:[0,5],failed_callback:[0,5],failur:1,fals:[0,3,5],far:[4,6],fast:[2,5,6],faster:[1,6],fastest:[3,6],featur:[1,6,8],feed:5,feedback:0,feel:1,fernet:8,few:[1,3,4,6,7,8],fewer:5,fibr:8,field:6,file:[0,1,3,4,5,6,7,8],file_resourc:0,file_s:0,filelist:0,filelist_data:0,filelist_receiv:0,filelist_timeout_job:0,filenam:0,filetransf:[1,2,5],filter:[0,4,6],find:[4,6],firewal:[1,3],firmwar:[1,6],first:[0,1,3,5,6],fit:0,five:0,fix:[2,6],flag:[5,6],flexibl:[3,8],flow:[3,4],flow_control:3,flush:0,folder:1,follow:[0,1,3,6,7,8],forcibl:5,foreground:1,foremost:8,form:[1,3,4,5,6],format:[0,2,8],forth:0,forward:[3,5,6,8],forward_ip:3,forward_port:3,found:[0,1,3,4,6,7],four:4,frame:3,frankfurt:[1,7],free:[4,8],freedom:6,freeli:6,frequenc:[3,6],frequent:3,friendli:8,from:[0,1,3,4,5,6,7,8],from_byt:5,from_fil:5,fromhex:0,fruit:0,ftdi_ft230x_basic_uart_43891ckm:7,full:[0,3,5,6,7,8],full_hash:5,full_nam:[5,7],fulli:[6,8],funcion:5,fundament:6,further:[1,2],futur:[4,6],g:0,ga:0,gain:6,galact:6,gatekeep:6,gatewai:[1,4],gbp:7,gen:[],gener:[0,1,3,4,5,6,8],generalis:8,geograph:4,get:[0,2,3,5,8],get_packet_rssi:0,get_packet_snr:0,get_private_kei:5,get_progress:[0,5],get_public_kei:5,get_random_hash:[0,5],get_remote_ident:[0,5],get_request_id:5,get_respons:5,get_response_tim:5,get_rtt:[0,5],get_statu:5,geti2p:3,ghz:6,gi:0,gigabyt:8,gipsum:[],git:1,github:[0,1],give:[3,6,7],given:[3,4,5,6],global:[0,1,3,4,6,8],go:[0,1,6],goal:[2,3],good:[4,6],got:0,got_respons:0,govern:6,grape:0,graphic:1,great:6,greater:6,greatli:3,group:[3,5,6],group_id:3,grow:4,growth:2,guarante:[1,6],guess:3,guid:[1,5,6],h:[1,7],ha:[0,1,3,4,5,6,8],had:6,half:[6,8],hand:[0,1],handheld:6,handl:[0,3,4,5,6,7,8],handler:[0,5],happen:[0,5,6],hardlin:4,hardwar:[1,3,4,5,6,8],has_path:[0,5],hasattr:0,hash1:6,hash2:6,hash:[0,1,5,6,7],hash_from_name_and_ident:5,hashmap:0,have:[0,1,3,4,5,6,7],hazard:5,head:1,header:6,header_1:6,header_2:6,header_typ:[],hear:6,heard:[5,6],helium:0,hellman:[4,6,8],help:[0,4,6,7,8],her:4,here:[0,1,3,6,7],hexadecim:[0,6,7],hide:1,high:[3,6,8],higher:[4,8],highli:6,hill:4,hint:0,hit:0,hmac:8,hoc:8,hold:[5,6],home:4,homebrew:3,hop:[4,5,6,7,8],hops_to:5,host:[0,1,3,6,7],hostnam:3,hour:0,how:[0,1,3,4,6,8],howev:[1,4],http:[0,1],hub:3,huge:[],human:[0,5,6],i2p:[1,2,8],i2p_tunnel:3,i2pd:1,i2pinterfac:[1,3],i:0,id:[3,5,6,7],id_callsign:3,id_interv:3,idea:6,ideal:8,ident:[0,1,2,8],identif:[2,3,8],identifi:[0,3,5,6],identify:6,identifyexampl:0,ie:[],if00:7,ifac:[6,7],ifac_s:3,ifconfig:7,ignor:[3,5,6],ignored_devic:3,illustr:4,immedi:[1,7],impact:6,implement:[0,4,5,6,8],implic:3,implicit:[5,6],imposs:6,improv:[2,3],inactive_for:5,inbound:[3,5],includ:[0,2,3,5,6],incom:[0,3,5],incompat:[5,6],increas:3,incur:3,indefinit:[],independ:[5,6],independt:8,index:[0,1,2],indirectli:6,individu:[5,6],inevit:6,infer:6,info:[5,6],inform:[0,1,2,4,5,6],infrastructur:[1,3,4,6],ingo:5,initi:[0,4,5,6,8],initialis:[0,5,7],input:0,insert:6,insid:6,inspect:[1,3,4],instal:[1,3,4,7,8],instanc:[0,2,3,5,6,7],instanti:5,instead:[0,3,6,7],integr:[4,6],intend:[4,6],intention:6,inter:5,interact:[0,1,5,6],interchang:3,interconnect:[2,6],interest:6,interfac:[0,2,4,5,6,7],interface_en:[1,3,7],interface_mod:[],intermediari:6,intermitt:3,intern:[3,5],internet:[2,3,6,8],interoper:[1,4,6,8],interv:[3,5],intiat:0,introduc:6,introduct:2,intuit:8,invalid:[0,5],invers:6,investig:4,invis:[1,3],involv:4,io:[1,7],ip:[1,3,6,8],ipsum:[],ipv6:3,is_connected_to_shared_inst:0,is_request:[],is_respons:[],isdir:0,isfil:0,island:4,ism:6,isol:3,issu:4,its:[5,6],itself:[2,6],iv:8,job:0,join:[0,1,4,6],just:[0,1,3,4,6,8],k:0,kb:7,kbp:7,keep:[0,4,5,6,7,8],keepal:[5,6],kei:[0,2,4,5,8],kept:[3,4,5,6],kernel:[3,7,8],keyboardinterrupt:0,keyerror:5,keypair:6,keysiz:5,keystor:4,khz:3,ki:0,kill:[5,6],kilomet:[],kind:[3,4,6],kiss:[2,7,8],kiss_fram:3,kissinterfac:[3,7],know:[0,1,4,5,6],knowledg:[4,6],known:[0,5,6,7],krypton:0,lack:6,laid:6,lan:3,larg:[0,4,5,6,8],larger:[4,6],laser:3,last:[0,3,5],last_unit:0,latenc:[1,6,8],later:[0,1],latest:[0,1,3],latest_client_link:0,launch:1,lavg:[],layer:[3,4,6,8],lead:6,leak:1,learn:[0,1,6],least:[3,6,8],leav:[4,6],ledger:6,left:[5,6],legaci:4,len:0,length:[0,3,5,6],less:[3,6,8],let:[0,1,3,4,6,7],level:[3,6],libffi:1,librari:1,licens:6,light:7,like:[1,3,4,5,6,7,8],limit:[4,6],line:[0,1,4,6,8],link:[2,3,4,8],link_clos:0,link_establish:0,linkexampl:0,linux:[1,6],list:[0,3,5,6,8],list_deliv:0,list_fil:0,list_packet:0,list_receipt:0,list_timeout:0,listdir:0,listen:[0,3,6],listen_ip:3,listen_port:3,littl:6,lki:6,lkr:6,ll:[0,1,8],ln:[1,7],load:[0,5,7],load_private_kei:5,load_public_kei:5,local:[0,1,3,4,5,6,7,8],locat:[1,4,6,7],log:[0,3],log_error:0,log_info:0,loglevel:[0,5],longer:[0,4,6],longest:3,look:[0,1,3,6,7],loop:0,lora32:[],lora:[1,2,6,8],lorawan:6,lorem:[],lot:6,low:[1,3,4,6,8],lower:1,lxmf:1,m:[0,1,6,7],mac:6,machin:6,maco:1,made:[1,5,6],mai:[1,3,5,6],main:0,mainli:4,maintain:6,make:[1,6,7],malici:6,manag:[1,4,5,6],mani:[0,1,3,4,5,6,7,8],manipul:6,manner:4,manual:[0,1,3,4,5,7],mark:6,markqvist:[0,1],master:[0,5],match:[0,3],maximum:[3,5,6],mbp:7,mcu:[],mdu:0,mean:[4,6,7],measur:6,mechan:[2,3],medium:[3,4,5,6,8],member:4,memori:6,mention:6,menu:0,menu_mod:0,mesh:[1,3,4,8],messag:[0,1,5,6,7],messeng:6,metadata:1,metavar:0,method:[0,1,3,5,6],methodolog:[6,7],mhz:[3,6],mi:0,microcontrol:6,microwav:[],might:[1,3,4,6,7],millisecond:[0,7],mind:[4,8],minim:[2,6],minimalsampl:0,minimum:[0,4,6],minut:[0,1,3,6],mix:[1,3,4,7],mobil:6,mode:[0,1,3,6,7,8],modem:[3,4,5,6,8],modifi:6,modul:[0,1,6,7,8],moment:[6,8],momentarili:3,monitor:6,moon:0,mor:[],more:[1,3,4,5,6,8],morej:[],most:[1,3,4,6,7],mostli:[3,4,6],motiv:2,move:[1,6],mqtt:[],mtu:[5,6,8],much:[1,3,4],multi:[6,7,8],multicast:3,multilater:6,multipl:[0,3,4,6,7],multipoint:6,must:[0,1,3,4,5,6],mw:3,my:6,mycal:3,myriad:6,n:[0,6],name:[0,2,3,4,5],namespac:0,nano:1,narg:0,natur:3,nears:6,necesarri:4,necessari:[1,5,6],necessarili:6,need:[0,1,2,3,4,6,7,8],neglig:6,neither:6,neon:0,net:3,netifac:1,network:[0,3,5,6,7,8],network_nam:3,never:[3,5,6],newer:6,newest:6,newli:[4,6],next:[1,4,5,6],next_hop:5,next_hop_interfac:5,nicknam:6,no1cll:3,no_inbound_for:5,no_outbound_for:5,nobl:0,noble_ga:0,noble_gas:0,node:[1,2,3,4,7,8],nodet:[],nomad:2,nomadnet:1,non:[1,5,6],none:[0,3,5,6,7],normal:[0,3,5],notat:[6,7],note:[0,1,3,6,7],noth:8,notic:6,notif:[0,5],now:[0,1,4,6,7],nt:0,num:0,number:[0,1,3,4,5,6,7],obfusc:[],object:5,obtain:6,obviusli:6,occasion:1,occur:8,off:[6,8],offer:[1,2,3,5,6],offlin:1,often:[1,4,6,7],oganesson:0,old:6,on_interfac:5,onc:[0,1,4,5,6,8],one:[0,1,3,4,5,6,7,8],ones:3,oneself:6,onli:[0,1,3,4,5,6,7,8],onlin:[],open:[0,3,4,5,6,7,8],openmodem:[3,8],openssl:1,oper:[3,4,5,6,8],opt:6,optic:8,optim:4,optimis:[],option:[0,1,2,4,5,7],order:7,orem:[],organ:4,organis:[3,4],orient:6,origin:[0,4,6],original_hash:[],os:[0,3,6,7,8],ospf:[],other:[1,3,4,5,6,7],otherwis:5,our:[0,6],out:[0,1,3,4,5,6,8],outbound:5,outgo:[0,1,3,5,6,7],outli:4,outlier:4,outlin:[1,6],output:[3,7],outward:[],over:[0,2,3,5,6,7,8],overal:6,overcom:6,overhead:[3,6],overrid:0,oversight:6,overview:[2,3,6],overwhelm:5,own:[0,1,4,5,6],owner:[],p:0,pack:0,packag:[1,3],packb:0,packet:[0,1,2,3,4,7,8],packet_callback:0,packet_deliv:0,packet_hash:0,packet_receipt:[0,5],packet_timed_out:0,packet_typ:[],packetreceipt:[0,5],pad:8,page:[1,2,6],pair:[3,6],palm:[],parallel:1,paramet:[3,4,5],pariti:[3,7],pars:0,parse_arg:0,parser:0,part:[0,4,6],particip:[2,4,6],pass:[0,3,4,5],passphras:3,past:[],path:[0,1,3,5,6,7],path_respons:5,pathfind:[],pathfinder_m:5,pattern:6,payload:[5,6],peach:0,peer:[0,1,3,5,6,7],peer_pub_byt:[],peer_sig_pub_byt:[],peopl:6,per:[3,5,6,8],percent:0,percentag:5,perfect:[],perform:[0,1,3,4,6],period:[3,6],perman:7,permissionless:6,persecut:6,persist:[3,7],person:6,perspect:6,pet:0,philosophi:6,physic:[1,3,6,7],pi:[0,4,6,7,8],pick:6,piec:6,ping:[1,7],pip3:[1,7],pip:[1,7],pkcs7:8,pkg:1,place:[4,6,7],plain:[0,3,5,6],plain_mdu:5,plaintext:[0,5],plan:[4,6],platform:[1,6],pleas:[0,1,3,7,8],plenti:6,plu:[],plug:7,pmr:6,point:[1,3,4,6,7],pomelo:0,poorli:4,popular:8,port0:7,port:[2,3,4,6,8],portabl:[3,6],posit:7,possess:6,possibl:[1,3,4,5,6,8],potenti:[0,3,6,7],power:[1,3,6],practic:[6,8],pre:[1,3,5,6],preambl:[3,7],precompil:1,predict:6,prefer:6,prepar:[0,4],prerequisit:5,presenc:5,preserv:[1,5],press:0,pretend:6,pretti:6,prettyhexrep:0,previou:0,previous:[4,5,6],primari:6,principl:[6,8],print:[0,3],print_filelist:0,print_help:0,print_menu:0,prioriti:6,prioritis:[2,4,5],privaci:8,privat:[1,3,5,6,8],privileg:7,probabl:[0,4,6,7,8],probe:7,problem:6,procedur:6,process:[1,3,5,6],product:[],program:[0,2,3,5,6],program_setup:0,programm:6,programmat:6,progress:[0,5,8],progress_callback:5,project:1,prompt:0,proof:[0,5,6,7],proof_packet:0,proof_requested_callback:5,proof_strategi:5,propag:[3,5,6],properli:1,properti:[4,5],proport:6,propos:1,protocol:[1,2,3,8],prove:[0,6],prove_al:[0,5],prove_app:5,prove_non:5,proven:[5,6],provid:[0,1,2,3,4,5,6,8],prv_byte:5,pub_byt:5,public_inform:0,publicli:1,purchas:[4,6,8],purg:5,purpos:[3,5,6],purposefulli:[],put:0,py:[0,1,7],pyseri:1,python3:[1,7],python:[1,6,7,8],q:[0,7],queri:[0,1],question:3,queu:5,queue:6,quickli:6,quiet:[3,7],quinc:0,quit:0,r:[0,6],radio:[2,3,4,5,6,7,8],radiu:[],radon:0,rais:[0,5],ram:3,rand:[],randint:0,random:[0,5,6],random_text_gener:0,randomis:6,randomli:[0,6],rang:[0,1,3,4,6,8],raspberri:[4,6,7,8],rate:[0,3,7],rather:1,rb:0,re:[0,3,5,6],reach:[2,3,4],reachabl:[0,1,3,4,5,6,7],read:[0,1,6],readabl:[0,5,6],readi:[0,1,3,4,5,8],readili:8,real:[4,8],realli:[3,5],reason:[3,6],reassembl:6,reboot:1,recal:[0,5],recall_app_data:5,recap:6,receipt:[0,2,6],receiv:[0,1,3,5,6,7],received_announc:[0,5],recent:6,reception_rssi:0,reception_snr:0,reception_stat:0,recip:1,recipi:6,recommend:[0,1,6],reconstruct:6,record:[1,6],recoveri:3,recreat:6,refer:[0,1,2],regard:6,regist:[0,5],register_announce_handl:[0,5],register_request_handl:[0,5],rel:[6,8],relai:1,relat:1,releas:[1,3,6],relev:[0,3,5,6],reli:6,reliabl:[3,4,6,8],rem:0,remain:[5,6],rememb:6,remot:[0,5],remote_ident:[0,5],remote_identifi:0,remote_identity_hash:[],remote_p:0,remotesensor:6,remov:7,render:1,repeat:1,replac:[1,6,7],repli:[0,7],replic:6,reply_data:0,reply_text:0,report:3,repositori:[1,6],repres:6,represent:[0,6],request:[2,6,7],request_destin:0,request_fail:0,request_id:[0,5],request_packet:0,request_path:[0,5],request_receipt:[0,5],request_receiv:0,requested_at:[0,5],requestexampl:0,requestreceipt:5,requir:[0,1,3,4,6,7,8],research:8,resend:5,reserv:6,resili:8,resourc:[0,1,2],resource_callback:5,resource_sending_conclud:0,resource_strategi:5,respect:3,respond:[0,5],respons:[2,5,6],response_callback:[0,5],response_gener:[0,5],response_tim:[],rest:[4,8],restart:7,restartsec:7,restrict:4,result:[0,6],retain:3,reticulum:[0,3,4],retiiculum:[],retransmiss:6,retransmit:6,retri:6,reveal:[1,5,6,8],review:8,ridicul:6,right:4,rn:[0,1,5,7],rnode:[1,2,6,7,8],rnodeinterfac:[3,7],rnpath:[1,2],rnprobe:[1,2],rnsconfig:1,rnsd:[1,2],rnstatu:[1,2,3],robot:6,rotat:6,round:[0,5,7],rout:[1,3,4,5,6,8],routabl:[],router:3,rprogress:0,rsa:[],rssi:0,rtt:[0,5,6],rttstring:0,rule:6,run:[0,1,3,4,5,6,7,8],runtim:6,rust:1,rw:[],rx:3,s:[0,1,3,4,6,7,8],said:6,same:[1,3,4,5,6,7],satisfi:6,save:[5,6],save_error:0,saved_filenam:0,scalabl:8,scale:6,scenario:[1,2,6],schedul:5,scope:3,screen:0,search:2,second:[0,3,5,6,7,8],secreci:[5,6,8],section:[1,3,4,6],secur:[1,6,8],see:[0,1,3,4,5,6,8],seek:6,seen:[],segment:[3,4,6,8],segment_index:[],select:[0,3],self:[0,4,8],send:[0,3,5,6,7],sender:[0,1,4,6],sendig:0,sensibl:1,sensor:6,sent:[0,1,5,6,7],sentiment:6,separ:[1,3,4,6,7],sequenc:[0,5,6,8],serial:[2,6,8],serialinterfac:3,serv:[0,3,4,6,7],serve_path:0,server:[0,1,2],server_callback:0,server_destin:0,server_fil:0,server_ident:0,server_link:0,server_loop:0,server_packet_receiv:0,servic:[1,2,4],session:6,set:[0,1,3,4,5,6,7,8],set_default_app_data:5,set_delivery_callback:[0,5],set_link_closed_callback:0,set_link_established_callback:[0,5],set_packet_callback:[0,5],set_proof_requested_callback:5,set_proof_strategi:[0,5],set_remote_identified_callback:[0,5],set_resource_callback:5,set_resource_concluded_callback:[0,5],set_resource_started_callback:[0,5],set_resource_strategi:[0,5],set_timeout:[0,5],set_timeout_callback:[0,5],setdaemon:0,setup:[0,1,2,3],sever:[1,4,5,7],sha256:8,sha:[5,6],shall:6,share:[1,4,5,6,7],she:4,shelf:[6,8],shop:0,shorter:3,shortest:6,shorthand:[3,7],should:[0,1,3,4,5,6,8],should_allow_unencrypt:[],should_quit:0,should_use_implicit_proof:5,show:7,shown:0,side:8,sideband:2,sight:4,sign:[5,6],signatur:[5,6,8],significantli:[],similar:[1,3,4,7,8],simpl:[0,6,7,8],simpler:3,simplest:[3,6],simpli:[0,1,3,4,6,7],simplic:6,simultan:6,sinc:[0,1,3,4,5,6],singl:[0,3,5,6,8],singular:6,sit:[],site:[2,3],situat:[1,3,4,6],size:[0,1,3,5,6],size_str:0,sleep:[0,7],slice:0,slightli:1,slottim:[3,7],slow:[0,3,6],slower:[5,6],small:[0,3,4,6,8],smaller:5,snr:0,so:[0,1,3,4,5,6,7,8],softwar:[1,3,6,8],solut:6,solv:6,some:[0,1,3,4,6,7],someon:[1,3],someth:6,somethign:0,soon:5,sort:[3,6],soundmodem:3,sourc:[0,1,4,6,8],space:[0,1,4,6,8],span:6,special:[6,7],specif:[0,2,3,5,8],specifi:[0,1,3,4,5,7],spectrum:[3,6],speed:[3,7],split:0,sponsor:8,spread:3,spreadingfactor:3,squelch:3,ssid:3,stabl:[6,8],stack:[0,1,4,6,7,8],stage:[1,6],stai:[0,6,7],standard:[1,6],start:[0,2,3,5,6,7],startlimitintervalsec:[],startup:0,state:0,station:3,stationari:4,statist:0,statu:[0,1,2,3,5,6,7],stdout:0,step:1,still:[0,4,6],stock:0,stop:8,stopbit:[3,7],store:[0,6],store_tru:0,str:0,strategi:5,stream:6,strength:8,strictli:6,string:[0,5],strong:6,structur:6,subject:[],subnet:[1,4],subsequ:6,succe:1,successful:5,successfulli:0,sucessfulli:6,sudo:[1,7],suffic:6,suffici:[1,3,6,7],suffix:0,suit:[1,6],suitabl:[0,1,3,4,6,8],suppli:[4,5,6],support:[0,1,2,4,6,8],sure:[1,7],surveil:6,surviv:6,sy:0,symlink:[1,7],symmetr:[5,6],system:[0,1,2,3,4,5,6,8],systemctl:7,systemd:7,t:[0,1,3,4,5,7],tabl:[1,4,6,7],tail:3,tailor:6,take:[0,1,3,6,8],taken:[0,6],tangerin:0,target:[0,7],target_host:[1,3],target_port:[1,3],tcp:[1,2,4,6,8],tcpclientinterfac:[1,3],tcpinterfac:7,tcpserverinterfac:[1,3],tdata:0,teardown:[0,5],teardown_reason:0,teffect:0,tell:[0,3],temperatur:6,ten:6,term:[4,6],termin:[1,5],terminolog:[4,6],termux:1,test:[1,3,6],testnet:[2,7],text:[0,1,4,6],tfile:0,than:[0,1,4,6],thei:[0,1,4,5,6],them:[0,1,3,4,6],thereaft:6,therefor:[6,8],thi:[0,1,2,3,4,5,6,7],thing:1,think:1,those:[4,6],though:[1,6],thourough:8,thousand:6,thread:0,three:[4,6],throough:3,throttl:4,through:[1,3,4,5,6,8],throughout:6,throughput:[6,8],thu:[4,5,6],ti:[0,6],time:[0,1,3,4,5,6,7],timeout:[0,5,7],timeout_callback:[],timeoutarg:0,timestr:0,tnc:[3,5,7,8],to_fil:5,todai:6,todo:[],togeth:6,token:[5,6],too:[0,4],tool:[6,8],top:[4,6],topic:6,topographi:[1,4,6],topolog:[3,6],total:[6,8],total_s:0,touch:8,toward:[0,6],tradeoff:6,tradit:[4,6],traffic:[0,1,3,4,5,6,7],tramsit:[],transceiv:[1,3,6,8],transfer:[0,5,6,7,8],transfer_s:0,transform:8,transmiss:[1,3,5,6],transmit:[0,3,6],transpar:[3,6],transpor:[],transport:[0,1,2,3,4,7,8],transport_en:5,transport_id:[],transport_typ:[],travers:6,treat:6,tri:0,trip:[0,5,7],trivial:8,truli:6,truncat:[5,6],truncated_hash:5,truncated_hashlength:5,trust:6,trustless:[4,6,8],ttime:0,ttransfer:0,ttyusb0:[3,7],ttyusb1:3,ttyusb2:3,tun0:3,tune:[],tunnel:[3,6,8],tupl:5,turnaround:3,tutori:1,two:[0,1,3,4,6],tx:3,txpower:3,txtail:[3,7],type:[0,1,2,3,4,5,7],typeerror:5,ubuntu:7,udp:[2,4,6,8],udpinterfac:3,uhf:[7,8],ultim:6,umsgpack:0,uncencrypt:0,uncensor:1,under:7,underli:[4,8],understand:[1,2],unencrypt:[0,5,6],unequivoc:6,unexplor:4,unforg:8,unidentifi:0,unifi:4,uninterest:0,uniqu:[6,8],unit:[0,7],unknown:[0,5,6],unless:[1,3,5,6],unlicens:6,unlik:6,unorganis:4,unpack:0,unpackb:0,unplug:7,unreli:3,unsign:[1,7],unsupport:5,until:[0,5],unwant:6,up:[0,1,3,4,6,7,8],updat:[0,1,5,6],upgrad:[1,6],upkeep:3,upon:[0,6],upset:0,urandom:8,us:[0,2,3,4,5,6],usabl:6,usag:[1,3,7],usb:[4,6,7],useabl:6,user:[0,1,3,4,6,7],user_input:0,userland:8,usernameher:7,usr:7,utf:0,util:[0,2,3,6],utilis:[1,4,7,8],v:7,valid:[0,3,5,6,7],valu:[3,5,6],valueerror:[0,5],vari:[6,7],variabl:0,varieti:[3,6,8],variou:[0,1,3,4,6],vast:6,ve:1,vendor:0,verbos:7,veri:[1,4,5,6,7,8],verif:[5,6],verifi:[0,5,6],versa:[4,8],version:7,vhf:[4,6,8],via:[1,3,6,7],vice:[4,8],view:[1,6,7],virtual:[3,4,6,8],visibl:0,w:7,wa:[0,3,4,5,6,8],wai:[0,1,3,4,6],wait:[0,6],want:[0,1,3,4,6,7,8],wantedbi:7,warrant:8,wast:3,wb:0,we:[0,1,3,6],websit:3,weight:7,welcom:1,well:[1,3,4,5,6,8],went:0,were:4,what:[0,1,2,5,6],whatev:[5,6],wheel:1,when:[0,1,3,4,5,6,7],whenev:[5,6],where:[1,2,3,4,5,6,7],whereupon:6,whether:[0,3,5,6],which:[0,1,3,4,5,6,7],who:[1,6],wide:[3,6,8],wider:[1,6],wifi:[1,3,4,6,7,8],wildcard:0,willing:4,window:[],wire:[1,2,3,8],wireless:4,wish:6,within:[0,1,3,4,5,6],without:[1,4,6,8],wlan0:3,won:0,work:[1,4,6,7,8],world:[4,8],worri:4,would:[1,3,4,5,6],write:[0,1,5,6],written:6,wrong:0,x25519:[5,6,8],x:6,xenon:0,y:0,ye:[1,3,6],year:6,yet:[0,3,6],yi:0,ykzlw5ujbaqc2xkec4cpvgyxj257wcrmmgkuxqmqcur7cq3w3lha:1,you:[0,1,2,3,4,5,6,7,8],your:[0,1,2,3,4,6,8],yourself:[6,8],z:0,zero:[5,8],zeromq:[],zi:0},titles:["Code Examples","Getting Started Fast","Reticulum Network Stack Manual","Supported Interfaces","Building Networks","API Reference","Understanding Reticulum","Using Reticulum on Your System","What is Reticulum?"],titleterms:{"1":[],"2":[],"25":3,"class":5,"function":6,"public":[1,6],"try":1,The:[6,7],With:1,ad:1,android:1,announc:[0,6],api:5,arm64:1,auto:3,ax:3,base:1,basic:6,binari:[],bridg:4,broadcast:0,build:4,can:8,caveat:8,client:3,code:0,common:3,concept:4,configur:7,connect:1,converg:4,creat:1,current:8,deliveri:[],destin:[5,6],detail:6,develop:1,devic:8,doe:8,echo:0,emptor:8,establish:6,exampl:[0,4],fast:1,filetransf:0,fix:7,format:6,further:6,get:[1,6],gipsum:[],goal:6,growth:4,i2p:3,ident:[5,6],identif:0,improv:7,includ:[1,7],indic:2,instanc:1,interconnect:4,interfac:[1,3,8],internet:[1,4],introduct:6,kei:6,kiss:3,link:[0,5,6],lora:[3,4],manual:2,mechan:6,minim:0,motiv:6,name:[6,7],network:[1,2,4],node:6,nomad:1,offer:8,option:3,orem:[],over:[1,4],overview:4,packet:[5,6],particip:1,pathfind:[],port:7,predict:[],prioritis:6,program:[1,7],protocol:6,proven:[],radio:1,reach:6,receipt:5,refer:[5,6],request:[0,5],resourc:[5,6],respons:0,reticulum:[1,2,5,6,7,8],retiiculum:[],rnode:3,rnpath:7,rnprobe:7,rnsd:7,rnstatu:7,run:[],scenario:4,serial:[3,7],server:3,servic:7,setup:6,sideband:1,site:4,specif:6,stack:2,start:1,statu:8,step:[],support:3,system:7,tabl:2,tcp:3,testnet:1,transport:[5,6],type:[6,8],udp:3,understand:6,us:[1,7,8],util:[1,7],what:8,where:8,wire:6,your:7}}) \ No newline at end of file diff --git a/docs/manual/understanding.html b/docs/manual/understanding.html index cbe51e5..e4074ed 100644 --- a/docs/manual/understanding.html +++ b/docs/manual/understanding.html @@ -328,26 +328,27 @@ certain pattern. This will be detailed in the section protocols such as IP, where an address is always expected to stay within the network segment it was assigned in. This limitation does not exist in Reticulum, and any destination is completely portable over the entire topography of the network, and can even be moved to other Reticulum networks than the one it was created in, and -still be reachable. To update it’s reachability, a destination simply needs to send an announce on any -networks it is part of.

+still become reachable. To update it’s reachability, a destination simply needs to send an announce on any +networks it is part of. After a short while, it will be globally reachable in the network.

Seeing how single destinations are always tied to a private/public key pair leads us to the next topic.

Identities

In Reticulum, an identity does not necessarily represent a personal identity, but is an abstraction that -can represent any kind of verified entity. This could very well be a person, but it could also be the +can represent any kind of verifiable entity. This could very well be a person, but it could also be the control interface of a machine, a program, robot, computer, sensor or something else entirely. In general, any kind of agent that can act, or be acted upon, or store or manipulate information, can be represented as an identity. An identity can be used to create any number of destinations.

-

As we have seen, a single destination will always have an identity tied to it, but not plain or group +

A single destination will always have an identity tied to it, but not plain or group destinations. Destinations and identities share a multilateral connection. You can create a destination, and if it is not connected to an identity upon creation, it will just create a new one to use automatically. This may be desirable in some situations, but often you will probably want to create the identity first, and then use it to create new destinations.

-

Building upon the simple messenger example, we could use an identity to represent the user of the -application. Destinations created will then be linked to this identity to allow communication to -reach the user. In all cases it is of great importance to store the private keys associated with any -Reticulum Identity securely and privately.

+

As an example, we could use an identity to represent the user of a messaging application. +Destinations can then be created by this identity to allow communication to reach the user. +In all cases it is of great importance to store the private keys associated with any +Reticulum Identity securely and privately, since obtaining access to the identity keys equals +obtaining access and controlling reachability to any destinations created by that identity.

Getting Further

@@ -360,77 +361,74 @@ hops in the network.

Reticulum Transport

-

The term routing has been purposefully avoided until now. The current methods of routing used in IP-based -networks are fundamentally incompatible with the physical link types that Reticulum was designed to handle. -These routing methodologies assume trust at the physical layer, and often needs a lot more bandwidth than -Reticulum can assume is available.

-

Since Reticulum is designed to survive running over open radio spectrum, no such trust exists, and bandwidth -is often very limited. Existing routing protocols like BGP or OSPF carry too much overhead to be practically -useable over bandwidth-limited, high-latency links.

-

To overcome such challenges, Reticulum’s Transport system uses public-key cryptography to +

The methods of routing used in traditional networks are fundamentally incompatible with the physical medium +types and circumstances that Reticulum was designed to handle. These mechanisms mostly assume trust at the physical layer, +and often needs a lot more bandwidth than Reticulum can assume is available. Since Reticulum is designed to +survive running over open radio spectrum, no such trust can be assumed, and bandwidth is often very limited.

+

To overcome such challenges, Reticulum’s Transport system uses asymmetric elliptic curve cryptography to implement the concept of paths that allow discovery of how to get information closer to a certain destination. It is important to note that no single node in a Reticulum network knows the complete path to a destination. Every Transport node participating in a Reticulum network will only -know what the most direct way to get a packet one hop closer to it’s destination is.

+know the most direct way to get a packet one hop closer to it’s destination.

Node Types

Currently, Reticulum distinguishes between two types of network nodes. All nodes on a Reticulum network are Reticulum Instances, and some are alo Transport Nodes. If a system running Reticulum is fixed in -one place, and is intended to be kept available most of the time, it can be a Transport Node, by enabling -it in the configuration.

-

This distinction is made by the user configuring the node, and is used to determine what nodes on the +one place, and is intended to be kept available most of the time, it is a good contender to be a Transport Node.

+

Any Reticulum Instance can become a Transport Node by enabling it in the configuration. +This distinction is made by the user configuring the node, and is used to determine what nodes on the network will help forward traffic, and what nodes rely on other nodes for wider connectivity.

-

If a node is a Instance it should be given the configuration directive enable_transport = No, which +

If a node is an Instance it should be given the configuration directive enable_transport = No, which is the default setting.

If it is a Transport Node, it should be given the configuration directive enable_transport = Yes.

The Announce Mechanism in Detail

-

When an announce is transmitted by from a Reticulum instance, it will be forwarded by any transport node receiving it, but -according to some specific rules:

+

When an announce for a destination is transmitted by from a Reticulum instance, it will be forwarded by +any transport node receiving it, but according to some specific rules:

  • If this exact announce has already been received before, ignore it.
  • -
    If not, record into a table which node the announce was received from, and how many times in +
    If not, record into a table which Transport Node the announce was received from, and how many times in total it has been retransmitted to get here.
  • -
    If the announce has been retransmitted m+1 times, it will not be forwarded. By default, m is +
    If the announce has been retransmitted m+1 times, it will not be forwarded any more. By default, m is set to 128.
  • -
    The announce will be assigned a delay d = ch seconds, where c is a decay constant, and h is the amount of times this packet has already been forwarded.
    +
    After a randomised delay, the announce will be retransmitted on all interfaces that have bandwidth +available for processing announces. By default, the maximum bandwidth allocation for processing +announces is set at 2%, but can be configured on a per-interface basis.
  • -
    The packet will be given a priority p = 1/d.
    +
    If any given interface does not have enough bandwidth available for retransmitting the announce, +the announce will be assigned a priority inversely proportional to it’s hop count, and be inserted +into a queue managed by the interface.
  • -
    If at least d seconds has passed since the announce was received, and no other packets with a -priority higher than p are waiting in the queue, and the channel is -not utilized by other traffic, the announce will be forwarded.
    +
    When the interface has bandwidth available for processing an announce, it will prioritise announces +for destinations that are closest in terms of hops, thus prioritising reachability and connectivity +of local nodes, even on slow networks that connect to wider and faster networks.
  • -
    If no other nodes are heard retransmitting the announce with a greater hop count than when -it left this node, transmitting it will be retried r times. By default, r is set to 1. Retries -follow same rules as above, with the exception that it must wait for at least d = ch+1 + -t + rand(0, rw) seconds. This amount of time is equal to the amount of time it would take the next -node to retransmit the packet, plus a random window. By default, t is set to 10 seconds, and the -random window rw is set to 10 seconds.
    +
    After the announce has been re-transmitted, and if no other nodes are heard retransmitting the announce +with a greater hop count than when it left this node, transmitting it will be retried r times. By default, +r is set to 1.
  • -
    If a newer announce from the same destination arrives, while an identical one is already in -the queue, the newest announce is discarded. If the newest announce contains different -application specific data, it will replace the old announce, but will use d and p of the old -announce.
    +
    If a newer announce from the same destination arrives, while an identical one is already waiting +to be transmitted, the newest announce is discarded. If the newest announce contains different +application specific data, it will replace the old announce.
@@ -439,14 +437,15 @@ node will be able to reach the destination the announce originated from, simply addressed to that destination. Any node with knowledge of the announce will be able to direct the packet towards the destination by looking up the next node with the shortest amount of hops to the destination.

-

According to these rules and default constants, an announce will propagate throughout the network -in a predictable way.

-

As an example, in a network based only on radio transceivers with an average link distance of 15 -kilometers, an announce will be able to propagate outwards over 12 hops, to a radius of 180 -kilometers, in approximately 20 minutes.

-

The design and constants of the decay and delay functionality in the announce propagation is subject -to change and optimisation as real-world usage is explored. The announce propagation speed can be -increased at the cost of increased bandwidth consumption.

+

According to these rules, an announce will propagate throughout the network in a predictable way, +and make the announced destination reachable in a short amount of time. Fast networks that have the +capacity to process many announces can reach full convergence very quickly, even when constantly adding +new destinations. Slower segments of such networks might take a bit longer to gain full knowledge about +the wide and fast networks they are connected to, but can still do so over time, while prioritising full +and quickly converging end-to-end connectivity for their local, slower segments.

+

In general, even extremely complex networks, that utilize the maximum 128 hops will converge to full +end-to-end connectivity in about one minute, given there is enough bandwidth available to process +the required amount of announces.

Reaching the Destination

@@ -504,7 +503,7 @@ strictly necessary to use one of the others.
  • -
    As a part of the link request , a Diffie-Hellman key exchange takes place, that sets up an -efficiently encrypted tunnel between the two nodes, using elliptic curve cryptography. As such, -this mode of communication is preferred, even for situations when nodes can directly communicate, -when the amount of data to be exchanged numbers in the tens of packets.
    +
    As a part of the link request, an Elliptic Curve Diffie-Hellman key exchange takes place, that sets up an +efficiently encrypted tunnel between the two nodes. As such, this mode of communication is preferred, +even for situations when nodes can directly communicate, when the amount of data to be exchanged numbers +in the tens of packets, or whenever the use of the more advanced API functions is desired.
  • @@ -533,6 +532,12 @@ the same proof mechanism discussed before, so the sending node can obta that the information reached the intended recipient.
  • +
  • +
    Once the link has been set up, the initiator can remain anonymous, or choose to authenticate towards +the destination using a Reticulum Identity. This authentication is happening inside the encrypted +link, and is only revealed to the verified destination, and no intermediaries.
    +
    +
  • In a moment, we will discuss the details of how this methodology is implemented, but let’s first recap what purposes this methodology serves. We first ensure that the node answering our request diff --git a/docs/source/understanding.rst b/docs/source/understanding.rst index cec9078..0f579ae 100644 --- a/docs/source/understanding.rst +++ b/docs/source/understanding.rst @@ -287,8 +287,8 @@ In Reticulum, destinations are allowed to move around the network at will. This protocols such as IP, where an address is always expected to stay within the network segment it was assigned in. This limitation does not exist in Reticulum, and any destination is *completely portable* over the entire topography of the network, and *can even be moved to other Reticulum networks* than the one it was created in, and -still be reachable. To update it's reachability, a destination simply needs to send an announce on any -networks it is part of. +still become reachable. To update it's reachability, a destination simply needs to send an announce on any +networks it is part of. After a short while, it will be globally reachable in the network. Seeing how *single* destinations are always tied to a private/public key pair leads us to the next topic. @@ -298,21 +298,22 @@ Identities ---------- In Reticulum, an *identity* does not necessarily represent a personal identity, but is an abstraction that -can represent any kind of *verified entity*. This could very well be a person, but it could also be the +can represent any kind of *verifiable entity*. This could very well be a person, but it could also be the control interface of a machine, a program, robot, computer, sensor or something else entirely. In general, any kind of agent that can act, or be acted upon, or store or manipulate information, can be represented as an identity. An *identity* can be used to create any number of destinations. -As we have seen, a *single* destination will always have an *identity* tied to it, but not *plain* or *group* +A *single* destination will always have an *identity* tied to it, but not *plain* or *group* destinations. Destinations and identities share a multilateral connection. You can create a destination, and if it is not connected to an identity upon creation, it will just create a new one to use automatically. This may be desirable in some situations, but often you will probably want to create the identity first, and then use it to create new destinations. -Building upon the simple messenger example, we could use an identity to represent the user of the -application. Destinations created will then be linked to this identity to allow communication to -reach the user. In all cases it is of great importance to store the private keys associated with any -Reticulum Identity securely and privately. +As an example, we could use an identity to represent the user of a messaging application. +Destinations can then be created by this identity to allow communication to reach the user. +In all cases it is of great importance to store the private keys associated with any +Reticulum Identity securely and privately, since obtaining access to the identity keys equals +obtaining access and controlling reachability to any destinations created by that identity. .. _understanding-gettingfurther: @@ -331,20 +332,16 @@ In the following sections, two concepts that allow this will be introduced, *pat Reticulum Transport =================== -The term routing has been purposefully avoided until now. The current methods of routing used in IP-based -networks are fundamentally incompatible with the physical link types that Reticulum was designed to handle. -These routing methodologies assume trust at the physical layer, and often needs a lot more bandwidth than -Reticulum can assume is available. +The methods of routing used in traditional networks are fundamentally incompatible with the physical medium +types and circumstances that Reticulum was designed to handle. These mechanisms mostly assume trust at the physical layer, +and often needs a lot more bandwidth than Reticulum can assume is available. Since Reticulum is designed to +survive running over open radio spectrum, no such trust can be assumed, and bandwidth is often very limited. -Since Reticulum is designed to survive running over open radio spectrum, no such trust exists, and bandwidth -is often very limited. Existing routing protocols like BGP or OSPF carry too much overhead to be practically -useable over bandwidth-limited, high-latency links. - -To overcome such challenges, Reticulum’s *Transport* system uses public-key cryptography to +To overcome such challenges, Reticulum’s *Transport* system uses asymmetric elliptic curve cryptography to implement the concept of *paths* that allow discovery of how to get information closer to a certain destination. It is important to note that no single node in a Reticulum network knows the complete path to a destination. Every Transport node participating in a Reticulum network will only -know what the most direct way to get a packet one hop closer to it's destination is. +know the most direct way to get a packet one hop closer to it's destination. .. _understanding-nodetypes: @@ -354,13 +351,13 @@ Node Types Currently, Reticulum distinguishes between two types of network nodes. All nodes on a Reticulum network are *Reticulum Instances*, and some are alo *Transport Nodes*. If a system running Reticulum is fixed in -one place, and is intended to be kept available most of the time, it can be a *Transport Node*, by enabling -it in the configuration. +one place, and is intended to be kept available most of the time, it is a good contender to be a *Transport Node*. +Any Reticulum Instance can become a Transport Node by enabling it in the configuration. This distinction is made by the user configuring the node, and is used to determine what nodes on the network will help forward traffic, and what nodes rely on other nodes for wider connectivity. -If a node is a *Instance* it should be given the configuration directive ``enable_transport = No``, which +If a node is an *Instance* it should be given the configuration directive ``enable_transport = No``, which is the default setting. If it is a *Transport Node*, it should be given the configuration directive ``enable_transport = Yes``. @@ -371,37 +368,37 @@ If it is a *Transport Node*, it should be given the configuration directive ``en The Announce Mechanism in Detail -------------------------------- -When an *announce* is transmitted by from a Reticulum instance, it will be forwarded by any transport node receiving it, but -according to some specific rules: +When an *announce* for a destination is transmitted by from a Reticulum instance, it will be forwarded by +any transport node receiving it, but according to some specific rules: * | If this exact announce has already been received before, ignore it. -* | If not, record into a table which node the announce was received from, and how many times in +* | If not, record into a table which Transport Node the announce was received from, and how many times in total it has been retransmitted to get here. -* | If the announce has been retransmitted *m+1* times, it will not be forwarded. By default, *m* is +* | If the announce has been retransmitted *m+1* times, it will not be forwarded any more. By default, *m* is set to 128. -* | The announce will be assigned a delay *d* = c\ :sup:`h` seconds, where *c* is a decay constant, and *h* is the amount of times this packet has already been forwarded. +* | After a randomised delay, the announce will be retransmitted on all interfaces that have bandwidth + available for processing announces. By default, the maximum bandwidth allocation for processing + announces is set at 2%, but can be configured on a per-interface basis. -* | The packet will be given a priority *p = 1/d*. +* | If any given interface does not have enough bandwidth available for retransmitting the announce, + the announce will be assigned a priority inversely proportional to it's hop count, and be inserted + into a queue managed by the interface. -* | If at least *d* seconds has passed since the announce was received, and no other packets with a - priority higher than *p* are waiting in the queue, and the channel is - not utilized by other traffic, the announce will be forwarded. +* | When the interface has bandwidth available for processing an announce, it will prioritise announces + for destinations that are closest in terms of hops, thus prioritising reachability and connectivity + of local nodes, even on slow networks that connect to wider and faster networks. -* | If no other nodes are heard retransmitting the announce with a greater hop count than when - it left this node, transmitting it will be retried *r* times. By default, *r* is set to 1. Retries - follow same rules as above, with the exception that it must wait for at least *d* = c\ :sup:`h+1` + - t + rand(0, rw) seconds. This amount of time is equal to the amount of time it would take the next - node to retransmit the packet, plus a random window. By default, *t* is set to 10 seconds, and the - random window *rw* is set to 10 seconds. +* | After the announce has been re-transmitted, and if no other nodes are heard retransmitting the announce + with a greater hop count than when it left this node, transmitting it will be retried *r* times. By default, + *r* is set to 1. -* | If a newer announce from the same destination arrives, while an identical one is already in - the queue, the newest announce is discarded. If the newest announce contains different - application specific data, it will replace the old announce, but will use *d* and *p* of the old - announce. +* | If a newer announce from the same destination arrives, while an identical one is already waiting + to be transmitted, the newest announce is discarded. If the newest announce contains different + application specific data, it will replace the old announce. Once an announce has reached a node in the network, any other node in direct contact with that node will be able to reach the destination the announce originated from, simply by sending a packet @@ -409,16 +406,16 @@ addressed to that destination. Any node with knowledge of the announce will be a packet towards the destination by looking up the next node with the shortest amount of hops to the destination. -According to these rules and default constants, an announce will propagate throughout the network -in a predictable way. +According to these rules, an announce will propagate throughout the network in a predictable way, +and make the announced destination reachable in a short amount of time. Fast networks that have the +capacity to process many announces can reach full convergence very quickly, even when constantly adding +new destinations. Slower segments of such networks might take a bit longer to gain full knowledge about +the wide and fast networks they are connected to, but can still do so over time, while prioritising full +and quickly converging end-to-end connectivity for their local, slower segments. -As an example, in a network based only on radio transceivers with an average link distance of 15 -kilometers, an announce will be able to propagate outwards over 12 hops, to a radius of 180 -kilometers, in approximately 20 minutes. - -The design and constants of the decay and delay functionality in the announce propagation is subject -to change and optimisation as real-world usage is explored. The announce propagation speed can be -increased at the cost of increased bandwidth consumption. +In general, even extremely complex networks, that utilize the maximum 128 hops will converge to full +end-to-end connectivity in about one minute, given there is enough bandwidth available to process +the required amount of announces. .. _understanding-paths: @@ -465,7 +462,7 @@ For exchanges of small amounts of information, Reticulum offers the *Packet* API For exchanges of larger amounts of data, or when longer sessions of bidirectional communication is desired, Reticulum offers the *Link* API. To establish a *link*, the following process is employed: * | First, the node that wishes to establish a link will send out a special packet, that - traverses the network and locates the desired destination. Along the way, the nodes that + traverses the network and locates the desired destination. Along the way, the Transport Nodes that forward the packet will take note of this *link request*. * | Second, if the destination accepts the *link request* , it will send back a packet that proves the @@ -476,15 +473,19 @@ For exchanges of larger amounts of data, or when longer sessions of bidirectiona * | When the validity of the *link* has been accepted by forwarding nodes, these nodes will remember the *link* , and it can subsequently be used by referring to a hash representing it. -* | As a part of the *link request* , a Diffie-Hellman key exchange takes place, that sets up an - efficiently encrypted tunnel between the two nodes, using elliptic curve cryptography. As such, - this mode of communication is preferred, even for situations when nodes can directly communicate, - when the amount of data to be exchanged numbers in the tens of packets. +* | As a part of the *link request*, an Elliptic Curve Diffie-Hellman key exchange takes place, that sets up an + efficiently encrypted tunnel between the two nodes. As such, this mode of communication is preferred, + even for situations when nodes can directly communicate, when the amount of data to be exchanged numbers + in the tens of packets, or whenever the use of the more advanced API functions is desired. * | When a *link* has been set up, it automatically provides message receipt functionality, through the same *proof* mechanism discussed before, so the sending node can obtain verified confirmation that the information reached the intended recipient. +* | Once the *link* has been set up, the initiator can remain anonymous, or choose to authenticate towards + the destination using a Reticulum Identity. This authentication is happening inside the encrypted + link, and is only revealed to the verified destination, and no intermediaries. + In a moment, we will discuss the details of how this methodology is implemented, but let’s first recap what purposes this methodology serves. We first ensure that the node answering our request is actually the one we want to communicate with, and not a malicious actor pretending to be so.