Abstract:
An ad-hoc network is a typically a dynamic collection of nodes capable of communicating therebetween without the aid of pre-established infrastructure. Ad-hoc networks differ from traditional networks in that the topology of interconnections between nodes is inherently dynamic and not fixed. Generally, the routing protocols belong to two groups: proactive and reactive. Proactive protocols attempt to maintain correct and up-to-date routing information at every node. Reactive protocols, in turn, collect necessary routing information only if a pair of nodes are to establish a communication. In accordance with embodiments of the invention a reactive ad-hoc network protocol is disclosed that uses controlled flooding to broadcast packets of information within the ad-hoc network. Furthermore, the ad-hoc network protocol does not maintain up-to-date routing information at every node in an ad-hoc network and does not utilize specific control messages to assure that packets within the ad-hoc network follow optimal paths.

Description:
[0001]    This application claims priority as a Continuation-in-Part of U.S. patent application Ser. No. 10/372,167 filed Feb. 25, 2003 entitled “Method for Routing Ad-Hoc Signals”, which itself claims priority from U.S. Provisional Application Ser. No. 60/358,703 filed Feb. 25, 2002 entitled “Method for Routing Ad-Hoc Signals.” 
     
    
     FIELD OF THE INVENTION 
       [0002]    This invention relates to data communication networks and more specifically to a method of routing messages using an ad-hoc data communication network having flexible network topology. 
       BACKGROUND OF THE INVENTION 
       [0003]    An ad-hoc network is a typically a dynamic collection of nodes capable of communicating therebetween without the aid of pre-established infrastructure. Ad-hoc networks differ from traditional networks in that the topology of interconnections between nodes is inherently dynamic and not fixed. Consequently, ad-hoc networks do not rely on a centralized authority in order to coordinate the communication between the nodes. 
         [0004]    A number of routing protocols used to implement ad-hoc networks have been presented in the literature. Generally, the routing protocols belong to two groups: proactive and reactive. Proactive protocols attempt to maintain correct and up-to-date routing information at every node. This information is then used to establish connections between the nodes that wish to communicate. Reactive protocols, in turn, collect necessary routing information only if a pair of nodes are to establish a communication. 
         [0005]    Many existing ad-hoc network protocols are rather complex, which seems to be one of the reasons why ad-hoc devices utilizing ad-hoc protocols are not widely available. Considering a highly dynamic nature of ad-hoc networks, that frequent change in their topology, it is the opinion of those of skill in the art that reactive protocols are more suitable for use in this environment. Furthermore, overhead associated with maintaining up-to-date routing information at every node in an ad-hoc network is known to be expensive. 
         [0006]    The dynamic environment of ad-hoc networks calls for new routing protocols to be implemented, since the traditional routing protocols are not current with frequent topology changes that occur in ad-hoc networks. 
       OBJECT OF THE INVENTION 
       [0007]    It is an object of this invention to provide a method of routing signal data using a wireless ad-hoc network in which network topology changes are frequent 
       SUMMARY OF THE INVENTION 
       [0008]    In accordance with an embodiment of the present invention, there is provided a method of providing a reactive ad-hoc network comprising the steps of: 
         [0000]    (a) providing at least a source node, a first node, a second other node, and a destination node of a plurality of nodes, each node comprising at least a processor, a memory, and a transceiver in communication with the processor for receiving data and transmitting data via a wireless communication medium;
 
(b) providing a packet of data comprising message data and header data to the processor of the first node for transmission therefrom, the header data comprising data relating to the source node and the destination node for the packet of data, data relating to a number of hops already completed for the packet of data, data relating to mobility of packets of data within the reactive ad-hoc network transmitted from the source node to the destination node and the destination node to the source node, data relating to a number of hops between the source node and the destination node for a previous packet of data, and a unique identifier for the packet of data;
 
(c) transmitting the data from the transceiver of the first node in a broadcast fashion;
 
(d) receiving the data at the transceiver of the second other node;
 
(e) calculating at the second other node a discard counter, the discard counter determined in dependence upon at least the direction of the packet relative to the source node and destination node, a packet mobility factor in the direction of the packet, the number of hops from the source node to the second other node, the number of hops from the destination node to the second other node and the number of hops between the source node and destination node for a previous packet of data;
 
(f) determining whether to discard the packet in dependence upon at least the discard counter; and
 
(g) discarding the packet and decrementing the discard counter where the determination is made to discard.
 
         [0009]    In accordance with another embodiment of the invention there is provided a method of providing a reactive ad-hoc network comprising the steps of: 
         [0000]    (a) providing at least a first node, a second other node, a source node and a destination node of a plurality of nodes, each node comprising at least a processor, a memory, and a transceiver in communication with the processor for receiving data and transmitting data via a wireless communication medium;
 
(b) providing packet of data comprising message data and header data to the processor of the first node for transmission therefrom, the header data comprising data relating to the source node and the destination node for the packet of data, data relating to a number of hops already completed for the packet of data, data relating to mobility of packets of data within the reactive ad-hoc network transmitted from the source node to the destination node and the destination node to the source node, data relating to a number of hops between the source node and the destination node for a previous packet of data, and a unique identifier for the packet of data;
 
(c) transmitting the data from the transceiver of the first node to the transceiver of the destination node without modification via the second other node other than the first node or the destination node absent a known available route; and
 
(d) calculating at the second other node a discard counter, the discard counter determined in dependence upon at least the direction of the packet relative to the source node and destination node, a packet mobility factor in the direction of the packet, the number of hops from the source node to the second other node, the number of hops from the destination node to the second other node and the number of hops between the source node and destination node for a previous packet of data;
 
(f) determining whether to discard the packet in dependence upon at least the discard counter; and
 
(g) discarding the packet and decrementing the discard counter where the determination is made to discard.
 
         [0010]    In accordance with another embodiment of the invention there is provided a node forming part of a reactive ad-hoc network comprising: 
         [0000]    (a) a processor;
 
(b) a memory in communication with the processor;
 
(c) a transceiver in communication with the processor for receiving signals and for transmitting signals, the signals transmitted and received via a wireless communication medium; and
 
(d) an application in execution upon the processor executing an ad-hoc communications protocol to communicate with at least one other node to form an ad-hoc network, the application:
 
(i) at least one of generating, receiving from the transceiver and providing to the transceiver a packet of data comprising message data and header data, the header data comprising data relating to a source node and a destination node for the packet of data, data relating to a number of hops already completed for the packet of data, data relating to mobility of packets of data within the reactive ad-hoc network transmitted from the source node to the destination node and the destination node to the source node, data relating to a number of hops between the source node and the destination node for a previous packet of data, and a unique identifier for the packet of data;
 
(ii) calculating a discard counter, the discard counter being determined in dependence upon at least the direction of a received packet relative to the source node and destination node, a packet mobility factor in the direction of the packet, the number of hops from the source node to the second other node, the number of hops from the destination node to the second other node and the number of hops between the source node and destination node for a previous packet of data; and
 
