Implementation of AccECN and ECN++ in ns-3

Student: Wenying Dai, Tsinghua University, China

Mentor: Mohit P. Tahiliani, NITK Surathkal, India

Organization: The ns-3 Network Simulator Project
Project Overview

Reducing Internet Transport Latency is an interesting research topic and has gained significant attention in the recent past. Some of the promising new solutions rely on Explicit Congestion Notification (ECN) (RFC 3168) to notify TCP endpoints of congestion that may be developing in a bottleneck queue, without resorting to packet drops. As a result, there have been attempts at Internet Engineering Task Force (IETF) to extend the functionality of ECN and provide rich feedback to TCP endpoints. In this regard, Accurate ECN feedback (AccECN) and ECN++ are two active topics of discussion at IETF. During GSoC 2018, I extended the ECN implementation in ns-3 to support ECN++ and AccECN, test the correctness of implementation and provide examples.

ECN++ is a sender-side change. The feedback behavior at the receiver depends on whether classic ECN feedback or experimental AccECN feedback has been negotiated. ECN++ allows the use of ECN on the following TCP control packets: SYNs, pure ACKs, Window probes, FINs, RSTs, and retransmissions. For each type of control packet or transmission, the detailed changes to the sender's behavior consist of the following two aspects: (a) whether it sets ECT (b) its response to congestion feedback.

AccECN provides more Accurate ECN feedback in the TCP header to provide more than one feedback signal per RTT. AccECN needs to cooperate with other standards which defined the usage of the information such as classic ECN (RFC 3168), ECN+ (RFC 5562) and ECN++. Therefore, how to use AccECN feedback information to optimize the TCP performance is out of scope for AccECN implementation. The AccECN has been designed into two parts: (a) an essential part that re-uses TCP header bits to feedback the number of arriving CE marked packets. (b) the supplementary part using a new AccECN TCP option that provides additional feedback on the number of bytes that arrive marked with each of the three ECN codepoints (not just CE marks).

I have implemened ECN++ and AccECN in ns-3 with necessary examples, tests and documentation. This work is important to the ns-3 and research community, because this is a contemporary research topic and because network simulators are extensively used for performance evaluation. This report presents the details of the work done during GSoC 2018, and provides the necessary information to reproduce this work.

Deliverables

This project was split into three phases, and each phase has been completed with documentation, tests, and example programs, and is ready to be reviewed for merging to the ns-3 mainline. My patches integrate with ns-3-dev as of changeset 13735.

assignment_turned_in

Phase 1
Implementation of ECN++ with Classic ECN feedback in ns-3

Implemented ECN++ functionality with classic ECN feedback in ns-3 and documented its functionality. A test suite and an example is provided.

assignment_turned_in

Phase 2
Implementation of AccECN in ns-3 without TCP Options

Implemented the Accurate ECN functionality in ns-3 without TCP Options and documented its functionality. A test suite is provided.

assignment_turned_in

Phase 3
Implementation of AccECN in ns-3 with TCP Options

Implemented the Accurate ECN functionality in ns-3 with TCP Options and documented its functionality. A test suite is provided.

Steps to build the code for Phase 1
  1. Clone the project's github repository
  2. Checkout to "ecnpp" branch (git checkout ecnpp)
  3. Build ns-3
  4. Run ECN++ test suite: ./test.py --suite=tcp-ecnpp-test
Steps to build the code for Phase 2
  1. Clone the project's github repository
  2. Checkout to "accecn-without-options" branch (git checkout accecn-without-options)
  3. Build ns-3
  4. Run AccECN test suite: ./test.py --suite=tcp-accecn-test
Steps to build the code for Phase 3
  1. Clone the project's github repository
  2. Checkout to "accecn-with-options" branch (git checkout accecn-with-options)
  3. Build ns-3
  4. Run AccECN test suite: ./test.py --suite=tcp-accecn-test
Possible Extensions

This project can be extended further as suggested below:

  1. Our ECN++ implementation currently does not provide support to mark pure ACK packets. Enabling the marking of pure ACKs is tricky because the response to a CE-marked pure ACK packet is ambiguous and Internet draft does not provide guidelines to resolve this ambiguity. On communicating with the authors of ECN++, we found that the ECN++ Internet draft might be revised to avoid marking pure ACK packets. If the support for marking pure ACK packets is not removed from the Internet draft (instead, the ambiguity is resolved), our implementation would have to be extended to support marking of pure ACK packets.
  2. Our implementation of AccECN assumes that there are no middleboxes in the network that may affect the AccECN functionality. This work can be extended by relaxing this assumption and ensuring AccECN continues to work despite the presence of middleboxes.
Online References

More details about this project, source code and final patch are available on the links given below: