NORM Convergence Layer

A Nack-Oriented Reliable Multicast (NORM) convergence layer. The NORM protocol is designed to provide end-to-end reliable transport of bulk data objects or streams over generic IP multicast routing and forwarding services. NORM uses a selective, negative acknowledgement (NACK) mechanism for transport reliability and offers additional protocol mechanisms to conduct reliable multicast sessions with limited "a priori" coordination among senders and receivers. A congestion control scheme is specified to allow the NORM protocol fairly share available network bandwidth with other transport protocols such as Transmission Control Protocol (TCP).

It is capable of operating with both reciprocal multicast routing among senders and receivers and with asymmetric connectivity (possibly a unicast return path) from the senders to receivers. The protocol offers a number of features to allow different types of applications or possibly other higher level transport protocols to utilize its service in different ways. The protocol leverages the use of FEC-based repair and other IETF reliable multicast transport (RMT) building blocks in its design. Norm sessions persist across link down/up events in order to take full advantage of the built-up tx cache used to satisfy repair requests.

Common Configurations

---------------------

Here are some basic examples to get you started. The full list of link:w parameters are summarized in the next section.

Assume DTN nodes A, B, and C can communicate over an IP network.

EID IPv4 Address
dtn://node_a 10.1.101.1
dtn://node_b 10.1.102.1
dtn://node_c 10.1.103.1
dtn://node_d 10.1.104.1

Point-to-point link A <-> B

Below are the "link add" directives for an always-on unicast link between nodes A and B. Congestion control is enabled (cc) with a maximum tx rate of 230Kbps. "ack" places the remote node in the acking_list; positive acknowledgment is expected after zero of more nack-based repair cycles. "ack" may reduce the number of flush messages.

Node A configuration

link add link_to_b 10.1.102.1:4557 ALWAYSON norm remote_eid=dtn://node_b cc ack rate=230000

Node B configuration

link add link_to_a 10.1.101.1:4557 ALWAYSON norm remote_eid=dtn://node_a cc ack rate=230000

One-to-many multicast A -> B,C,D

For a one-to-many multicast link, use "link add" on the node sourcing data and use "interface add" on the sink nodes. The Node A "acking_list" requests postive acknowledgments from Nodes B and C (after zero or more nack-based repair cycles). Delivery to Node D may not succeeed because it's not in the acking_list. "nodeid" might be needed for senders and/or receivers when nodes are multi-homed.

Node A configuration

link add link_to_bc 239.255.0.1:4558 ALWAYSON norm multicast_interface=eth0 remote_eid=dtn://group cc rate=230000 acking_list=10.1.102.1,10.1.103.1

Node B configuration

interface add norm0 norm multicast_interface=eth0 group_addr=239.255.0.1 nodeid=10.1.102.1

Node C configuration i

interface add norm0 norm multicast_interface=eth0 group_addr=239.255.0.1 nodeid=10.1.103.1

Node D configuration

interface add norm0 norm multicast_interface=eth0 group_addr=239.255.0.1 nodeid=10.1.104.1

Many-to-many

For a many-to-many multicast link, use "link add" on all the nodes sourcing data. Below, all nodes can send to and receive from the multicast group. Note the acking_list is adjusted accordingly in each directive.

Node A configuration

link add link_to_bc 239.255.0.1:4558 ALWAYSON norm multicast_interface=eth0 remote_eid=dtn://group cc rate=230000 acking_list=10.1.102.1,10.1.103.1,10.1.104.1

Node B configuration

link add link_to_bc 239.255.0.1:4558 ALWAYSON norm multicast_interface=eth0 remote_eid=dtn://group cc rate=230000 acking_list=10.1.101.1,10.1.103.1,10.1.104.1

Node C configuration

link add link_to_bc 239.255.0.1:4558 ALWAYSON norm multicast_interface=eth0 remote_eid=dtn://group cc rate=230000 acking_list=10.1.101.1,10.1.102.1,10.1.104.1

Node D configuration

link add link_to_bc 239.255.0.1:4558 ALWAYSON norm multicast_interface=eth0 remote_eid=dtn://group cc rate=230000 acking_list=10.1.101.1,10.1.102.1,10.1.103.1

Link Parameters

---------------

To add a norm interface in your config file, use:

Syntax: link add name nexthop type norm [arg=val arg2=val2 argN=valN...]

Valid arguments for arg are:

