== NTK_RFC 0015 ==

Subject: Local ANDNA - improving the efficiency of local IP updates

----
This text describes a possible expansion of the current Netsukuku protocol.
It will be included in the final documentation, so feel free to correct it.
But if you want to change the system here described, please contact us first.
----


This solution is based on the following assumption: it is more
probable that a node changes its lower gnodes than its higher ones.
F.e, say that the netsukuku IP of the node is 11.22.33, that is
        33 is the ID of the gnode of level 1
        22 is the ID of the gnode of level 2
        11 is the ID of the gnode of level 3
Then, the following changes: 
        11.22.33 becomes 11.22.77
        11.22.33 becomes 11.22.55
        11.22.33 becomes 11.22.16
are more probable than the following:
        11.22.33 becomes 77.22.33
        11.22.33 becomes 11.88.33
        11.22.33 becomes 99.88.33
We call this assumption as the "Local IP Change assumption".

Considering this, we might want to split the IP and store _separately_
the split parts using ANDNA, in a local manner:
        
        Suppose the node N wants to register the hostname "myhostname".
        Let's say a.b.c.d is the hash of "myhostname".
        Let's say 11.22.33.44 is the Ntk IP of N.
        Do the following:
                Contact the node 11.22.33.d, and tell it to store the pair
                (11.22.33.44, "myhostname")
                Contact the node 11.22.c.d, and tell it to store the pair
                (11.22.33, "myhostname")
                Contact the node 11.b.c.d, and tell it to store the pair
                (11.22, "myhostname")
                Contact the node a.b.c.d, and tell it to store the pair
                (11, "myhostname")
        
        Suppose N changes its IP from 11.22.33.44 to 11.22.30.40.
        Do the following to update the hostname:
                Contact the node 11.22.33.d, and tell it to store the pair
                (11.22.33.40, "myhostname")
                Contact the node 11.22.c.d, and tell it to store the pair
                (11.22.30, "myhostname")
                Halt.
        
        Suppose M wants to resolve "myhostname".
        Do the following:
                Calculate the hash a.b.c.d of "myhostname"
                Contact the node a.b.c.d and ask it about "myhostname".
                It receives the answer from a.b.c.d and has thus
                completed the resolution.
                In order to answer, the node a.b.c.d does the following:
                        It retrieves the (11, "myhostname") pair
                        from its database.
                        It contacts the node 11.b.c.d and asks it
                        about "myhostname".
                        It receives the answer from 11.b.c.d and sends
                        it back to M.
                In order to answer, the node 11.b.c.d will do the following:
                        It retrieves the (11.22, "myhostname") pair.
                        It contacts the node 11.22.c.d and asks it
                        about "myhostname".
                        It receives the answer from 11.b.c.d and sends
                        it back to a.b.c.d.
                In order to answer, the node 11.22.c.d will do the following:
                        It retrieves the (11.22.33, "myhostname") pair.
                        It contacts the node 11.22.33.d and asks it
                        about "myhostname".
                        It receives the answer from 11.22.33.d and sends
                        it back to 11.b.c.d.
                In order to answer, the node 11.22.33.d will do the following:
                        It retrieves the (11.22.33.44, "myhostname") pair, 
                        __which is the complete IP__.
                        It sends the IP back to 11.22.c.d.
                The procedure is thus complete.

                
                
        In all the above procedures, the "approximation method" will
        be used. F.e., if the node a.b.c.d doesn't exist, than the
        node a'.b'.c'.d' will be used, where a'.b'.c'.d' is the closest available
        IP to a.b.c.d.

These are some advantages of the presented method:
        
        1) Faster hostname updates. As shown above, if a node changes
           its IP it will updated only the changed parts in an
           efficient way.
           This fact mitigates the overhead posed by the Communicating Vessel
           System, Network Splits and Network merging.

        1.1) It is more mobile-oriented: the nodes can change their IP without 
             worrying to much about hostname updates.
             However, this doesn't automatically make Netsukuku mobile compliant.

        1.2) For the same reason as above, this method could mitigate
             the effects of using a "Compact gnodes" system. (See
             topology.pdf, paragraph 7.3)

        2) Hostnames of "local" nodes can be resolved faster:
                suppose 10.20.30.40 wants to resolve "myhostname", and
                suppose that "myhostname" is associated to the IP
                "10.20.33.44".
                suppose that a.b.c.d is the hash of "myhostname"
                10.20.30.40 does the following at the same time, or in
                sequentially:
                        1. it tries to resolve "myhostname" using 10.20.30.d
                        2. it tries to resolve "myhostname" using 10.20.c.d
                        3. it tries to resolve "myhostname" using 10.b.c.d
                        4. it tries to resolve "myhostname" using a.b.c.d
                In this example, the first try will fail, because the
                nodes keeping the hostname association are:
                        10.20.33.d
                        10.20.b.d
                        10.c.b.d
                        a.c.b.d
                However, the subsequent tries will succeed, and it is
                more probable that the second will be the first to send
                back the answer, in fact, the node 10.20.c.d is nearer
                to 10.20.30.40 than the nodes 10.b.c.d, a.b.c.d 
                (if b!=20 and a!=10).
                        
        3) SNSD could be improved with this method, using the same
           insights.

TODO:
        - see if the Communicating Vessel System isn't in conflict with
          the "Local IP Change assumption"
        - add this RFC in the wiki and in andna.pdf