A mesh network communication protocol for communicating between a plurality of respective mesh network nodes, the protocol using a gradient state, which indicates a number of hops to a destination via each of its neighbors, the protocol comprising: receiving a data packet from a current sender by a recipient, the data packet defining: an identity of the current sender, an identity of a final destination, and a sequence identifier; determining whether to rebroadcast by the recipient, if and only if the sequence identifier is not present in a list of prior sequence identifiers, and the identity of the final destination is not the identity of the recipient; and selectively rebroadcasting the data packet by the recipient in dependence on said determining, modified by a replacement of the identity of the current sender with the identity of the recipient; CHARACTERIZED IN THAT the data packet received by the recipient further comprises an identity of a prior sender from which the current sender received the data packet, and a hop count of hops previously traversed by the data packet, and an identity of a target recipient; a forwarding table is updated marking the current sender as being reachable in one hop, and the prior sender as being reachable in two hops via the current sender as next hop; the determining whether to rebroadcast is further dependent on whether the identity of the target recipient matches an identity of the recipient; and the data packet is selectively rebroadcast by the recipient in further dependence on said determining, modified by a replacement of the identity of the prior sender with the identity of the current sender, the identity of the target recipient with an identity of the next hop from the forwarding table if present, and an increment of the hop count, wherein the data packet contains a time-to-live that is decremented by the recipient and the data packet is not forwarded if the time-to-live is zero; wherein the protocol further comprises setting a timer for acknowledgement of the selectively rebroadcast data packet, and monitoring subsequent receipt of an overheard data packet having the sequence identifier. receiving a data packet from a current sender by a recipient, the data packet defining: an identity of the current sender, an identity of a final destination, and a sequence identifier; determining whether to rebroadcast by the recipient, if and only if the sequence identifier is not present in a list of prior sequence identifiers, and the identity of the final destination is not the identity of the recipient; and selectively rebroadcasting the data packet by the recipient in dependence on said determining, modified by a replacement of the identity of the current sender with the identity of the recipient; CHARACTERIZED IN THAT the data packet received by the recipient further comprises an identity of a prior sender from which the current sender received the data packet, and a hop count of hops previously traversed by the data packet, and an identity of a target recipient; a forwarding table is updated marking the current sender as being reachable in one hop, and the prior sender as being reachable in two hops via the current sender as next hop; the determining whether to rebroadcast is further dependent on whether the identity of the target recipient matches an identity of the recipient; and the data packet is selectively rebroadcast by the recipient in further dependence on said determining, modified by a replacement of the identity of the prior sender with the identity of the current sender, the identity of the target recipient with an identity of the next hop from the forwarding table if present, and an increment of the hop count, wherein the data packet contains a time-to-live that is decremented by the recipient and the data packet is not forwarded if the time-to-live is zero; wherein the protocol further comprises setting a timer for acknowledgement of the selectively rebroadcast data packet, and monitoring subsequent receipt of an overheard data packet having the sequence identifier.