GSOC2014LTP
Main Page - Roadmap - Summer Projects - Project Ideas - Developer FAQ - Tools - Related Projects
HOWTOs - Installation - Troubleshooting - User FAQ - Samples - Models - Education - Contributed Code - Papers
Return to GSoC 2014 Accepted Projects page.
Project overview
- Project name: Licklider Transmission Protocol (LTP).
 
- Student: Rubén Martínez
 
- Mentors: Tom Henderson, Tommaso Pecorella
 
- Abstract: Licklider Transmission Protocol (LTP) is a point to point protocol for environments with long round-trip delays (such as deep space communications). This project will provide a RFC compliant implementation, it will consist of a ns-3 module with its corresponding testsuits, examples, helpers and documentation.
 
- Code Repository : http://code.nsnam.org/rmartinez/ns-3-dev-ltp
 
Approach
This protocol can be deployed at two different leves: on top of either the Data-Link-Layer or the Transport Layer (UDP). The best approach should be to start with an UDP implementation, this will ensure compliance with already existing implementations. A data-link-layer implementation can also be done depending on how the project advances, and will be be taken into consideration after the results of the mid-term review (see schedule section).
Development methodology
I will use an iterative-incremental development methodology, each iteration will include implementation, documentation (doxygen style comments, thorough the source code), and testing. Development will be divided on 3 main tasks:
- Task 1: This task consist in developing the ltp-headers and a SDNV codec (Self-Delimiting Numeric Values) a type of data encoding used in DTN protocols. This task consist on defining several data-structures and their serialization/deserialization methods.
 
- Task 2: This task will focus on developing the backbone of the protocol by defining the classes: ltp-packet-queues, ltp-session-records and the basic structure of the ltp-protocol. This will define the main data structures required in control logic used to handle: packets, sessions, protocol state, timers, etc.
 - Task 3: This task will focus on the Send() and Receive() methods of the ltp-protocol class, these methods implement the control logic of the protocol.
 
Testing approach
This project will have testing and cross-validation against existing implementations.
First, testing will we performed as part of the development cycle. It will use a test case based approach using the standard methods provided by the ns-3 API in the form of the TestSuite and TestCase classes. This project will have two kind of tests:
- Unit Tests: each task will have a group of test vectors, those tests will ensure that the internal workings of each developed class works in isolation.
 - System tests: these tests will be provided mainly with examples, it will consist on using the developed module together with already tested ns-3 modules.
 
Lastly, the implementation will be cross-validated against existing implementations of the LTP, such as ION-DTN (JPL) or LTPlib (Trinity College Dublin). This cross-validation will be performed using a shared file descriptor to which both implementations can read or write traffic. The FdNetDevice class provided by the ns-3 API will be used to achieve this task.
Design
Block Diagram
LTP Protocol Send Logic
LTP Protocol Receive Logic
Deliverables
The final product of the project will be a ns-3 module, so the main deliverables will be the several sections of this module:
- Deliverable 1 - model and helper: will contain the main functionalities of the protocol and the helper classes to simplify its use.
 
- Deliverable 1.1 - Packet Headers and SDNV codec.
 - Deliverable 1.2 - LTP-Protocol auxiliary structures (Data Queues and Session State Records).
 - Deliverable 1.3 - LTP-Protocol Core.
 - Deliverable 1.4 - LtpNetDevice.
 - Deliverable 1.5 - LtpStackHelper.
 
- Deliverable 2 - test: this deliverable will contain the several testsuits used.
 
- Deliverable 2.1 - Unit Tests. Packet Headers and SDNV codec: check correctness.
 - Deliverable 2.2 - Unit Tests, LTP-Protocol Auxiliary, check methods, timeouts and data handling correctness.
 - Deliverable 2.3 - Unit Tests, NetDevice implementation, check methods.
 - Deliverable 2.4 - Unit Tests: protocol implementation, communication between nodes, retransmissions, cancellation of communication.
 
- Deliverable 3 - examples : this deliverable will contain several examples on how to install and use the protocol.
 - Deliverable 4 - Cross-Validation: This deliverable will contain several tests using FdNetDevices to perform cross-validation with existing implementations. (4.1 early tests basic protocol, 4.2 final validation).
 
Schedule
- Week 1 - May 19 - May 25. D-1.1. D-2.1.
 - Week 2 - May 26 - June 1.
 - Week 3 - June 2 - June 8. D-1.2. D-2.2.
 - week 4 - June 9 - June 15.
 - Week 5 - June 16 - June 22.
 - Week 6 - June 23 - June 29: Mid-Term Evaluation.
 - Week 7 - June 30 - July 6. D-1.3. D-2.3. D-4.1.
 - Week 8 - June 7 - July 13.
 - Week 9 - July 14 - July 20. D-1.4.
 - Week 10 - July 21 - July 27. D-1.5
 - Week 11 - July 28 - August 3. D-3, D-2.4
 - Week 12 - August 4 - August 10. D-4.2
 
