The goal of this work is to provide Integtrated services semantic for unicast traffic in a SCORE network. Unlike previous solutions, our solution does not require core routers to maintain per-flow state on the data or control paths. The key idea is to use Dynamic Packet State (DPS) to push the complexity from the network core to edges, without compromising the service semantic. The next two section outlines our solution for both the data and the control paths.Technical Overview
Jitter Virtual Clock (Jitter-VC) Jitter-VC is a non-work-conserving version of the well-known Virtual Clock algorithm. It uses a combination of a delay-jitter rate controller and a Virtual Clock scheduler. The algorithm works as follows: each packet is assigned an eligibility time and a deadline upon its arrival. The packet is held in the rate controller until its eligible time expires. The scheduler orders the transmission of eligible packets according to their deadlines. The eligible and the deadline of the packets of a flow with reservation r are computed as being the start and finish time of transmitting the packet in an ideal network in which the flow has dedicated links of capacity r. In particular the eligible time of a packet is computed as being the maximum between
Finally, the deadline of a packet is computed as the sum between the packet's arrival time and the time it takes to transmit the packet in the ideal system, i.e., l / r, where l represents the packet length.
The Figure below shows the time diagram for the first two packets of a flow along a path of four nodes. The arrival times of the first packet at each node are represented by the blue arrows, while the arrival times of the second packet are represented by the orange arrows. The starting times of the horizontal blue and orange lines represent the eligible times of the first, and the second packet, respectively, at each node. The length of these lines represent the time it takes to transmit the packet in the ideal system, i.e. l/r. For simplicity, here we assume that the propagation delay between any two nodes is zero.
The key point to note in the above Figure is that the eligible time of the second packet (i.e., the orange packet) at nodes 3 and 4 depends on the deadline of the previous packet of the same flow (i.e., the blue one). This dependency is the fundamental reason of why implementing Jitter-VC requires us to maintain per-flow state.
Core-Jitter Virtual Clock (CJVC) From the above discussion, it follows that in order to eliminate per-flow state on the data path, we need to eliminate the dependence of a packet eligible time on the previous packet deadline. To achieve this we propose a new scheduling discipline called Core-Jitter Virtual Clock (CJVC).
The key idea behind CJVC is to introduce a slack variable s and use it, instead of the previous packet deadline, to compute the packet eligible time. The slack variable s is computed by the ingress node and inserted in the packet header (see [1]). In turn, each subsequent node uses s to compute the packet eligible time by simply adding it to the previous packet deadline. Since the eligible time computed in this way is never smaller than the deadline of the previous packet (see [1] for proof), we can simply ignore the deadline. In this way there is no longer need to maintain per-flow state for computing the eligible time.
The following Figure illustrates how the eligible times of the second packet are computed under CJVC. Note that unlike Jitter-VC the eligible times are always larger than the deadlines of the previous packet of the flow at the same node.
In [1] we prove two important properties of CJVC
By using the DPS we are able to eliminate both this complexity and the need to maintain per-flow state. The price we pay is resource utilization. This is because instead of using the exact value of total reserved rate for computing the available bandwidth we use an upper-bound of this value. In particular, we can allocate no more than 80% - 90% of the link capacity to the guaranteed traffic. However, we believe that in practice this is acceptable, as the un-allocated bandwidth can be used by the best-effort traffic.
To compute an upper-bound for the total reservation we start with estimating the total reserved rate. We first make the following simple observation. If all flows were sending at their reserved rates, estimating the total reserved rate at a core node is trivial: just estimate the actual aggregate rate. The following Figure shows two flows with reservations of 2 Mbps, and 3 Mbps, respectively. If both flows send at their reserved rates, then by measuring the aggregate rate at a core router we obtain 5 Mbps, which represents exactly the total reserved rate along the link.
The obvious problem with this approach is that usually flows do not send at their reserved rate. To get around this problem our solution is to use DPS. In particular, for each packet, ingress routers compute a virtual length and insert it in the packet header before forwarding it. Virtual length represents the number of bits that the flow was supposed to send at its reserved rate since the previous packet was transmitted. By definition, the virtual length of the first packet of a flow is equal to its actual length. Figure below illustrates the computation of the packets' virtual lengths for a flow that has a reservation of 1 Mbps. The inter-departure times between the first four packets is 1.2 ms, 1.3 ms, and 2.5 ms, respectively. The packets are flowing from left to right, and the first packet has 1000 bits.
Estimating the total reserved rate becomes now trivial. This reduces to measure the aggregate traffic rate using the virtual lengths of the packets, instead of their actual lengths.
In [1], by using this estimate we derive an
upper-bound for the total reserved rate. In doing this we account for
inaccuracies introduced by packet losses and duplications, and for
reservation that start or finish in the middle of the estimation
interval.