RBP performs reliable broadcasting of information in networks with dynamic topology. Reliable broadcasting is not trivial when the topology of the network can change due to failure and mobility. The aim is to ensure that all nodes that satisfy certain connectedness criteria receive the information within finite time, and that the source is notified about it. The protocol should furthermore incur as low latency and as few messages as possible.
Similar to the static case, the network is modeled as an undirected connected graph, where each node knows its neighbors but does not know anything more about the topology. The dynamic case requires the handling of connecting and disconnecting network sections. If a new link (i,b) is established and nodes i and b reside in different, unconnected parts of the network, then messages that have been sent to i must be forwarded to b and vice a versa. For example, if i has heard the latest message from source j, and b has not yet heard it because it had no physical path to j, then i forwards this message. If i is still active for the original diffusion computation started at j, then the upcoming link only introduces a new neighbor to which i sends the latest message and waits for an acknowledgment before i acknowledges to its parent (the parent is the node which forwarded the source message to i). If i has already finished its computation for the original diffusion computation, i.e., it reported back to its parent the receipt of acks from all its direct neighbors, then i has to start a new local diffusion computation with itself as the source node. This results in all nodes in b's connected component receivin the latest message from j.
There can be more than one message in a network. For example, different partitions of the network can have different messages which are in transit, and those messages might be forwarded to another partition when a new link comes up. Thus, each node has to store the latest number of a message with respect to a specific source node. Similarly, all other information is parametric in the source node. We summarize the necessary data structure in the following:
The following summarizes the latest version of the pseudocode
for RBP in the case of dynamic networks. It underwent several
revisions due to errors found by formalizing the original pseudocode
with Maude and analysing it with different analysis such as default
test executions and exhaustive search.
Pseudocode of RBP for Dynamic Topologies
Pseudocode and Maude specification are in tight connection.
In order to read the (commented) Maude specification, one should
take the following mapping table into account:
Pseudocode | Maude specification | N^i | nbs: OidSet |
ST^i_j | states: IdStatusPFun |
s^i_j | parents: IdIdPFun |
SQ^i_j | seqNos: IdIntPFun |
ST^i_{jk} | nbsStates: IdIdStatusPFun |
m | M |
i | A |
p,q | B |
j | C |
msg_m for source j from p | msg M to A from B Src C |
ack_m for source j from q | ack M to A from B Src C |
We have defined three test configurations, namely, test1, test2, and test3. The test configuration can be described in the following way:
eq test1 = < a : Node | nbs : nbs(b,c), states : states(state(a,passive), state(b,passive), state(c,passive)), parents : mtparents, seqNos : seqNos(seqNo(a,0), seqNo(b,0), seqNo(c,0)), nbsStates : nbsStates(nbState(a,b,passive), nbState(a,c,passive), nbState(b,b,passive), nbState(b,c,passive), nbState(c,b,passive), nbState(c,c,passive)) > < b : Node | nbs : nbs(a,c), states : states(state(a,passive), state(b,passive), state(c,passive)), parents : mtparents, seqNos : seqNos(seqNo(a,0), seqNo(b,0), seqNo(c,0)), nbsStates : nbsStates(nbState(a,a,passive), nbState(a,c,passive), nbState(b,a,passive), nbState(b,c,passive), nbState(c,a,passive), nbState(c,c,passive)) > < c : Node | nbs : nbs(b,a), states : states(state(a,passive), state(b,passive), state(c,passive)), parents : mtparents, seqNos : seqNos(seqNo(a,0), seqNo(b,0), seqNo(c,0)), nbsStates : nbsStates(nbState(a,a,passive), nbState(a,b,passive), nbState(b,a,passive), nbState(b,b,passive), nbState(c,a,passive), nbState(c,a,passive)) > .
If we execute the default interpreter of Maude on the configuration test1, we get as a result configuration a network, in which node a has send message 1 to both its neighbors b and c. Source node a is also parent of message 1 in nodes b,c. This represents a situation in which the fastest transmission paths are the ones from the source directly to its neighbors. In a real application this might not always be true, due to performance of links. It is possible that there are other paths to send a message from source a to the other nodes of the network. For instance, the message is forwarded via neighbor b to node c. These alternative executions show up in an exhaustive search as presented further down.
More test runs are given in the following file:
Test runs using Maude's default interpreter
Sample execution:
1. Store Maude specification as "rbpDynamic.maude"
2. Start full-maude
3. "Maude> in rbpDynamic.maude"
4. Execute sample runs, e.g., "Maude> (rew test1 .)"
Maude's default interpreter only executes one of the many possible rewrite
paths starting with a given initial term. For a deeper analysis, we
provide a strategy which returns all nonrewritable states reachable
from the initial state. This strategy is parametric in the underlying
protocol, and thus, reusable for both, the static and the dynamic case.
The specification of the strategy
Test runs of this exhaustive search strategy
for the dynamic case
Sample execution:
1. Store Maude specification for strategy as "strat.maude"
2. Start full-maude
3. "Maude> in rbpDynamic.maude"
4. "Maude> in strat.maude"
5. Execute sample runs, e.g., "Maude> (red irreducibleforms(RBP, {'test1}'Configuration, allstaticrules) .)"
If we execute the search strategy on the initial configuration test1, we get three different final states:
If we execute the search strategy on the initial configuration test3, we get four different final states:
[Maude Home Page] |