Mid Term Review
The code is composed of 2 patches in Rietveld issues 97540043 [1] and 105340046 [2].
The first corresponds to the SDNV [3] encoding supportused in DTN protocols, from which I contributed the test-suite.
The second is a partial implementation of the LTP protocol containing: packet data structures, protocol management classes and basic API functions for communication with higher layer protocols.
To run test suites, the command is ./test.py -s ltp-protocol. Additionally the interested reader can look at the ltp-protocol.rst document, or the wiki page [4] for details on the purpose of each class and how they interact with each other.
- [1] https://codereview.appspot.com/97540043/
 - [2] https://codereview.appspot.com/105340046/
 - [3] http://www.dtnrg.org/wiki/SDNV
 - [4] http://www.nsnam.org/wiki/GSOC2014LTP
 
Final Code Review
The final code review for the project can be found in [1], this review contains the final version of the model, including a helper, examples, tests and documentation.
The provided test-suites can be run as follows:
    ./test.py -s ltp-protocol
    ./test.py -s ltp-channel-loss
[1] https://codereview.appspot.com/123190043/
List of Features
Convergence Layer Adapter
- Link state cues (callbacks in convergence layer adapter) : Link Up, Link Down, CP sent, RS sent, EOB dequeued, CX dequeued.
 
Ltp Core
- Drop packet procedures: simple discard or Cancellation segment transmission.
 - Start Transmission procedure: Event triggered on reception of Link Up signal. Response: dequeue and tx all packets.
 - Start CP Timer: Event triggered on reception of CP received signal, Response: start CP timer.
 - Stop CP timer : Event triggered on reception of RS segments, response: stop CP timer.
 - Start RS Timer: Event triggered on reception of RS Timer signal, Response: start RS timer.
 - Stop RS Timer: Event triggered by reception of RA, response: stop RS timer.
 - Start Cancel Timer: Event triggered on reception of CX dequeued, response: start cancel timer.
 - Stop Cancel Timer: Event triggered on reception of CAX segment, response: stop cancel timer.
 - Stop Transmission procedure: Event triggered on reception of Link Down, Response: start dequeing of segments.
 - Suspend Timers: Event triggered on reception of Remote peer link Down, Response: suspend timers.
 - Resume Timers: Event triggered on reception of Remote peer link Up, Response: resume timers.
 - Retrans CP: Event triggered by expiration of CP timer, Response: Check Retransmission limit, enqueue new CP segment.
 - Retrans RS: Event triggered by expiration of RS timer, Response: Check Retransmission limit, enqueue new RS segment.
 - Signify Red Part: Reception of EORP and CP, response: Send notification to Client Service instance.
 - Signify Green Data Segment: Reception of GD segment, response: Send notification to Client Service instance.
 - Signify Transmission Completed: All data transmited (signal EOB dequeued) and RP ackd, response: send notification to client service instance and start Close session.
 - Send RP: Original reception of regular CP or asynchronous CP. Response: perform checks then: 1. drop and send CR OR 2. compute bounds of reception claim and send RP.
 - Retrans Data: triggered on reception of RS, response: Send RA segment, stop CP timer, if reception claim indicates incomplete data reception: check retransmission limit then send CS if exceeded or retransmit missed Data segment if not.
 - Retransmit Cancellation segment: triggered on expiration of Cancel timer. response: send copy of CX.
 - ACK cancellation: triggered on reception of CX, response: if received CS send CAS, if received CR sned CAR.
 - Cancel Session: triggered on reception of CAX, reponse: stop cancel timer and close session.
 - Handle Miscolored segments: reception of red-part with offset higher than green-part. response: discard.
 
Other
- Management Information Base: Database with times of operation of LTP engines, provides link state cues: Remote peer link Up, Remote peer link Down.
 - Handle System Error conditions.
 - Notifications to Client Service instance: session start, green-part segment arrival, red-part reception, transmission session completion, transmission-session cancellation, reception-session cancellation, initial-transmission completion.
 - Security Extensions.
 - Integrate SOCIS 2013 bundle protocol implementation with LTP in a separate repo (Tom)
 - Set up virtual machine environment with CORE network emulator to test interoperability against ns-3 implementation (Tom)
 
Features ordered by priority
1. Basic data transmission
- Link state cues. DONE
 - Start Transmission procedure. DONE
 - Drop packet procedures. DONE (No Cancellation sent for now)
 - Handle Miscolored segments. DONE
 - Notifications to Client Service instance. DONE
 - Signify Red Part. DONE
 - Signify Green Data Segment. DONE
 - Signify Transmission Completed. DONE
 - Stop Transmission procedure. DONE (Partially taking RPs into account)
 
2. Model validation
- Integrate SOCIS 2013 bundle protocol implementation with LTP in a separate repo (Tom)
 - Set up virtual machine environment with CORE network emulator to test interoperability against ns-3 implementation (Tom)
 