(iii) determining whether to discard the packet in dependence upon at least the discard counter and discarding the packet and decrementing the discard counter where the determination is made to discard.
 
     
    
     
       BRIEF DESCRIPTION OF THE DRAWINGS 
         [0011]    Exemplary embodiments of the invention will now be described in conjunction with the following drawings, in which: 
           [0012]      FIG. 1  is a simplified diagram of an ad-hoc network; 
           [0013]      FIG. 2  illustrates a simplified diagram of an application layer, a transport layer, a Network Layer  203 , including the TARP, and a data link layer  204 , in accordance with an embodiment of the invention; 
           [0014]      FIG. 3A  illustrates a Duplicate Discard (DD) process steps; 
           [0015]      FIG. 3B  illustrates a Sub-optimal Path Discard (SPD) process steps; 
           [0016]      FIG. 4  illustrates a node in the AHN having memory therein for storing of cache data; 
           [0017]      FIG. 5A  illustrates a flowchart of the PacketTransmission process; 
           [0018]      FIG. 5B  illustrates a flowchart of the PacketTransmissionResult process; 
           [0019]      FIG. 5C  illustrates a flowchart for the PacketFwdRcv process; 
           [0020]      FIG. 5D  illustrates a flowchart for the PacketFwdRcvResult process; 
           [0021]      FIG. 5E  illustrates a flowchart for the CacheTimer process; 
           [0022]      FIG. 6A  illustrates a flowchart for the dupDiscardAlg function; 
           [0023]      FIG. 6B  illustrates a flowchart for the getTransmissionTime function; 
           [0024]      FIG. 6C  illustrates a flowchart for the subPathDiscardAlg function; 
           [0025]      FIG. 6D  illustrates a flowchart for the deterministicDiscard function; 
           [0026]      FIG. 6E  illustrates a flowchart for the probabilisticDiscard function; 
           [0027]      FIG. 6F  illustrates a flowchart for the avgTransmissionTime function; 
           [0028]      FIG. 7  illustrates three nodes, S, D, and K, with node K disposed between nodes S and D; 
           [0029]      FIG. 8  illustrates nodes S and D, having a first path that involves propagation intermediate nodes K, L and M, and a second path that involves propagation through a single intermediated node Z; 
           [0030]      FIG. 9A  illustrates a table showing SPD source cache entries for nodes D and S for a packet p 1  sent by D to S and arriving at node S; 
           [0031]      FIG. 9B  illustrates the SPD cache entries at nodes K, L, and M; 
           [0032]      FIG. 9C  illustrates a reverse of that shown in  FIG. 9   a , where a packet p 2  of a reverse communication session from S to D arrives at node D; 
           [0033]      FIG. 9D  illustrates the SPD cache entries at nodes K, L, and M, where the packet traveling from nodes S to D carries values of path  h =2 and mobility factor  m =1; 
           [0034]      FIG. 9E  illustrates further SPD cache entries at nodes K, L, and M where a packet p 3  is sent by nodes D to S for arrival at node S; 
           [0035]      FIG. 9F  illustrates the SPD cache at nodes K, L, and M, where a packet p 4  of a reverse communication session from nods S to D arrives to node D; 
           [0036]      FIG. 9G  illustrates the SPD cache at nodes K, L, and M, where a packet p 5  sent by node D to node S arrives at S; 
           [0037]      FIG. 9H  illustrates the SPD cache  401  at nodes K, L, and M, where after transmission of packet p 6  from S to D, packet p 7  from D to S, and packet p 8  of a reverse communication session from S to D; and, 
           [0038]      FIG. 10  illustrates an example where setting F(p) to its maximum value of p=1 is potentially beneficial. 
       
    
    
     DETAILED DESCRIPTION 
       [0039]    Typically, an ad-hoc network (AHN) offers the possibility to connect large numbers of communication devices, in the form of nodes, without significant infrastructure costs. Each node within the AHN has three functions. As is illustrated in  FIG. 1 , a node is either for being a source  101  of signal data transmitted through the AHN, a final destination  103  of signal data transmitted through the ad-hoc network, or a relay  102  for propagating signal data between two nodes. Through ad-hoc networks various types of signal data are transmittable from one node to another node as long as the nodes are in transmission and reception range with each other. Node K  102  is intermediate to nodes S and D, and therefore packets from nodes S to D, or D to S, are preferably propagated through node K. 
         [0040]    Ad-hoc networks are dynamic networks that support moving, removing and addition of nodes therein. Typically, prior art AHNs require large bandwidth nodes to manage signals propagating between the nodes thereof. 
         [0041]    Referring to  FIG. 1 , a simplified diagram of an ad-hoc network is shown. The network comprises a source node  101 , a destination node  103  and an intermediary node  102 . As is well known in the art, there may be any number of intermediary nodes. Each intermediary node is provided with wireless communication hardware for transmitting, receiving, and relaying of data. 
         [0042]    To overcome drawbacks, of prior art ad-hoc networks, the ad-hoc networks preferably provide a method of preventing bottlenecks as a result of signal routing for use in directing relayed signals toward an intended destination. This is particularly useful in proactive ad-hoc networks. Unfortunately, these methods of implementing signal extinction are often cumbersome and require significant processing power and system resources. 
         [0043]    The present invention as described herein with reference to particular embodiments thereof is in reference to a protocol, in the form of a tiny ad-hoc routing protocol (TARP) for routing ad-hoc signals within the ad-hoc network. Preferably, the embodiments of the invention allow for transmitting and receiving of signals within the AHN with a limited bandwidth. Further preferably, the protocol functions with the use of a relatively small capacity memory  104  disposed in each node for storing executable instructions for implementing of the protocol. 
         [0044]    Referring to  FIG. 2 , a simplified diagram of an application layer  201 , a Transport Layer  202 , a Network Layer  203 , including the TARP, and a data link layer  204 , in accordance with an embodiment of the invention, are shown. The TARP is described hereinbelow with the use of the following functions, processes and processes. 
         [0045]    The idea behind TARP is based on a process termed “controlled flooding.” When a node sends a packet, the packet broadcasts it to neighbouring nodes, where this approach is particularly natural is in wireless networks where all received nodes are sufficiently close to a transmitter in order to receive the transmission. 
         [0046]    A node receiving the packet determines from a destination field of the packet whether it is an intended receiver of the packet and the node receives the packet. In the process of receiving the packet by the node, a payload of the packet is provided to the Transport Layer  202 . 
         [0047]    Otherwise, the node uses processes in accordance with embodiments of the invention to limit a number of packets in the network. These processes are: a Duplicate Discard (DD) process and a Sub-optimal Path Discard (SPD) process, which are described hereinbelow. 
         [0048]    In execution of the DD process, as illustrated in  FIG. 3A , a node checks the packet in order to determine if it has already processed the packet. If the answer is no, the packet is rebroadcast from this node, otherwise, the received packet is a copy of an original packet. The original packet has propagated through this node using a possibly shorter path. Thus, the packet is discarded since there is little point in forwarding the same packet over the previously used path. 
         [0049]    In the SPD process, as illustrated in  FIG. 3B , a node determines whether it lies on the shortest path between a packet&#39;s source and destination nodes, using predetermined fields in the packet&#39;s header. If the path is deemed to be shortest, the packet is rebroadcast from this node. Otherwise, the packet is discarded. There is little point in forwarding a packet that has a high probability of being discarded by a destination node since it is a duplicate. Typically, this occurs when a copy of that packet arrived at a destination node faster after having propagated using a shorter path. 
         [0050]    In order for a node to determine that the received packet is a duplicate in implementing of the DD process, the packet preferably stores certain information therein relating to its predecessor node. It is preferable for the node to determine a sufficient timeout after which the packet is deleted. If the packet is kept for too long in the node, the memory requirements for the potentially increase. If the packet is deleted too early, a packet&#39;s duplicate is potentially propagated in the AHN, thus potentially wasting AHN bandwidth. 
         [0051]    In implementing of the SPD process, a node discards packets sent by a given source node once it has determined that it is not located on the sub-optimal path. At some point, however, the node resumes forwarding packets. The SPD process thus dynamically determines a predetermined amount of time for which packets are discarded. 
         [0052]    Packet Format. 
         [0053]    Each packet propagated in the AHN comprises fields listed hereinbelow. The Network Layer  203  header of every packet contains the following fields: └ID, r, h,  h , m.  m _, where the packet id is determined from the following ID=S, D, s, n, k, where: 
         [0054]    S—source node of a packet; 
         [0055]    D—destination node of a packet; if D=0, then the packet is broadcast; 
         [0056]    s—identifier unique for a communication session from S to D; 
         [0057]    n—sequential number of a packet sent by S to D during a communication session whose identifier is s; 
         [0058]    k—transmission number of a packet identified by S, D, s and n that allows the Network Layer  203  to distinguish retransmissions of the same packet; 
         [0059]    r—the maximum range of a packet expressed in hops, a packet is removed from the network when h=r 
         [0060]    h—hop counter that measures the number of hops that a packet has traveled so far (h=0 at a source); 
         [0061]      h —the number of hops traveled by the last packet on the reverse path from D to S; 
         [0062]    m—mobility factor to be used by the SPD process for communication session from S to D; 
         [0063]      m —mobility factor to be used by the SPD process by a reverse communication session from D to S (both m and  m  are short—2, 3 bits) 
         [0064]    The last four fields are used by Sub-optimal Path Discard (SPD) process that discards packets relayed over a sub-optimal path. If D=0, the packet is delivered to all destinations nodes that are no further than r hops away from source S. This provides the broadcasting capability to the TARP. More on the SPD process is described hereinbelow. 
         [0065]    Control Messages. 
         [0066]    Control messages are exchanged between Transport Layer  202 , Network Layer  203  and Data Link Layer  204 . The purpose of these control messages is to notify the protocols in execution within the Network Layer  203  and in the Transport Layer  202  about whether the transmission of a packet to a neighboring node was a success or not. 
         [0067]    DLSuccTrans(ID) and DLFailTrans(ID) are control messages that are received by the Network Layer  203  (TARP) from the Data Link Layer  204 , where: A DLSuccTrans(ID) message indicates that the Data Link Layer  204  successfully sent a packet identified by ID. Thus, a neighboring node received the packet. A packet is optionally successfully received by several neighboring nodes, where each of these events generates a separate DLSuccTrans message. A DLFailTrans(ID) message indicates that the Data Link Layer  204  was unable to send a packet identified by ID. This message is generated when the Data Link Layer  204  generates a time out signal waiting for an acknowledgement of packet receipt from any neighboring node. 
         [0068]    NLSuccTrans(ID) and NLFailTrans(ID) are messages that are provided from the Network Layer  203  (TARP)  203  to the Transport Layer  202 , where: a NLSuccTrans(ID) message corresponds to the DLSuccTrans(ID) message and is triggered by the DLSuccTrans(ID) message. A NLFailTrans(ID) message corresponds to the DLFailTrans(ID) message and is triggered by the DLFailTrans(ID) message. 
         [0069]    Timing Parameters. 
         [0070]    Various timing parameters are used for implementing of the TARP and are defined hereinbelow: 
         [0071]    Δt t —transmission time, the time between when a packet is provided to the Data Link Layer and when the Data Link Layer returns a message that indicates that the packet was received by a neighboring node; 
         [0072]    Δt avg —average transmission time of a packet; 
         [0073]    t cur  the current time; 
         [0074]    Δt r —time for which an entry is kept in a DD cache; 
         [0075]    t r —time at which a DD cache entry is to be deleted, if an entry is deleted at a current time t cur , the entry in the DD cache was made at time Δt r —ΔT r ; 
         [0076]    Δt avg —time for which an entry is kept in a transmission time register; 
         [0077]    t b —time at which an entry is made in a transmission time register 
         [0078]    DD Cache. 
         [0079]    In accordance with that illustrated in  FIG. 4 , a DD cache  403  is for use by the Duplicate Discard (DD) process. Nodes executing the TARP do not maintain routing tables therein, thus no information about the propagation path is kept. Instead, each node  100  is provided with a routing cache memory  104 , the purpose of which is to keep certain entries that are used to identify packets that propagate there through. 
         [0080]    The DD cache  403  is implemented as a routing cache in the TARP protocol. Storing of some entries within the DD cache  403  allows a node to delete duplicate packets according to the Duplicate Discard process. Preferably the DD cache  403  entry stores the ID of a packet and the time t, at which the stored ID of a packet is to be deleted. 
         [0081]    Transmission Time Register. 
         [0082]    A transmission time register  404  is used by a transmitter node to calculate a transmission time Δt t  for the packet. The transmission time is calculated as a difference between a time at which the packet ID is provided to the Data Link Layer  204  and the time at which the Data Link Layer  204  returns a message that the packet is received by a neighboring node. The transmission time is further used to measure an average transmission time Δt avg , and calculate the time t r  at which DD cache  403  entries are to be deleted, where the DD process utilizes this transmission time. 
         [0083]    Unlike the DD cache  403 , the size of transmission time register  404  is typically sufficient to store an entry corresponding to only one packet. Specifically, the entry comprises the ID of a packet and time t b  at which this entry was stored into the transmission time register  404 . 
         [0084]    An entry from the transmission time register  404  is deleted when time Δt b  expires, where this time ΔT b  is dependent upon the average transmission time Δt avg . 
         [0085]    SPD Cache. 
         [0086]    An SPD cache  401  is used by the Sub-optimal Path Discard (SPD), where an entry in this cache for use by an intermediate node K ( FIG. 1 ) has the following fields: 
         [0087]    identification S of a node; 
         [0088]    identification D of a node; 
         [0089]    number of hops h dk  between D and the intermediate node K, where this entry is a result of the most recent packet sent by D and addressed to S when it propagated through the intermediate node; 
         [0090]    discard counter C sd  to be used by the process to control the flow from S to D; 
         [0091]    number of hops h sk  between S and the intermediate node K, where this entry is the result of the most recent packet sent by S and addressed to D when it propagated through the intermediate node; 
         [0092]    discard counter C ds  to be used by the process to control the flow from D to S. 
         [0093]    Every node stores a single entry [S, D, h sk , C ds , h dk , C ds ] that is used by two sessions between nodes: the one from S to D, and the one from D to S. Fields h dk  and C sd  are used by an S to D communication session, while fields h sk  and C ds  are used by a D to S communication session. In this manner, only a single entry is stored for packets propagating from S to D, and from D to S. 
         [0094]    Every consecutive packet from S to D, or from D to S, alters the contents of the SPD cache entry. Specifically, a packet sent by S to D updates fields h sk  and C ds , which are used by the SPD process to control packet traffic flowing from D to S. Packets sent by D to S update fields h dk  and C sd , which are use to control packet traffic propagating from S to D. Of course, the time at which a given entry in the SPD cache  401  is deleted depends on the corresponding contents of the DD cache. 
         [0095]    SPD Source Cache. 
         [0096]    Similar to the SPD cache  401 , an SPD source cache  402  is used by the Sub-optimal Path Discard (SPD) process, where the SPD source cache  402  stores an entry in its buffer in dependence upon each destination node to which a packet is transmitted. Thus, if source S transmits to three different destination nodes, three different entries are stored in the buffer. 
         [0097]    The format of an entry stored in the buffer is as follows: ID of a destination node D, a number of hops  h  traveled by the latest packet from D to S, and mobility factor  m  of the packet for used by the SPD process for packet exchange from S to D. Similar to the SPD cache  401 , the time at which a given entry is deleted from SPD source cache  402  depends on the corresponding contents of a DD cache  403 . 
         [0098]    Node Processes. 
         [0099]    Each node  100  executes independent processes, illustrated in  FIG. 5 , such as: a PacketTransmission process, PacketTransmissionResult process, PacketFwdRcv process, PacketFwdRcvResult process, and a CacheTimer process, described hereinbelow. 
         [0100]    PacketTransmission. 
         [0101]    This process transmits a new packet with entries └ID, r, h=0,  h , m,  m ┘ from a source node S. A packet being received from the Transport Layer  202  triggers the PacketTransmission process. A flowchart of the PacketTransmission process is illustrated in  FIG. 5A . 
         [0102]    This process waits for a new packet from the Transport Layer  202 . As soon as this new packet arrives, the process checks if an entry in the transmission time register  404  is empty. The Transmission time register  404  stores at most one entry that comprises the ID of a packet and the time at which that entry was made. The entry is made when the packet that is distinguished by ID is provided to the Data Link Layer  204 . 
         [0103]    As mentioned before, the transmission time register  404  is used to measure a transmission time Δt t , which is the earliest time it takes the Data Link Layer  204  to successfully transmit a packet to a neighboring node. Of course, since there is only space for only one entry in this register  404 , not every packet sent by a transmitting node takes part in these measurements. 
         [0104]    If the transmission time register  404  is non-empty, it means that the PacketTransmission process has already provided a packet to the Data Link Layer  204 , and the Data Link Layer  204  has not yet responded with a message indicating whether the packet was received by a neighboring node or not. Thus, the Data Link Layer  204  is still busy transmitting a previous packet. In such a case, the process fetches the time t b  from the transmission time register  404 , and calculates the time that has elapsed since then. If this time is greater than the maximum time Δt b  for which the entry is to be stored in the register  404 , a time for Δt b  has not been determined properly. Thus, Δt b  is doubled and the transmission time register&#39;s  404  content is cleared. 
         [0105]    If the transmission time register  404  is empty, the ID of a packet and the current time are stored in the transmission time register  404 , and the values of  h  and  m  are then fetched from the SPD source cache  402 . These values are the number of hops and a mobility factor, respectively, resulting from the last packet sent by destination node D and received by source node S. These two values correspond to a reverse communication session from nodes D to S and the SPD process uses these values. 
         [0106]    The other two fields are number of hops h that a packet from nodes S to D has propagated, if the value for this field is 0, then the mobility factor m to be used by the SPD process is for a communication session from S to D. Optionally, mobility factor m is one of the TARP&#39;s modes of operation with a default value of 1. 
         [0107]    Finally the process implements function dupDiscardAlg( ) that implements the DD process. The purpose of this function is to assure that if the packet being transmitted returns to the source S, for example the packet is bounced back by the immediate neighbouring node, it is discarded as a duplicate. When function dupDiscardAlg( ) is called by PacketTransmission process, the function only inserts a packet to the DD cache  403 . A call to dupDiscardAlg( ) made by process PacketFwdRcv, that forwards and receives packets, is used to detect whether the received packet is a duplicate. 
         [0108]    The function uses the estimate of the average transmission time Δt avg , stored by every node  100 , and furthermore, at the end of this process, the packet is provided to the Data Link Layer  204 . 
         [0109]    PacketTransmissionResult. 
         [0110]    The PacketTransmissionResult process determines whether a neighbouring node successfully receives a packet originated in the node and passed to the Data Link Layer  204 . The steps for this process are outlined in  FIG. 5B , where the result of this process is provided to the Transport Layer. This process is triggered by control message DLSuccTrans(ID) or DLFailTrans(ID) received from the Data Link Layer  204 , and the ID of a packet comprises the identification of a node executing this process, where the node in execution of this process if the source of the packet. 
         [0111]    This process waits for a control message from the Data Link Layer  204  that concerns packet ID that had been passed there by the Network Layer  203 . It all happens at the source of packet ID. 
         [0112]    First, the current estimate of the average transmission time is fetched from the node&#39;s memory  104 . Then, ID of a packet that the control message concerns is compared with identification ID b  stored in the transmission time register  404 . If the entries match, the transmission moment of the ID packet is calculated by function getTransmissionTime( ) and the contents of the register  404  is cleared since it is no longer needed. 
         [0113]    The purpose of this function is to calculate the time between the moment at which the packet identified by the ID is provided to the Data Link Layer  204  and the moment at which the Network Layer  203  receives DLSuccTrans(ID) from the Data Link Layer  204 . This occurs if ID is stored in the register  404 . 
         [0114]    DLSuccTrans(ID) is the message that triggers this process, which means that the packet has been received by a neighbouring node. The process checks the transmission time Δt t , if its value is positive, this is indicative that ID and ID b  match, and a new estimate of the average transmission time Δt avg  is calculated by a function avgTransmissionTime( ). Regardless of the returned value, the process returns NLSuccTrans(ID) message to the Transport Layer  202  notifying it that the packet was successfully received by a neighbouring node. If the Data Link Layer  204  is unable to send a packet to any neighbouring node, this layer provides message DLFailTrans(ID) to the Network Layer  203 . Regardless of whether entries ID and ID b  match or not, which is checked at the beginning of the process, the process returns the NLFailTrans(ID) message to the Transport Layer  202  notifying it that the packet was not received by any neighbouring nodes. 
         [0115]    If node K ( FIG. 1 ) has n neighbouring nodes, then each of the n neighbouring nodes is capable of receiving messages transmitted by node K. Thus, the Data Link Layer  204  provides n DLSuccTrans messages to the Network Layer  203 . Preferably, only the first DLSuccTrans message triggers Δt avg  calculation. The remaining messages are still provided to the Transport Layer  202 , for which this information may be needed to determine the number of neighbouring nodes. However, those messages no longer trigger Δt avg  calculation because the transmission time register  404  is already cleared. 
         [0116]    Preferably, control message DLFailTrans(ID) is not followed or preceded by any DLSuccTrans(ID) messages. In other words, packet ID is either successfully sent, or no node confirms its reception. The latter case is equivalent to the situation in which the node effectively has no responding neighbouring nodes. 
         [0117]    Preferably successfully transmitted packets are used to measure the average transmission time Δt avg . Preferably this PacketTransmissionResult process is triggered by the reception of Data Link Layer  204  messages, DLSuccTrans(ID) or DLFailTrans(ID), only at the source of the packet they are related to, where corresponding processes at intermediate nodes are different. 
         [0118]    PacketFwvdRcv. 
         [0119]    The PacketFwvdRcv process is for processing data packet P with entries [ID, r, h] by a non-source node K, where this node K receives a data packet from the Data Link Layer  204 , which received the packet from a neighbouring node. The PacketFwvdRcv process is illustrated in  FIG. 5C . 
         [0120]    This process waits for a packet to be provided from the Data Link Layer  204 . A packet that propagates through an intermediate node K executes this process. Node K obtains an estimate of the average transmission time from memory  104  and then calls function dupDiscardAlg( ) If the entry corresponding to the received packet already exists in the DD cache  403 , then node K has already forwarded that packet to a neighbouring node, and the function returns ret_dupentry. 
         [0121]    If the DD cache  403  does not have an entry corresponding to this packet, the function returns ret_newentry. In that case, node K checks the ID of the intended recipient of the packet. If node K is the only destination node of this packet, or one of many, since the packet is broadcast, the packet&#39;s payload is provided to the Transport Layer  202 . Thus, the packet is received. 
         [0122]    If node K is the only destination node of the packet, the process extracts a number of hops h that a packet has traveled and the mobility factor m used for communication session between nodes S and D. These two values, used by the SPD process are stored in the SPD source cache  402  as  h  and  m . These values are then provided back to source S in the traffic from nodes D to S, assuming that node D transmits packets to node S. Of course, this occurs if node K is the sole recipient of a packet. If a packet is broadcast, therefore the SPD source cache  402  is not used because the address of the destination is D=0, and there is no traffic flowing in the reverse direction from other nodes to S, and if node K is the only destination node, the packet is removed from the AHN. 
         [0123]    If node K is not an intended recipient of a packet, the process increments the hop counter and checks if the packet had not circulated in the AHN for too long. If the packet does circulate for too long, then it is discarded. 
         [0124]    Otherwise, the process calls function subPathDiscardAlg( ) where this function implements the SPD process. The purpose of the SPD process is to further decrease the number of duplicate packets in the AHN. Depending on the outcome of this process, the packet is either discarded or further processed by node K. In the latter case, K relays the packet to its neighbouring nodes. 
         [0125]    PacketFwdRcvResult. 
         [0126]    The PacketFwdRcvResult process is used to determine whether a packet propagating through the node executing this process has successfully been rebroadcast to a neighbouring node, as illustrated in  FIG. 5D . The information about the outcome of the transmission is used to calculate the average transmission time. This process is triggered by control messages DLSuccTrans(ID) or DLFailTrans(ID) as received from the Data Link Layer  204 . Furthermore, this process is triggered by the ID of the packet not comprising the identification of a node executing this process, which implies that the node executing this process is not the source of the packet. 
         [0127]    This process waits for a message from the Data Link Layer  204  directed to the packet ID. 
         [0128]    The process is very similar to the process used in the PacketTransmissionResult process. The difference is that PacketFwdRcvResult process does not return any messages to the Transport Layer  202 . If the intermediate node cannot forward a packet to further nodes because, for example all neighbouring nodes are gone or a packet has traveled too many hops, the Network Layer  203  does not respond. A response is dependent upon the Transport Layer  202  for overseeing lost packets. The fact that intermediate node K is unable to forward the packet to another node does not imply that the packet will not reach its destination, other nodes may be able to forward the packet to a destination node. 
         [0129]    CacheTimer. 
         [0130]    The CacheTimer process, as illustrated in  FIG. 5   e , controls entries stored in the DD cache, SPD cache and SPD source cache, where this process is triggered by a time-out of entry [ID, t r ] in the DD cache that occurs when the current time is equal to t r . During the time of ΔT r , since the insertion or refresh of an entry distinguished by ID, no packet with that entry has propagated through the node in execution of this process. 
         [0131]    This process executes asynchronously at every node, keeping track of entries stored in the DD cache  403 , SPD cache  401  and SPD source cache  402 . As soon as the time field in any DD cache  403  entry is equal to the current time, which indicates that the particular entry has expired, the process removes the entry from the DD cache  403 . If this is the last entry concerning the communication session from nodes S to D, and from nodes D to S, and the node executing the process is the source node S, the process removes the corresponding entry from the SPD source cache  402 . Preferably, source node does not store any information that concerns a communication session that most likely has already finished. 
         [0132]    However, deleting an entry with identifications S and D from the SPD cache  401  requires that the DD cache  403  stores no entry with S and D, or D and S, as the identifications of source and destination nodes. An entry in the SPD cache  401  stores information related to packets propagating from nodes S to D and from nodes D to S. As long as at least one entry for this pair of nodes is stored in the DD cache  403 , which indicates that a communication session between the two nodes is still active, the corresponding entry is preferably not deleted from the SPD cache  401 , since this entry may be still useful for controlling packet traffic. In the above reasoning, it is assumed that expiry of entries in DD cache  403  means that the communication session is closed, however this does not need to be the case. 
         [0133]    If there is a temporary gap in a communication session between two nodes, then removing the entry from SPD cache  401  is premature. The expiry of entries in the DD cache  403  does not imply that the communication session is closed. 
         [0134]    Preferably a separate timer is introduced for entries in SPD cache  401 . This timer depends not only on the packet traffic in the AHN, but on the mobility m of nodes as well. The disadvantage of this approach is that it involves a higher complexity and thus larger memory requirements for the SPD cache  401 . 
         [0135]    Initially, to simplify the implementation, preferably no timers associated with the DD cache  403  are used to trigger discards from the SPD cache  401 . In using this solution entries in the SPD cache  401  are stored as long as there is a memory space for them. A new entry for storage into an already full SPD cache  401 , preferably results in a discard of the oldest entry from the cache  401 . 
         [0136]    Functions. 
         [0137]    Processes described above invoke the following functions: dupDiscardAlg, getTransmissionTime, subPathDiscardAlg, deterministicDiscard, probabilisticDiscard, and avgTransmissionTime, as illustrated in  FIG. 6 . These functions implement processes that limit the number of duplicate packets in the AHN, and perform other auxiliary operations. 
         [0138]    dupDiscardAlg(ID, r, h, Δt avg ) 
         [0139]    The purpose of this function is to determine if the node that executes this function has already received the packet with the given entry, as illustrated in  FIG. 6A . If not, the given entry is inserted into the DD cache  403 , otherwise the entry in the DD cache  403  is refreshed. Parameters that are provided to this function are the ID of a packet, maximum number of hops, current number of hops, and the average transmission time from this node. The function returns ret_dupentry, if the entry already exists, or ret_newentry if otherwise. 
         [0140]    This function processes entries in the DD cache  403 . First, it calculates time Δt r  at which the entry determined from the given packet is to expire, where the packet&#39;s fields r, and h are used for this purpose. The average transmission time Δt avg  is calculated in PacketFwdRcv or PacketTransmission Processes. 
         [0141]    If the DD cache  403  already has stored therein the entry with ID, this means that the node executing this function has already processed the packet. In that case, the entry in the DD cache  403  is refreshed. In refreshing this entry, the old time is updated with the new calculated time. This is likely to provide a more accurate estimate of the time for which the entry is stored in the cache  403 . The function returns ret_dupentry, which informs the calling process that ID is a duplicate. 
         [0142]    If the ID does not have a corresponding entry stored in the DD cache  403 , a new entry is created and stored in the cache  403 . First, however, the function checks whether there is enough memory in the cache  403  for storing of this new entry. If there is no space, the oldest entry that corresponds to the communication session belonging to ID is deleted. In other words, the deleted entry is the one that describes a packet sent by nodes S to D, belonging to communication session s, such that the timestamp t r  is minimum. 
         [0143]    If ID is the first packet belonging to its communication session, then the globally oldest entry is deleted. 
         [0144]    Finally, the function returns ret_newentr, which informs the calling process that ID is a new packet. 
         [0145]    getTransmissionTime(ID, Δt avg ). 
         [0146]    This function calculates the time between the moment at which a packet ID is stored in the transmission time register and the current time, as illustrated in  FIG. 6B . Parameters that are provided to this function are the ID of a packet and the current estimate of the average transmission time Δt avg , where this function returns calculated time, or 0, if there is no entry corresponding to the ID in the transmission time register. 
         [0147]    This function first checks if the ID passed as an argument matches the identification stored in the transmission time register  404 . If it does not, calculation of the transmission time Δt t  taken for the Data Link Layer  204  to send that packet is not possible, thus the function returns a 0. 
         [0148]    If the identification stored in the transmission time register  404  matches that of the packet, then the transmission time Δt t  is calculated. This time is calculated as the time that has elapsed since the storing of ID in the transmission time register  404 . This is followed by the calculation of a new estimate of Δt b , which is the maximum time for which the entry is stored in the register. This entry is then set to twice that of Δt avg , and the value is updated by function avgTransmissionTime( ). This preferably assures that the transmission time register  404  entry is not deleted too early. Finally, the transmission time is returned. 
         [0149]    subPathDiscardAlg(S, D, h,  h ,  m ). 
         [0150]    The purpose of this function is to use the SPD process to limit the number of duplicate packets flowing from source node S to destination node D, as illustrated in  FIG. 6   c . Parameters that are provided to this function are the source node S of a packet, its destination node D, number of hops h it has traveled so far (i.e. h sk ), number of hops  h  that the last packet from nodes D to S has traveled, and mobility factor  m , to be used by the SPD process for a communication session from nodes D to S. The function returns ret_discard if the packet for which this function was called is to be discarded, or ret_keep, if the packet is to be kept. 
         [0151]    This function implements Sub-optimal Path Discard (SPD) process whose purpose is to limit the number of packets in the AHN that propagate along sub-optimal paths. Every node has stored therein a SPD cache  401 , the entries of which store the following fields: [S, D, h sk , C ds , h dk , C sd ]. A single entry will be used by two sessions: the one from S to D, and the one from D to S. Fields h sk  and C ds  are used by a S-&gt;D communication session, while fields h dk  and C sd  are used by a D-S communication session. 
         [0152]      FIG. 7  illustrates three nodes, S, D, and K. Node K is disposed between nodes S and D. The intermediate node K receives a packet sent by source node S and is addressed to node D, node K checks whether the SPD cache  401  has stored therein an entry corresponding to a communication session, in either direction, between nodes S and D. If the entry exists, the number of hops h sk  that the packet has made so far is stored in that entry, thus overwriting the old value. If the entry does not exist, which means that is the first packet belonging to an S-D communication session, the process creates a new entry with S, D, and h sk  set to h, which is the number of hops that a packet has made so far. Remaining fields that are other than S and D, are set to zero. 
         [0153]    The process extracts h dk  from the SPD cache  401 . The positive value of h dk  keeps the number of hops between D and K made by a packet propagating from D to S. This entry was previously created in the SPD cache  401  when a packet from D to S propagated through node K at a prior time. If h dk =0, then this entry has just created in the SPD cache  401 . 
         [0154]    If h dk  is positive, the process calculates the new value for this counter. This calculation starts with an evaluation of two inequalities. In the first, it just checks the value of  h , which is the number of hops taken for the last packet to propagate from D to get to S. This value is inserted into the packet by process PacketFwdRcv and is propagated in the packet sent by nodes S to D. 
         [0155]    Furthermore, if this value is positive, the process evaluates another inequality: 
         [0000]          h   &lt;( h   sk   +h   dk ) 
         [0156]    where this inequality checks whether the path  h  of the last packet from D to S, received by S, is shorter than the sum of two paths. These paths are: the current path from nodes S to K made by the packet that is currently being sent, and the old path from D to K made by the last packet sent from nodes D to S, as illustrated in  FIG. 7 . 
         [0157]    A source of a packet is not always aware of a value for  h , that is, the length of the path made by the last packet received from the destination. This occurs, for example, when a source node sends a very first packet in a communication session. In such a case, the source sets set  h  to 0. An intermediate node calculating a discard counter detects this value for  h , and also set it also to 0. This will effectively disable an SPD process, where the SPD process activates as soon as the source receives the first reply from a destination. 
         [0158]      FIG. 8  illustrates nodes S and D, having a first path that involves propagation intermediate nodes K, L and M, and a second path that involves propagation through a single intermediated node Z. 
         [0159]    If this aforementioned inequality is met, then it typically implies that packets from node D are reacheable by node S via path shorter than the one propagating through node K. A packet from S to D preferably triggers the above calculation that is further utilized by packet traffic propagating in the opposite direction from nodes D to S. 
         [0160]    If the inequality holds the topology of the AHN preferably remains such that node K is not on the shortest path from D to S. This means that node K preferably discards packets sent by D to S, since other nodes located on the shortest path—second path—from D to S relay those packets faster. 
         [0161]    An amount of packets for propagating between nodes D and S that are to be discarded depends on the value of discard counter C ds . The counter is set to the new value if the above condition holds, where this value is calculated after h sk  is updated from the packet header by the following: 
         [0000]        C   ds   =  m *└(   h   sk   +h   dk )−   h     — 
 
         [0162]    where  m ≧0 is a mobility factor carried by the packet. 
         [0163]    Note that according to the process C ds  is set to zero if  h =0. Assuming that  h  is positive and  m =1, C ds  represents a difference in hops between an estimated length of a path that a packet travels between nodes S and D, and the length of the path traveled by the last packet from D to S, which was at the time the shortest path between D to S. 
         [0164]    Node K starts discarding packets sent by D to S while at the same time decrementing C ds . As soon as C ds  becomes 0, node D resumes forwarding of packets that are addressed to node S. Details of this process are implemented in functions deterministicDiscard( ) and probabilisticDiscard( ). 
         [0165]    If a packet from node S to D triggers a call to function subPathDiscardAlg( ) like in the case discussed in this section, discard counter C sd  is provided to the discard functions. In this case h dk  is updated from the packet header by the following: 
         [0000]        C   ds   =m *└( h   sk   +h   dk )−    h     — 
 
         [0166]    where m≧0 is a mobility factor carried by the packet. The discard functions decide whether the packet from S to D, for which this function is called, is to be discarded or forwarded. 
         [0167]    Note that if subPathDiscardAlg( ) is called with D and S as its arguments, triggered by a packet traveling in the opposite direction from D to S, C ds  is provided to these functions, not C sd . In such a case, the SPD process calculates a new value of C sd  used by a communication session from S to D and then determines whether the packet from D to S should be discarded. 
         [0168]    In the meantime, another packet sent by S to D is optionally received by K, and yields C ds &gt;0. This will mean that packets sent from nodes S to D are still following paths shorter than the one via node K. In such a case, according to the process, the old value of C sd  is overwritten by the new value. 
         [0169]    The discard functions for a packet traffic flowing from S to D are called if the relevant discount counter C sd &gt;0, and the discount counter C ds , before the process calculates its new value, is positive. 
         [0170]    At some point the value of a discount counter may drop to 0. When that occurs, node K is not only used to relay the packet, but also change the estimate of the shortest path  h  to the length of the path from nodes S to D via node K. This is very important in handling a situation in which the AHN topology change to a deletion of the shortest path. If  h  is not altered, nodes downstream are not be aware of the topology change and keep deleting the packets. 
         [0171]    A packet traveling from nodes S to D triggers a calculation of a discard counter later used by the process to determine the fate of a packet traveling from D to S. In other words, traffic from S to D determines the behavior of the SPD process for packets flowing in the opposite direction, from D to S. 
         [0172]    A period for which a node discards packets depends on the estimated difference between another path and the shortest path. At any time, topology of the AHN changes and the shortest path is no longer there. If the path difference is large, there is a good chance that other nodes “closer” to the shortest path will pick up the transmission. This potentially results in node K no longer forwarding packets from nodes D to S for a relatively long time. 
         [0173]    If this difference is small, node K has less latitude, since any change of topology may place K on the shortest path between S and D. The SPD process preferably functions in the bi-directional packet traffic scenarios. If all the source node does is broadcasts packets, with destination nodes that are acting as passive receivers, this process preferably remains inactive. For example, when node S transmits packets to D and there is no traffic flowing in the opposite direction from D to S, preferably C sd , as well as C ds , remain with zero values and the process relays all packets from S to D. 
         [0174]    If C sd  and C ds  are both positive then it means that most likely the path through node K is not the shortest between nodes S and D and the packet is discarded either deterministically using deterministicDiscard( ) or probabilistically using proabilisticDiscard( ). Considering only use of the deterministicDiscard( ) process for now a packet travelling from S to D is discarded, counter C sd  is decremented. If a packet travelling from D to S is discarded, C ds  is decremented. If either of the counters are zero then the packet is forwarded. 
         [0175]    Accordingly the impact of the mobility factor  m , discussed below, becomes apparent. If  m =0 then the SPD process is disabled. With  m  increasing each of the C sd  and C ds  counters increase and more packets are discarded. In other words, SPD avoids suboptimal paths more aggressively. Conversely, if  m  is small, the counters C sd  and C ds  decrease to zero faster, thereby allowing packets to utilize suboptimal paths. This for example being beneficial for example where the physical mobility of the nodes within the AHN is higher. 
         [0176]    Mobility Factors  m  and m 
         [0177]    The mobility factors  m  and m are used in the aforementioned formulas since they have a relation to the mobility of packets in the directions from S to D and D to S respectively. In cases of high packet mobility,  m  and m are preferably set to 0, thus effectively turning off SPD process. In the case when this process is disabled, TARP relies on a simple Duplicate Discard process implemented in function dupDiscardAlg( ). 
         [0178]    Mobility factors  m  and m are used to determine how many duplicate packets a node is to discard. With increasing  m  and m, the number of packets also increases, making the protocol less reactive to AHN topology changes. This suggests that when the AHN is very mobile, or when a successful packet delivery between a source node and a destination node is preferable, then  m  and m should be set to small values, with the minimum of 0. 
         [0179]    The mobility factor is set dynamically by the TARP, where its value is dependent upon a packet loss as perceived by the application  201 . If the packet loss becomes high at any time, the application  201  dynamically sets m, and thereby  m , to 0, thus forcing the protocol to forward more packets. 
         [0180]    The mobility factor is set by node S, and propagated as m in the packet from S to D, and is later returned, as  m , and propagated in the packet from D to S. Traffic from S to D determines behaviours of a process for packets traveling from D to S. If node S is to affect the process, its value is preferably propagated in the packet in the reverse traffic to node S. 
         [0181]    In this manner, source S is able to control the operation of the SPD process that limits the number of packets that are on the sub-optimal path. If the process is aware that the mobility of the AHN is low, the process optionally sets m to a higher value, for example that of 2 or 4. If, on the other hand, the source node detects a large number of dropped packets in the AHN, or it is aware that the AHN topology changes are likely to be frequent, m is preferably set to 0, effectively disabling the SPD process, and forcing the intermediate nodes to pass all packets from S to D. This is of course subject to constraints implemented by the DD process described hereinbelow. 
         [0182]    As aforementioned,  FIG. 8  illustrates a simple AHN topology for the following example. There are two paths between S and D: the shortest 2-hop path occurs via node Z and a longer 4-hop path occurs via nodes K, L, and M. Assuming the mobility factor m=1 and that both S and D transmit packets to each other. 
         [0183]    Inspecting the contents of SPD cache  401  entries at nodes K, L, and M, and SPD source cache  402  entries at nodes S and D, as well as relevant packet fields  h  and  m  at several stages of the communication, the following result: 
         [0184]    SPD source cache  402  at a source node of the packet are set by process PacketTransmission 
         [0185]    SPD source cache  402  at a destination node of the packet are set by process PacketFwdRcv 
         [0186]    SPD cache  401  at an intermediate—transit—node of the packet are set by function subPathDiscardAlg and called by process PacketFwdRcv. 
         [0187]      FIG. 9A  illustrates a table showing SPD source cache  402  entries for nodes D and S for a packet p 1  sent by D to S and arriving at node S. SPD source cache  402  at node D has not yet received any packet from S, so initially the path  h  from D to S and the mobility factor  m  are set to 0. The SPD source cache  402  at node S has received the packet from D. Assuming that the packet traveling the shortest path via Z arrived and first, the length of the path is 2, since S has learned the mobility factor in node D&#39;s application is 1. 
         [0188]      FIG. 9B  illustrates the SPD cache  401  entries at nodes K, L, and M. The packet traveling from D to S carries values of path and mobility factor  h =  m =0. The packet has made 1 hop to M (h dm =1), 2 hops to L (h dl =1), 3 hops to K (h dk =3). Since no packet from S to D has been sent yet, the remaining fields of the new entries in the SPD cache  401  entries at three nodes are set to 0. The packet is not dropped because C ds  is 0. 
         [0189]      FIG. 9C  illustrates a reverse of that shown in  FIG. 9A , where a packet p 2  of a reverse communication session from S to D arrives at node D, where this operation is potentially node S′ reply to the receipt of packet p 1 . Thus, the SPD source cache  402  at node D has received the packet from S. Assuming that the packet traveling the shortest path via Z arrived first, the length of the path is 2. D has learned that the mobility factor in the node S′ application is 1. The SPD source cache  402  at node S has the value for the mobility factor and the length of the shortest path  h  from D to S set upon reception of packet p 1 . 
         [0190]      FIG. 9D  illustrates the SPD cache  401  entries at nodes K, L, and M, where the packet traveling from nodes S to D carries values of path  h =2 and mobility factor  m =1. The packet has made 1 hop to K (h sk =1), 2 hops to L (h sl =2), and 3 hops to M (h sm =3). The packet carries positive values of  h  and  m , and both conditions, as required by the SPD process for a calculation of the discard counter C ds , are fulfilled. This calculation sets C dk  to 2 at all intermediate nodes. This value corresponds to the difference—in hops—between the length of the S to D path via nodes K, L, and M, and the shortest path via node Z. Since C sd  is still 0, packet p 2  traveling from S to D via node K is not dropped until it gets to node D. The Duplicate Discard (DD) process preferably drops packet p 2  at node D. 
         [0191]      FIG. 9E  illustrates SPD cache  401  entries at nodes K, L, and M, where a packet p 3  is sent by nodes D to S for arrival at node S, which in turn is potentially seen as D&#39;s reply to p 2 . The entries at SPD source cache  402  at nodes S and D remain unchanged. The packet traveling from D to S carries values of path  h =2 and mobility factor  m =1. The packet has made 1 hop to M (h dm =1), 2 hops to L (h dl =2), 3 hops to K (h dk =3). Packet p 3  carries positive values of  h  and  m , and both conditions, according to the SPD process required for a calculation of the discard counter C sd , are fulfilled. This calculation sets C sd  to 2 at all intermediate nodes. 
         [0192]    According to the SPD process, the value of C sd  upon arrival of the packet and value C ds  are preferably positive in order for a node to call a discard function to discard a packet traveling from D to S. Although C ds  is positive, the value of C sd  upon the arrival of packet p 3  at intermediate node is 0. That is why the packet is preferably not discarded but relayed further. 
         [0193]    Assume that C sd &gt;0 is sufficient for a node to call a discard function and to possibly drop a packet traveling from D to S. This packet is preferably not dropped immediately by the first neighbouring node of node D, that is, node M, and remaining intermediate nodes K, and L do not see that packet. Thus, preferably node M sets C sd  to a positive value, and the other two nodes, unaware of the traffic from D to S, keep C sd  set to 0. Recall that C sd  is used to discard duplicate packets flowing from S to D. If now node S sends a packet to D, nodes K and L relay that packet because their C sd  values are 0. The duplicate packet is thus discarded by node M, that is, the neighbouring node of the packet&#39;s destination. 
         [0194]    Of course, this approach would waste AHN resources. A packet would be relayed unnecessarily through the AHN, along almost an entire path, only to be dropped by the destination&#39;s neighbouring node. 
         [0195]    If the SPD process requires both values of discard counters to be positive, all intermediate nodes relay packet p 3  from D to S, thus setting a value of the discard counter for the traffic flowing from S to D. Now, duplicate packets sent by S are discarded by node K, which is node S′ neighbouring node, rather than node M. 
         [0196]      FIG. 9F  illustrates the SPD cache  401  at nodes K, L, and M, where a packet p 4  of a reverse communication session from nods S to D arrives to node D, where this is potentially node S′ reply to packet p 3 . The SPD source cache entries at nodes S and D, remain unchanged. The packet traveling from S to D carries values of path  h =2 and mobility factor  m =1, therein. It has made 1 hop to K (h sk =1). This time, Cs d  is calculated when packet p 3  passes through K from D to S, and is positive. Depending on the discard process used, packet p 4  is discarded as a duplicate either with probability  1 , if function deterministicDiscard( ) is used, or a positive probability less than 1, when function probabilisticDiscard( ) is used. In any case, C sd  is decremented to 1. 
         [0197]      FIG. 9G  illustrates the SPD cache  401  at nodes K, L, and M, where a packet p 5  sent by node D to node S arrives at S, where this is potentially node S′ reply to packet p 4 . The entries in the SPD source cache at nodes S and D remain unchanged. If packet p 4  sent from S to D is discarded at K, a copy thereof arrived at node D following the shortest path via node Z. Thereafter, node D replies with packet p 5 , and this packet finds a positive value of a discount counter C dk . A discard function is called and potentially packet p 5  is discarded and C ds  is decremented. As before, the packet carries values for path  h =2 and mobility factor  m =1. 
         [0198]      FIG. 9H  illustrates the SPD cache  401  at nodes K, L, and M, where after transmission of packet p 6  from S to D, packet p 7  from D to S, and packet p 8  of a reverse communication session from S to D. The SPD source cache  402  entries at nodes S and D remain unchanged. Packets p 6  and p 7  have their discard counters both set to 0, which means that packet p 8  finds C sd =0 at node K. According to the SPD process, a value of  h  in the packet is set to 4, that is, the length of the path between S and D via node K with mobility factor  m  still being 1. The packet is relayed and the value of  h  propagates to nodes L and M. Each of these nodes relays packet p 8  because the new, high value of  h  is such that the inequality deciding whether the packet should be discarded or not does not hold. 
         [0199]    Packet p 8  is discarded by the destination D. It is discarded because its copy has arrived first following the shortest path via Z. A couple of packet exchanges between D and S reset the discard counters back to positive values because the values of  h , stored by S and D, still correspond to the length of the shortest path, which is 2. 
         [0200]    This mechanism, in some sense, reinitiates the SPD process after the discard counters drop to 0. This is preferable for the AHN to detect a new shortest path. After  h  in the SPD source caches  402  at nodes S and D is set to 2, node Z turns off. Thus, the shortest path via node Z is gone. Nodes K, L, and M on the other path will not detect this removal of node Z immediately. Thus, nodes K and M discard packets flowing from S to D, and from D to S, respectively, until the discard counters drop to 0. This allows the packets to be relayed over that path and updates the value of  h  from 2 to 4 at both nodes S and D. This value, carried later in subsequent packets, allows the SPD process to detect the new shortest path—the one that leads through nodes K, L, and M. Without this mechanism, the SPD process potentially consumes more time in order to learn about the AHN topology change and about a new shortest path. After some time, packets are relayed by M and K only to be dropped by node L. Packets finally reach their destinations after the discard counter at node L has dropped to 0. 
         [0201]    deterministicDiscard(C sd ). 
         [0202]    The purpose of this function is, on the basis of the discard counter stored in the SPD cache, to decide deterministically whether a packet is to be discarded, as shown in  FIG. 6D . The discard counter C sd  is provided to the function and the function returns ret_discard if the packet for which this function was called is to be discarded, or the function returns ret_keep, otherwise. 
         [0203]    The mobility of nodes in the AHN, and the fact that any node can be turned-off at any time, means that at some point, node K resumes relaying packets from S to D. Otherwise, if the shortest path is gone, node D stops receiving any packets from S. Thus, function implements a deterministic approach to this problem. 
         [0204]    If discard counter C sd  is positive, it is decremented and the packet is discarded. Otherwise, if C sd  is zero, the packet is forwarded. Unless a new packet from D to S changes the value of C sd , the node executing this process drops C sd  packets. Then, it resumes their forwarding. 
         [0205]    probabilisticDiscard(C sd , C sd   init ) 
         [0206]    The purpose of this function, on the basis of the discard counter stored in the SPD cache, is to decide probabilistically whether a packet is to be discarded or not as illustrated in  FIG. 6E . Two arguments are provided to the function, namely discard counters C sd  and C sd   init . The function returns ret_discard if the packet for which this function was called is to be discarded, or ret_keep, otherwise. 
         [0207]    This function is used for controlling the time for which a node is to initiate a discarding of packets. C sd   init  is used to store an initial value of C sd  calculated by the node for a communication session from S to D, and C sd   init  for communication session in the opposite direction. Thus, when node K creates a new entry for source S and destination D, or updates an old entry with the  h  information extracted from the packet traveling from D to S, both C sd  and C sd   init  are set to the same value. 
         [0208]    The probabilistic method checks if the discard counter C sd  at node K is snit positive. If the counter is positive, the method decrements it, leaving C sd  intact. However, a decision as to whether that packet is to be relayed or dropped is now based on a random decision. More precisely, the packet is relayed to another node with the following probability: 
         [0000]    
       
      
       P 
       disc 
       =C 
       sd 
       /C 
       sd 
       init  
      
     
         [0209]    According to this formula, every consecutive packet sent by S to D has a greater probability of being dropped than its predecessor. This means that as time goes by, and no packet from D to S has been observed for resetting the values of C sd  and C sd   init , it is more likely that the AHN topology has changed, thus placing node K on the shortest path from S to D. In such a case, it is potentially preferably to forward the packet with some probability. 
         [0210]    avgTransmissionTime(Δt t ). 
         [0211]    The purpose of this function is to calculate the average transmission time at the node that calls this function for execution. The function steps are illustrated in  FIG. 6F . Arguments that are provided to the function are the last recorded transmission time, where the function returns the new estimate of average transmission time Δt avg . 
         [0212]    The formula used for the calculation gradually decreases the importance of past samples and increases the importance of the recent ones. A bigger C avg  puts more emphasis on the history, while a smaller C avg  favors recent measurements. Typical acceptable values are between 0.5 and 0.8. The value of C avg  is one of the protocol&#39;s parameters that is controlled by the application  201  through a mode of operation. 
         [0213]    Timeout of DD Cache Entries. 
         [0214]    This method is implemented in order to calculate a time ΔT r  after which the DD cache  403  timer for a given entry in the cache is to expire. The following parameters are used within this method, where r is the maximum range of a packet expressed in hops. A packet is removed from the AHN when it makes r hops and does not reach the destination. Another parameter h is the number of hops a packet has traveled so far, and ΔT avg  is the average time for a node to successfully transmit a packet to an existing neighbouring node avgTransmissionTime( ) where this includes the time for possible retransmissions on lower Network Layers  203 . 
         [0215]    Every time a packet arrives to node K, that node checks whether the entry corresponding to this packet exists in the DD cache  403  using the dupDiscardAlg( ) process. If the entry does not exist, the new entry corresponding to this packet is created and stored in the cache. The time ΔT r  after which that entry is discarded is approximated by the following formula: 
         [0000]        T   r   =F ( p )*Δ t   avg  
 
         [0000]      where 
         [0000]    
       
      
       p=r−h,  
      
     
         [0216]    is the number of hops that a packet travels before it arrives to the destination, or if the destination cannot be found, before it is discarded. A function F is defined in such a way that: 
         [0000]      F(p)ε[0, p−1]
 
         [0217]    Function F assumes that a maximum value of p−1 is the maximum allowed number of hops that a packet is left with and is decreased by 1. If p−1 is multiplied by ΔT avg , it provides a latest time at which the packet returns to the node, assuming that every node has a similar transmission time. Such a returned packet is discarded as a duplicate packet. 
         [0218]    Assuming that F[p]=0, the minimum value, the entry corresponding to the passing packet is not stored in the DD cache  403 . Such a protocol in fact corresponds to a simple flooding controlled only by the time to live field r for the packet. 
         [0219]      FIG. 10  illustrates an example where setting F(p) to its maximum value of p−1 is potentially beneficial, as outlined hereinbelow. As is shown in  FIG. 10 , all by p−1 nodes form a loop. Node K forwards the packet that has p=5 hops to live. From this figure it is evident that if node K uses F(p)&lt;(p−1)Δt r , the relevant entry is discarded too early. In that case, when the packet gets to node K, after making a full loop, it is forwarded further, which unfortunately wastes AHN bandwidth. In this example it is assumed that node C cannot receive the transmission from K because when that transmission was taking place, node C was too far from node K. On the other hand, if K uses F(p)=p−1, it never forwards a duplicate but instead will reserve more memory for the DD cache  403 . 
         [0220]    If B or C are in reception range for receiving the transmission from K, then using F(p)&lt;(p−1) potentially leads to premature deleting of the relevant entry from the DD cache. Thus, function F potentially depends on its argument p in yet another way. With a large p, the chance that all p nodes form a loop, thus making it more likely for a node to see a packet&#39;s duplicate, becomes less probable. On the other hand, if there are just a few nodes, hence a small p, the chance that these nodes form a loop becomes higher. This suggests that when p is small, F(p) should be closer to p−1, than when p is large. 
         [0221]    Taking this into consideration, on the average, approximating F(p) by 0.75*(p−1) provides the right compromise between the bandwidth and memory usage. Simulations of some typical scenarios likely show what value of F(F(p)) gives the best results, and how the number of hops that a packet is left with affects the optimal value of F(p). Δt avg  is measured, stored and updated by every node. In this manner, every node uses its own estimate of Δt x.    
         [0222]    Of course, it is not necessarily true that every node has the same transmission time, and that is why Δt x  is only a rough estimate. Preferably, the entries in the DD cache at the source of a packet are likely kept longest. This occurs because at the source, h=0, and Δt x  assumes the maximum value. 
         [0223]    TARP Parameters and their Initial Values. 
         [0224]    TARP has only five parameters, whose initial values are initially set, where the first two are later maintained by the protocol itself in order to keep their values optimal. The last three are included in protocol modes of operation and are controlled by the application  201  designer or, dynamically, by the application  201  itself. 
         [0225]    The first value is the average time Δt avg  between the moment a packet is passed to the Data Link Layer  204  and the moment at which Data Link Layer  204  notifies the Network Layer  203  if the packet is successfully received by a first neighbouring node. This time is used in calculation of time ΔT r  for which an entry is stored in the DD cache  403 . Assuming knowledge of the maximum packet length L and AHN&#39;s capacity C, Δt avg  is initially approximated by c*(L/C), where c&gt;1. The protocol adjusts Δt avg  to the value closer to the actual average time Δt avg , using the PacketTransmission process and avgTransmissionTime( ) function. Having Δt avg =0, will not cause a failure of the TARP. 
         [0226]    However, setting Δt avg =0, results in a premature expiry of the first few entries in the DD cache that leads to more copies of the packets they correspond to circulating in the AHN. Advantageously, the TARP converge to a correct value of Δt avg . 
         [0227]    The second value is the maximum time Δt b  for which an entry is to be stored in the transmission time register. It is assumed that the initial value of Δt avg  is positive, Δt b =c*Δt avg , where c&gt;1 and Δt b&gt;&gt; 0, otherwise calculating of a good estimate for Δt avg  is more difficult. This operation is performed using the PacketTransmission process. 
         [0228]    The third parameter C avg  is used in calculation of the average transmission time Δt avg . 
         [0229]    The value of C avg  emphasizes either the past or recent measurements of Δt avg . According to the formula used to calculate Δt avg , a node will react slower to changes of the actual transmission time if C avg  is too large. Depending upon the environment in which the TARP operates, different values of C avg  are potentially optimal. This parameter is potentially controlled by the application through some mode of operation. Preferable values for C avg  range between 0.5 and 0.8, thus for example C avg  is initially set to 0.65. 
         [0230]    The fourth parameter is ΔT r , where the function F used to determined an approximate timeout ΔT r  for use in determining when an entry is to be removed from the DD cache  403 . Using an aforementioned equation: F(p)=0.75*(p−1) seems to be a right approximation if the amount of memory used within each of the nodes is limited. Otherwise, F(p)=p−1 is safest measure as it assures that minimal bandwidth will be wasted in the AHN. Optionally, this parameter is controlled by the application  201  through a mode of operation. 
         [0231]    A fifth parameter is the mobility factor  m , where the mobility factor is used to calculate the value of discount counter used by the SPD process that is further used in function subPathDiscardAlg( ). The default value of  m =1 seems to be a safest discount value with this value closely approximating a difference—in hops—between the current path for packet propagation and the shortest path for packet propagation. Optionally, similar to parameter C avg  and function F, the mobility factor is controlled by application  201  through a mode of operation. 
         [0232]    TARP Properties. 
         [0233]    The TARP advantageously allows for further simplification for AHN applications that are used in an undemanding environment. For example, such an environment is a small collection of nodes that are involved in a low-bandwidth communication. 
         [0234]    An argument provided to the TARP is used to determine the level of the complexity desired by the application  201 . In the simplest case, the flooding on which the TARP is based is controlled only by time to live r for a packet. Thus, there is little need for a DD cache  403  or transmission time register  404 . Every node forwards packets addressed to other nodes and receives and removes from the AHN packets addressed to it. Furthermore, packets that circulate in the AHN too long, based on r and h, are also removed. Achieving of simple flooding is accomplished by setting function F (p)=0 and  m =0. 
         [0235]    If a simple method of flood control is needed, then F(p)&gt;0 and  m =0 is utilized. This activates the first method that controls the number of packet duplicates traveling in the AHN, but disables the second method that limits the number of packets on sub-optimal paths. 
         [0236]    If the bandwidth of the AHN is very scarce, both the DD process and the SPD process are used by setting F(p)&gt;0 and  m &gt;0. In addition to these parameters, a value of parameter C avg  used in calculation of the average transmission time Δt avg , where Δt avg  is optionally varied depending on the predicted or perceived mobility of the AHN. 
         [0237]    Environment of an ad-hoc application, and resulting requirements imposed on the TARP, might be represented as a single “complexity level” parameter. This parameter optionally assumes different values for different combinations of the above three modes of operations. This way, a designer of an ad-hoc application  201  tailors TARP to the needs of the application and its environment. 
         [0238]    Advantageously, the TARP is simple over those protocols envisaged in the prior art. The advantages are realized because no routing tables are utilized, no sophisticated methods are employed for maintaining of a route within the AHN once the route is established, and flexibility in reacting to AHN topology changes. Furthermore, control messages exchanged between nodes are very limited, and there are five protocol parameters used for controlling of the AHN. 
         [0239]    Replication of a packet at many nodes assures that the packet will get through to a destination node, assuming of course that destination node is not in a disjoint part of the AHN. Advantageously, by discarding duplicate packets through the implementation of the DD process, uncontrolled replication of packets that would quickly occupy most of the AHN&#39;s bandwidth, is advantageously reduced. A number of duplicate packets is further limited by the SPD process, which discards packets traveling on sub-optimal paths. 
         [0240]    Since the TARP uses controlled flooding, broadcasting is facilitated. Furthermore, duplicate packets do not occupy as large portion of the AHNs bandwidth as do control messages, used in more complex protocols, which are used to assure that packets follow optimal paths. These control messages not only increase the complexity but also involve a significant overhead in terms of wasted bandwidth. 
         [0241]    Furthermore, the TARP complexity is further reduced, and its performance improved as a result, because at the Network Layer  203  there are no acknowledgement messages, or any other communication between the destination and the source. The TARP advantageously forwards packets to destinations. 
         [0242]    If an application needs a reliable transfer of data, higher levels of the TARP are optionally responsible for handling acknowledgements and retransmissions. This way, if an application does not need a reliable transfer of data, thus for example a packet is broadcast to make another node aware of its existence, the TARP does not waste any bandwidth on acknowledgements. 
         [0243]    Finally, the TARP modes of operation provide an easy method of adjusting to different requirements imposed on the AHN. 
         [0244]    Numerous other embodiments may be envisaged without departing from the spirit or scope of the invention.