[dtn-interest] Age Block / DTN2 discussion
Calvin Ardi <cardi@ieee.org> Wed, 17 November 2010 04:00 UTC
Received: from hal.rescomp.berkeley.edu (hal.Rescomp.Berkeley.EDU [169.229.70.150]) by maillists.intel-research.net (8.13.8/8.13.8) with ESMTP id oAH40Iub016132 for <dtn-interest@mailman.dtnrg.org>; Tue, 16 Nov 2010 20:00:21 -0800
Received: by hal.rescomp.berkeley.edu (Postfix, from userid 1261) id 0BCA2597E58; Tue, 16 Nov 2010 20:00:25 -0800 (PST)
Date: Tue, 16 Nov 2010 20:00:24 -0800
From: Calvin Ardi <cardi@ieee.org>
To: dtn-interest@mailman.dtnrg.org
Message-ID: <20101117040024.GV25417@hal.rescomp.berkeley.edu>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
User-Agent: Mutt/1.5.20 (2009-06-14)
Subject: [dtn-interest] Age Block / DTN2 discussion
X-BeenThere: dtn-interest@maillists.intel-research.net
X-Mailman-Version: 2.1.9
Precedence: list
List-Id: Delay Tolerant Networking Interest List <dtn-interest.maillists.intel-research.net>
List-Unsubscribe: <http://maillists.intel-research.net/mailman/listinfo/dtn-interest>, <mailto:dtn-interest-request@maillists.intel-research.net?subject=unsubscribe>
List-Archive: <http://maillists.intel-research.net/pipermail/dtn-interest>
List-Post: <mailto:dtn-interest@maillists.intel-research.net>
List-Help: <mailto:dtn-interest-request@maillists.intel-research.net?subject=help>
List-Subscribe: <http://maillists.intel-research.net/mailman/listinfo/dtn-interest>, <mailto:dtn-interest-request@maillists.intel-research.net?subject=subscribe>
X-List-Received-Date: Wed, 17 Nov 2010 04:00:21 -0000
Hi everyone, I've been prototyping the Age block [1] for DTN2 and hope to push it out alongside the DTN2.8.0 release (after some code review and initial tests on my end). Implementing the extension block has allowed me to go through some of the underlying code and I'd like to bring up a few points for discussion / comments regarding the Age block and future iterations of DTN2. Unless otherwise noted, most of the following refers specifically to DTN2 implementation, but some can refer to the protocol in general. ---- Age Block: * The current Age block spec [1] calls for microseconds (Sec. 4) as the Age field; does anyone actually use or forsee a use for such precision? The bundle Creation Timestamp Time and Lifetime (RFC5050, Sec 4.5.1) use seconds, and I've currently implemented the Age with seconds (saves a few extra bits over the wire and a calculation here and there :) Unless there's anyone against it, I'll make the minor change on the next draft. * The mechanism for signaling of the use of the Age block is to set the Creation Timestamp Time to 0 (which I believe was to maintain compliance with 5050?). It would be more useful to fill in the Creation Timestamp Time field with the system time in addition to the Age block. If the receiving BPA finds that the difference between the Creation Timestamp Time + Lifetime and the current time is greater than some value X, it can safely assume that either the sender's clock or its own clock is out of sync and use the Age block instead. This will require some modification to how bundles are processed. If I'm getting this right, when a bundle is received, the Creation Timestamp Time and Lifetime is checked and then expiry decisions are made immediately after. Since there's the potential for additional information / metadata to be placed in ext blocks, the daemon should process the ext blocks contained in a bundle in addition to the primary block before making decisions on what to do with the bundle (this could include forwarding, expiration, storage management, etc). There's the potential for these ext blocks becoming very large and perhaps unwieldy for processing (especially in low power/embedded systems and environments) but at this point, overhead seems minimal. * Known limitations: many. It's assumed that while your clock may be unsynchronized, it's at least capable of keeping track of how much time has elapsed (otherwise all bets are off). With the way ext blocks are handled, the Age for a new bundle is calculated as the time it takes from when a bundle is initialized (or when the ext block is consumed) until the ext block generate() function is called. This leaves a few gaps in the Age (some of which has been discussed in the draft but included for emphasis). Propagation delay tops the list; for now it's not taken into account. For some applications or networks this might be trivial, but it poses an interesting challenge as to how to calculate this. The consensus (as of 2010 March) was to push this burden to the convergence layer, which would require extensive modification to each convergence layer and moving more information between the daemon and CLs. The other gap is the time after generate() is called and before it's sent to the convergence layer queue. Thus, the Age does not factor the time it takes to process additional extension blocks, nor the time it sits on a link queue. Slightly trivial, but could be important if we have a busy BPA with, for example, a slow connection and many bundles to process. ---- DTN2 implementation: * Run-time configuration: The use of extension blocks provides an easy way to implement new features, but at the moment there isn't a way to configure which BlockProcessors should be initialized or run. Because there might be the possibility that not everyone wants an Age block on their bundles (hypothetical of course, who wouldn't want the Age block? :) I've added some configuration options in dtn.conf to enable/disable certain aspects. * Modularity: What I'd like to see is a more modular system for developing and enabling extension blocks without requiring a re-compile of DTN2 each time an ext block is developed/updated. I'm not sure if the current system supports it or how much additional work it'd require, but something similar to Apache2's module system would be awesome for DTN2 (e.g., see a2enmod/a2dismod on a Debian/Ubuntu system). * Minimal code changes to the DTN2 core: Following from the previous point, I've tried to make only the necessary changes to the DTN2 core as some of the logic / processing wasn't able to be contained within the BlockProcessor class. For example, if we want to zero out the Creation Timestamp Time in conjunction with adding the Age block, we have to do that in the BundleDaemon as opposed to making that change in the BlockProcessor. Additionally, some metadata (Timers and a few other things) need to be stored to support the Age block and that's done by adding a few more variables to the Bundle class; it'd be nice to eventually have the situation where all of it could be contained in the BlockProcessor itself instead of addition additional fields and cluttering up the DTN2 core. ---- DTN: * Storage management: another issue discussed briefly in the draft is what happens when a BPA without a synchronized clock loses power and wakes up. One way is to expire all of the bundles in the persistent store and then delete them (5050, Sec. 5.5). I think a best-effort approach, if time is not of the essence, would work better here: If there are enough resources to go around, why not just process and send the bundles out to their intended destination? This could potentially clutter up the network, but combined with a Class of Service bit or ext block, we could label them as low priority and create a policy as to how to handle them (e.g., if battery is < X% and persistant store < Y%, delete bundles with low priority). I don't have all the solutions or the manpower to implement all these ideas, but I'm definitely open to collaborating with anyone to get these ideas off the ground. Any comments welcome. Cheers, Calvin [1] http://tools.ietf.org/html/draft-irtf-dtnrg-bundle-age-block-01
- Re: [dtn-interest] Age Block / DTN2 discussion Burleigh, Scott C (313B)
- Re: [dtn-interest] Age Block / DTN2 discussion Stephen Farrell
- Re: [dtn-interest] Age Block / DTN2 discussion Stephen Farrell
- Re: [dtn-interest] Age Block / DTN2 discussion Dan Brown
- [dtn-interest] Age Block / DTN2 discussion Calvin Ardi