3. Retransmission based reliability
- Send CP. DONE (Only syncronous checkpoints for now).
 - Send RS. DONE
 - Send RAS. DONE
 - Start CP Timer. DONE
 - Start RS Timer.DONE
 - Retrams Data + Retrams CP. DONE (merged both cases together)
 - Stop CP Timer. DONE
 - Retrans RS: DONE
 - Stop RS timer.DONE
 
4. Cancellation
- Cancel Session (Send CX)
 - Start Cancel Timer
 - Cancel ACK (Send CAX)
 - Stop Cancel Timer
 - Retransmit CX
 
5. Advanced kwnoledge about environment and other considerations
- Management Information Base
 - Suspend Timers
 - Resume Timers
 - Handle System Error conditions.
 - Authentication Extensions.
 - Security Extensions.
 
Protocol Validation
The validation is performed using The Common Open Research Emulator (CORE). Ns-3 implementation is validated for interoperability against LTPLib [1]
Setup
Start core daemon.
sudo /etc/init.d/core-daemon start
Run core-gui.
core-gui
Topology setup: two nodes connected with a point to point link
10.0.0.1/24 <-------------> 10.0.0.2/24
Notes on installation of LTPlib:
autoreconf --install ./configure sudo apt-get install libssl-dev (required library not being checked by configure) make sudo make install
Validation
- LTP is run over UDP. Layer 2 MTU is set to 1500 bytes.
 - Node 2 acts as a server and runs LTPlib.
 - Node 1 acts as client and uses both LTPlib and NS-3 emulation (for comparison purposes).
 
Server running LTPlib - Node 2 (10.0.0.2)
Run LTPlib in 10.0.0.2 2 as server and specify 10.0.0.1 as source (use ltp-deepspace IATA defined port in both sides).
ltpd -v -m S -L 10.0.0.2:1113 -S 10.0.0.1:1113
Client using LTPlib - Node 1 (10.0.0.1)
Node 1: using LTPLib as client.
ltpd -v -m C -D 10.0.0.2:1113 -S 10.0.0.1:1113
Block data is specified in file: ltpd.in
Client using NS-3 emu - Node 1 (10.0.0.1)
Set eth0 to prosmiscuous mode:
ifconfig eth0 promisc
cd into ns-3 directory and run:
./waf --run "scratch/ltp-emu"
Block data is specified in script as std::vector<uint8_t> data ( 5000, 65);
Nominal operation tests
Test 1: 500 byte block, full red data. - Received and ACKed. (SUCCESS)
Test 2: 5000 byte block, full red data. (SUCCESS)
Behaviour is analogous for both implementations (only minor changes in sizes and serial numbers).
- Data Block is split into 4 red segments. Last segment contains EOB. 10.0.0.1 ==> 10.0.0.2
 - Report Segment is sent. 10.0.0.1 <== 10.0.0.2
 - Report Segment is ACKed. 10.0.0.1 ==> 10.0.0.2
 - PCAP Files: node1-ltplib.pcap - node1-ns3.pcap
 
Test 3: 5000 byte block, red data and green data
Retransmission tests
Weekly Reports
Week 1
Finished - Deliverables 1.1 and 2.1
- Providing SDNV [2] encoding support (this a numeric format commonly used on packet fields of DTN protocols). This encoding format was already implemented in Dizhi Zhou's BP wiki/SOCIS2013BundleProtocolProject project. I have expanded it with the corresponding test-suite and moved it to src/network/utils/, for use in both Bundle and LTP protocols. Currently under review in https://codereview.appspot.com/97540043/]
 - Implementation of all LTP packet structures, this includes: Segment Header, Segment Trailer, and Content Header (for all segment variants: data, reports, report acknowledgments, etc.). The implementation including the corresponding tests and documentation.
 
Week 2
Working on Deliverables 1.2 and 2.2
- Implementation of the Ltp queue-set, this is a class containing the dual queue structure (internal operations and application data) used for LTP outbound traffic. The implementation and the corresponding test case can be found on the project repository.
 
- Implementation of the session state record, this is a class to keep track of the state of an LTP transmission session, this class is basically a wrapper that handles several flags, counters, timers and lists. An early version can be found in the project repository.
 
Week 3
Working on Deliverables 1.2 and 2.2
- Fixed several issues in the session state record.
 - Provided a test-case for the session state record.
 - Provided an early concept design for the LTP API.
 
Week 4
Working on Deliverables 1.3 and 2.3
- Finished the design of the LTP API functions used for interaction with the upper layer.
 - Included all the required auxiliary structures inside the LTP core class.
 - Performed minor fixes to auxiliary structures.
 - Provided a test-case for the LTP API functions.
 
Week 5
Working on Deliverables 1.3 and 2.3
- Documentation: ltp-protocol.rst
 - Preparing the mid-term review.
 - Fixing issues in the LTP API class and small tweaks to auxiliary classes.
 - Improving test-case class..
 