arg Possible settings Default Comments
cc true or false false Whether NORM congestion control is enabled.
rate number (bps) 64000 Rate of NORM link in bits per second (bps). If congestion control is enabled (see cc) this is the maximum achievable rate.
nodeid string (hostname || IPv4 address) none Uniquely identify this node on the NORM link with an IPv4 address. (Normally only needed for multi-homed nodes).
segment_size number (bytes) 1400 Maximum payload size of NORM sender messages in bytes (not incl. NORM message header fields).
local_port number (port) 4558 (NORM interfaces only) Local UDP port to listen on for incoming multicast traffic.
remote_addr number (bytes) acquired from the "link add" directive Remote NORM link IP address (not used -- normally acquired from the "link add" directive)
remote_port number (port) 4557 Remote NORM link port. (not used -- normally acquired from the "link add" directive)
multicast_interface interface tbc The host interface to use when working with multicast groups.
group_addr IP address (IPv4) tbc (NORM interfaces only) Multicast IPv4 address to join. For multicast links, the group address is acquired from the "link add" directive.
tx_robust_factor number 20 The number of flush messages sent at the end of each transmission. Flush messages are used to prompt receivers to request needed repairs. With "acking_list" or "ack", periodic flush messages cease once positive ack(s) are received.
rx_robust_factor number 20 The number of times a receiver will nack for repairs before giving up.
tos number (marking) 0 DSCP marking (0-64) for all bundles on a specific link Size of the receive buffer for each NORM link.
acking_list string (comma delimited list) tbc (multicast links) A comma separated list of IPv4 addresses (NORM node ids) that must positively ack sender-initiated flush messages (once any nack-based repair process has completed).
ack tbc tbc A shorthand way of requesting positive acks from the remote end of unicast links.
silent true or false false "silent" receivers do not originate any NORM traffic and must rely on proactive FEC for repairs.
ecn true or false false Whether NORM explicit congestion notification support is enabled. Size of the receive buffer for each NORM link.
object_size number (objects) 0 Partition large DTN bundles into multiple NORM data objects for transmission. With the default of zero bytes, no object partitioning is performed. Setting object size to a relatively small value, e.g. 50000 bytes, may be useful in some contention based networks (see tx_spacer). This feature is similar in concept to proactive bundle fragmentation or "bundle MTU" (neither yet implemented in DTN2). (see tx_spacer).
tx_spacer number (ms) 0 When combined with object_size, tx_spacer may be used to add a constant pause time (ms) between successive NORM data object transmissions. On contention based networks, this pause time may give other nodes a chance to transmit.
keepalive_intvl number (ms) 5000 For DTN opportunistic links, keepalive_intvl is the number of miliseconds between successive keepalive packets. Opportunistic links are made unavailable when three remote keepalive packets are missed. In addition, reliable mode links send watermarks at keepalive intervals.
fec_buf_size number (bytes) 1048576 The number of bytes allocated for sender calculated FEC segments and repair state.
block_size number (source symbol segments) 64 The number of source symbol segments per coding block for the systematic Reed-Solomon FEC code used in the NRL NORM implementation.
num_parity number (parity blocks) 16 The maximum number of parity blocks the sender is willing to calculate per coding block.
auto_parity number (messages) 0 The number of "auto-parity" messages sent at the end of each coding block.
backoff_factor number (factor) 0.0 for unicast; 4.0 for multicast links Used to scale various timeouts during the NACK repair process.
group_size number 1000 Group size is advertised to the receiver group where it is used in calculating backoff timers. Due to encoding techniques in the NORM header, 1000 receivers is the smallest value allowed by the NORM protocol.
tx_cache_size_max number (bytes) 20971520 Size of the NORM object cache per link.
tx_cache_count_min number (objects) 8 At at minimum, this many objects are allowed to be enqueued in the NORM engine regardless of the object sizes. After the tx_cache_count_min value is surpassed, cache size contraints are in effect (see tx_cache_size_max).
tx_cache_count_max number (objects) 1024 The maximum number of objects that may be enqueued for transmission with the NORM engine assuming the total size is less that tx_cache_size_max.
rx_buf_size number (bytes) 300000 Size of the receive buffer for each NORM link.

Note

Requirements

------------

NORM libraries from the Naval Research Lab

Installation

------------

Configure DTN2 using '--with-norm' and (re)compile.

Add NORM links to dtn.conf, for example:

link add norm_link remote_host:4557 ALWAYSON norm