draft-ietf-rmcat-coupled-cc-05.txt | draft-ietf-rmcat-coupled-cc-06.txt | |||
---|---|---|---|---|
RTP Media Congestion Avoidance S. Islam | RTP Media Congestion Avoidance Techniques (rmcat) S. Islam | |||
Techniques (rmcat) M. Welzl | Internet-Draft M. Welzl | |||
Internet-Draft S. Gjessing | Intended status: Experimental S. Gjessing | |||
Intended status: Experimental University of Oslo | Expires: September 29, 2017 University of Oslo | |||
Expires: June 10, 2017 December 7, 2016 | March 28, 2017 | |||
Coupled congestion control for RTP media | Coupled congestion control for RTP media | |||
draft-ietf-rmcat-coupled-cc-05 | draft-ietf-rmcat-coupled-cc-06 | |||
Abstract | Abstract | |||
When multiple congestion controlled RTP sessions traverse the same | When multiple congestion controlled RTP sessions traverse the same | |||
network bottleneck, combining their controls can improve the total | network bottleneck, combining their controls can improve the total | |||
on-the-wire behavior in terms of delay, loss and fairness. This | on-the-wire behavior in terms of delay, loss and fairness. This | |||
document describes such a method for flows that have the same sender, | document describes such a method for flows that have the same sender, | |||
in a way that is as flexible and simple as possible while minimizing | in a way that is as flexible and simple as possible while minimizing | |||
the amount of changes needed to existing RTP applications. It | the amount of changes needed to existing RTP applications. It | |||
specifies how to apply the method for the NADA congestion control | specifies how to apply the method for the NADA congestion control | |||
algorithm, and provides suggestions on how to apply it to other | algorithm, and provides suggestions on how to apply it to other | |||
congestion control algorithms. | congestion control algorithms. | |||
Status of this Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at http://datatracker.ietf.org/drafts/current/. | Drafts is at http://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on June 10, 2017. | This Internet-Draft will expire on September 29, 2017. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2016 IETF Trust and the persons identified as the | Copyright (c) 2017 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
2. Definitions . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 2. Definitions . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
3. Limitations . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 3. Limitations . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
4. Architectural overview . . . . . . . . . . . . . . . . . . . . 4 | 4. Architectural overview . . . . . . . . . . . . . . . . . . . 5 | |||
5. Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 5. Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
5.1. SBD . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 5.1. SBD . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
5.2. FSE . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 5.2. FSE . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
5.3. Flows . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | 5.3. Flows . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
5.3.1. Example algorithm 1 - Active FSE . . . . . . . . . . . 8 | 5.3.1. Example algorithm 1 - Active FSE . . . . . . . . . . 9 | |||
5.3.2. Example algorithm 2 - Conservative Active FSE . . . . 9 | 5.3.2. Example algorithm 2 - Conservative Active FSE . . . . 10 | |||
6. Application . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 6. Application . . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
6.1. NADA . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 | 6.1. NADA . . . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
6.2. General recommendations . . . . . . . . . . . . . . . . . 11 | 6.2. General recommendations . . . . . . . . . . . . . . . . . 11 | |||
7. Expected feedback from experiments . . . . . . . . . . . . . . 12 | 7. Expected feedback from experiments . . . . . . . . . . . . . 12 | |||
8. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 12 | 8. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 12 | |||
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 12 | 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 13 | |||
10. Security Considerations . . . . . . . . . . . . . . . . . . . 12 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 13 | |||
11. References . . . . . . . . . . . . . . . . . . . . . . . . . . 13 | 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
11.1. Normative References . . . . . . . . . . . . . . . . . . . 13 | 11.1. Normative References . . . . . . . . . . . . . . . . . . 13 | |||
11.2. Informative References . . . . . . . . . . . . . . . . . . 13 | 11.2. Informative References . . . . . . . . . . . . . . . . . 14 | |||
Appendix A. Application to GCC . . . . . . . . . . . . . . . . . 15 | Appendix A. Application to GCC . . . . . . . . . . . . . . . . . 15 | |||
Appendix B. Scheduling . . . . . . . . . . . . . . . . . . . . . 15 | Appendix B. Scheduling . . . . . . . . . . . . . . . . . . . . . 16 | |||
Appendix C. Example algorithm - Passive FSE . . . . . . . . . . . 15 | Appendix C. Example algorithm - Passive FSE . . . . . . . . . . 16 | |||
C.1. Example operation (passive) . . . . . . . . . . . . . . . 18 | C.1. Example operation (passive) . . . . . . . . . . . . . . . 19 | |||
Appendix D. Change log . . . . . . . . . . . . . . . . . . . . . 22 | Appendix D. Change log . . . . . . . . . . . . . . . . . . . . . 23 | |||
D.1. draft-welzl-rmcat-coupled-cc . . . . . . . . . . . . . . . 22 | D.1. draft-welzl-rmcat-coupled-cc . . . . . . . . . . . . . . 23 | |||
D.1.1. Changes from -00 to -01 . . . . . . . . . . . . . . . 22 | D.1.1. Changes from -00 to -01 . . . . . . . . . . . . . . . 23 | |||
D.1.2. Changes from -01 to -02 . . . . . . . . . . . . . . . 22 | D.1.2. Changes from -01 to -02 . . . . . . . . . . . . . . . 23 | |||
D.1.3. Changes from -02 to -03 . . . . . . . . . . . . . . . 23 | D.1.3. Changes from -02 to -03 . . . . . . . . . . . . . . . 23 | |||
D.1.4. Changes from -03 to -04 . . . . . . . . . . . . . . . 23 | D.1.4. Changes from -03 to -04 . . . . . . . . . . . . . . . 24 | |||
D.1.5. Changes from -04 to -05 . . . . . . . . . . . . . . . 23 | D.1.5. Changes from -04 to -05 . . . . . . . . . . . . . . . 24 | |||
D.2. draft-ietf-rmcat-coupled-cc . . . . . . . . . . . . . . . 23 | D.2. draft-ietf-rmcat-coupled-cc . . . . . . . . . . . . . . . 24 | |||
D.2.1. Changes from draft-welzl-rmcat-coupled-cc-05 . . . . . 23 | D.2.1. Changes from draft-welzl-rmcat-coupled-cc-05 . . . . 24 | |||
D.2.2. Changes from -00 to -01 . . . . . . . . . . . . . . . 23 | D.2.2. Changes from -00 to -01 . . . . . . . . . . . . . . . 24 | |||
D.2.3. Changes from -01 to -02 . . . . . . . . . . . . . . . 23 | D.2.3. Changes from -01 to -02 . . . . . . . . . . . . . . . 24 | |||
D.2.4. Changes from -02 to -03 . . . . . . . . . . . . . . . 24 | D.2.4. Changes from -02 to -03 . . . . . . . . . . . . . . . 24 | |||
D.2.5. Changes from -03 to -04 . . . . . . . . . . . . . . . 24 | D.2.5. Changes from -03 to -04 . . . . . . . . . . . . . . . 24 | |||
D.2.6. Changes from -04 to -05 . . . . . . . . . . . . . . . 24 | D.2.6. Changes from -04 to -05 . . . . . . . . . . . . . . . 25 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 24 | D.2.7. Changes from -05 to -06 . . . . . . . . . . . . . . . 25 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 25 | ||||
1. Introduction | 1. Introduction | |||
When there is enough data to send, a congestion controller must | When there is enough data to send, a congestion controller must | |||
increase its sending rate until the path's capacity has been reached; | increase its sending rate until the path's capacity has been reached; | |||
depending on the controller, sometimes the rate is increased further, | depending on the controller, sometimes the rate is increased further, | |||
until packets are ECN-marked or dropped. This process inevitably | until packets are ECN-marked or dropped. This process inevitably | |||
creates undesirable queuing delay when multiple congestion controlled | creates undesirable queuing delay when multiple congestion controlled | |||
connections traverse the same network bottleneck. | connections traverse the same network bottleneck. | |||
skipping to change at page 3, line 27 ¶ | skipping to change at page 3, line 27 ¶ | |||
connection congestion control functionality, which is quite a | connection congestion control functionality, which is quite a | |||
significant change to existing RTP based applications. This document | significant change to existing RTP based applications. This document | |||
presents a method to combine the behavior of congestion control | presents a method to combine the behavior of congestion control | |||
mechanisms that is easier to implement than the Congestion Manager | mechanisms that is easier to implement than the Congestion Manager | |||
[RFC3124] and also requires less significant changes to existing RTP | [RFC3124] and also requires less significant changes to existing RTP | |||
based applications. It attempts to roughly approximate the CM | based applications. It attempts to roughly approximate the CM | |||
behavior by sharing information between existing congestion | behavior by sharing information between existing congestion | |||
controllers. It is able to honor user-specified priorities, which is | controllers. It is able to honor user-specified priorities, which is | |||
required by rtcweb [RFC7478]. | required by rtcweb [RFC7478]. | |||
The described mechanisms are believed safe to use, but are | ||||
experimental and are presented for wider review and operational | ||||
evaluation. | ||||
2. Definitions | 2. Definitions | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
document are to be interpreted as described in RFC 2119 [RFC2119]. | document are to be interpreted as described in RFC 2119 [RFC2119]. | |||
Available Bandwidth: | Available Bandwidth: | |||
The available bandwidth is the nominal link capacity minus the | The available bandwidth is the nominal link capacity minus the | |||
amount of traffic that traversed the link during a certain time | amount of traffic that traversed the link during a certain time | |||
interval, divided by that time interval. | interval, divided by that time interval. | |||
Bottleneck: | Bottleneck: | |||
The first link with the smallest available bandwidth along the | The first link with the smallest available bandwidth along the | |||
path between a sender and receiver. | path between a sender and receiver. | |||
Flow: | Flow: | |||
A flow is the entity that congestion control is operating on. | A flow is the entity that congestion control is operating on. | |||
It could, for example, be a transport layer connection, an RTP | It could, for example, be a transport layer connection, an RTP | |||
session, or a subsession that is multiplexed onto a single RTP | stream [RFC7656], whether or not this RTP stream is multiplexed | |||
session together with other subsessions. | onto an RTP session with other RTP streams. | |||
Flow Group Identifier (FGI): | Flow Group Identifier (FGI): | |||
A unique identifier for each subset of flows that is limited by | A unique identifier for each subset of flows that is limited by | |||
a common bottleneck. | a common bottleneck. | |||
Flow State Exchange (FSE): | Flow State Exchange (FSE): | |||
The entity that maintains information that is exchanged between | The entity that maintains information that is exchanged between | |||
flows. | flows. | |||
Flow Group (FG): | Flow Group (FG): | |||
A group of flows having the same FGI. | A group of flows having the same FGI. | |||
skipping to change at page 5, line 21 ¶ | skipping to change at page 5, line 27 ¶ | |||
instead updates information in the FSE and performs a query on the | instead updates information in the FSE and performs a query on the | |||
FSE, leading to a sending rate that can be different from what the | FSE, leading to a sending rate that can be different from what the | |||
congestion controller originally determined. Using information | congestion controller originally determined. Using information | |||
about/from the currently active flows, SBD updates the FSE with the | about/from the currently active flows, SBD updates the FSE with the | |||
correct Flow State Identifiers (FSIs). This document describes both | correct Flow State Identifiers (FSIs). This document describes both | |||
active and passive versions, however the passive version is put into | active and passive versions, however the passive version is put into | |||
the appendix as it is extremely experimental. Figure 2 shows the | the appendix as it is extremely experimental. Figure 2 shows the | |||
interaction between flows and the FSE, using the variable names | interaction between flows and the FSE, using the variable names | |||
defined in Section 5.2. | defined in Section 5.2. | |||
------- <--- Flow 1 | ------- <--- Flow 1 | |||
| FSE | <--- Flow 2 .. | | FSE | <--- Flow 2 .. | |||
------- <--- .. Flow N | ------- <--- .. Flow N | |||
^ | ^ | |||
| | | | | | |||
------- | | ------- | | |||
| SBD | <-------| | | SBD | <-------| | |||
------- | ------- | |||
Figure 1: Coupled congestion control architecture | Figure 1: Coupled congestion control architecture | |||
Flow#1(cc) FSE Flow#2(cc) | Flow#1(cc) FSE Flow#2(cc) | |||
---------- --- ---------- | ---------- --- ---------- | |||
#1 JOIN ----register--> REGISTER | #1 JOIN ----register--> REGISTER | |||
REGISTER <--register-- JOIN #1 | REGISTER <--register-- JOIN #1 | |||
#2 CC_R ----UPDATE----> UPDATE (in) | #2 CC_R(1) ----UPDATE----> UPDATE (in) | |||
#3 NEW RATE <---FSE_R------ UPDATE (out) --FSE_R----> #3 NEW RATE | #3 NEW RATE <---FSE_R(1)-- UPDATE (out) --FSE_R(2)-> #3 NEW RATE | |||
Figure 2: Flow-FSE interaction | Figure 2: Flow-FSE interaction | |||
Since everything shown in Figure 1 is assumed to operate on a single | Since everything shown in Figure 1 is assumed to operate on a single | |||
host (the sender) only, this document only describes aspects that | host (the sender) only, this document only describes aspects that | |||
have an influence on the resulting on-the-wire behavior. It does, | have an influence on the resulting on-the-wire behavior. It does, | |||
for instance, not define how many bits must be used to represent | for instance, not define how many bits must be used to represent | |||
FSIs, or in which way the entities communicate. Implementations can | FSIs, or in which way the entities communicate. Implementations can | |||
take various forms: for instance, all the elements in the figure | take various forms: for instance, all the elements in the figure | |||
could be implemented within a single application, thereby operating | could be implemented within a single application, thereby operating | |||
skipping to change at page 6, line 31 ¶ | skipping to change at page 6, line 46 ¶ | |||
5.1. SBD | 5.1. SBD | |||
SBD uses knowledge about the flows to determine which flows belong in | SBD uses knowledge about the flows to determine which flows belong in | |||
the same Flow Group (FG), and assigns FGIs accordingly. This | the same Flow Group (FG), and assigns FGIs accordingly. This | |||
knowledge can be derived in three basic ways: | knowledge can be derived in three basic ways: | |||
1. From multiplexing: it can be based on the simple assumption that | 1. From multiplexing: it can be based on the simple assumption that | |||
packets sharing the same five-tuple (IP source and destination | packets sharing the same five-tuple (IP source and destination | |||
address, protocol, and transport layer port number pair) and | address, protocol, and transport layer port number pair) and | |||
having the same Differentiated Services Code Point (DSCP) in the | having the same values for the Differentiated Services Code Point | |||
IP header are typically treated in the same way along the path. | (DSCP) and the ECN field in the IP header are typically treated | |||
The latter method is the only one specified in this document: SBD | in the same way along the path. The latter method is the only | |||
MAY consider all flows that use the same five-tuple and DSCP to | one specified in this document: SBD MAY consider all flows that | |||
belong to the same FG. This classification applies to certain | use the same five-tuple, DSCP and ECN field value to belong to | |||
tunnels, or RTP flows that are multiplexed over one transport | the same FG. This classification applies to certain tunnels, or | |||
(cf. [transport-multiplex]). Such multiplexing is also a | RTP flows that are multiplexed over one transport (cf. | |||
recommended usage of RTP in rtcweb [rtcweb-rtp-usage]. | [transport-multiplex]). Such multiplexing is also a recommended | |||
usage of RTP in rtcweb [rtcweb-rtp-usage]. | ||||
2. Via configuration: e.g. by assuming that a common wireless uplink | 2. Via configuration: e.g. by assuming that a common wireless uplink | |||
is also a shared bottleneck. | is also a shared bottleneck. | |||
3. From measurements: e.g. by considering correlations among | 3. From measurements: e.g. by considering correlations among | |||
measured delay and loss as an indication of a shared bottleneck. | measured delay and loss as an indication of a shared bottleneck. | |||
The methods above have some essential trade-offs: e.g., multiplexing | The methods above have some essential trade-offs: e.g., multiplexing | |||
is a completely reliable measure, however it is limited in scope to | is a completely reliable measure, however it is limited in scope to | |||
two end points (i.e., it cannot be applied to couple congestion | two end points (i.e., it cannot be applied to couple congestion | |||
skipping to change at page 7, line 22 ¶ | skipping to change at page 7, line 36 ¶ | |||
[I-D.ietf-rmcat-sbd] for details). Using system configuration to | [I-D.ietf-rmcat-sbd] for details). Using system configuration to | |||
decide about shared bottlenecks can be more efficient (faster to | decide about shared bottlenecks can be more efficient (faster to | |||
obtain) than using measurements, but it relies on assumptions about | obtain) than using measurements, but it relies on assumptions about | |||
the network environment. | the network environment. | |||
5.2. FSE | 5.2. FSE | |||
The FSE contains a list of all flows that have registered with it. | The FSE contains a list of all flows that have registered with it. | |||
For each flow, it stores the following: | For each flow, it stores the following: | |||
o a unique flow number to identify the flow | o a unique flow number f to identify the flow. | |||
o the FGI of the FG that it belongs to (based on the definitions in | o the FGI of the FG that it belongs to (based on the definitions in | |||
this document, a flow has only one bottleneck, and can therefore | this document, a flow has only one bottleneck, and can therefore | |||
be in only one FG) | be in only one FG). | |||
o a priority P, which here is assumed to be represented as a | o a priority P(f), which is a positive number, greater than zero. | |||
floating point number in the range from 0.1 (unimportant) to 1 | ||||
(very important). | ||||
o The rate used by the flow in bits per second, FSE_R. | o The rate used by the flow in bits per second, FSE_R(f). | |||
Note that the priority does not need to be a floating point value and | Note that the absolute range of priorities does not matter: the | |||
its value range does not matter for this algorithm: the algorithm | algorithm works with a flow's priority portion of the sum of all | |||
works with a flow's priority portion of the sum of all priority | priority values. For example, if there are two flows, flow 1 with | |||
values. Priorities can therefore be mapped to the "very-low", "low", | priority 1 and flow 2 with priority 2, the sum of the priorities is | |||
"medium" or "high" priority levels described in | 3. Then, flow 1 will be assigned 1/3 of the aggregate sending rate | |||
[I-D.ietf-rtcweb-transports] using the values 1, 2, 4 and 8, | and flow 2 will be assigned 2/3 of the aggregate sending rate. | |||
respectively. | ||||
Priorities can be mapped to the "very-low", "low", "medium" or "high" | ||||
priority levels described in [I-D.ietf-rtcweb-transports] by simply | ||||
using the values 1, 2, 4 and 8, respectively. | ||||
In the FSE, each FG contains one static variable S_CR which is the | In the FSE, each FG contains one static variable S_CR which is the | |||
sum of the calculated rates of all flows in the same FG. This value | sum of the calculated rates of all flows in the same FG. This value | |||
is used to calculate the sending rate. | is used to calculate the sending rate. | |||
The information listed here is enough to implement the sample flow | The information listed here is enough to implement the sample flow | |||
algorithm given below. FSE implementations could easily be extended | algorithm given below. FSE implementations could easily be extended | |||
to store, e.g., a flow's current sending rate for statistics | to store, e.g., a flow's current sending rate for statistics | |||
gathering or future potential optimizations. | gathering or future potential optimizations. | |||
skipping to change at page 8, line 20 ¶ | skipping to change at page 8, line 33 ¶ | |||
sending rate. Via UPDATE, they provide the newly calculated rate and | sending rate. Via UPDATE, they provide the newly calculated rate and | |||
optionally (if the algorithm supports it) the desired rate. The | optionally (if the algorithm supports it) the desired rate. The | |||
desired rate is less than the calculated rate in case of application- | desired rate is less than the calculated rate in case of application- | |||
limited flows; otherwise, it is the same as the calculated rate. | limited flows; otherwise, it is the same as the calculated rate. | |||
Below, two example algorithms are described. While other algorithms | Below, two example algorithms are described. While other algorithms | |||
could be used instead, the same algorithm must be applied to all | could be used instead, the same algorithm must be applied to all | |||
flows. Names of variables used in the algorithms are explained | flows. Names of variables used in the algorithms are explained | |||
below. | below. | |||
o CC_R - The rate received from a flow's congestion controller when | o CC_R(f) - The rate received from the congestion controller of flow | |||
it calls UPDATE. | f when it calls UPDATE. | |||
o FSE_R - The rate calculated by the FSE for a flow. | o FSE_R(f) - The rate calculated by the FSE for flow f. | |||
o S_CR - The sum of the calculated rates of all flows in the same | o S_CR - The sum of the calculated rates of all flows in the same | |||
FG; this value is used to calculate the sending rate. | FG; this value is used to calculate the sending rate. | |||
o FG - A group of flows having the same FGI, and hence sharing the | o FG - A group of flows having the same FGI, and hence sharing the | |||
same bottleneck. | same bottleneck. | |||
o P - The priority of a flow which is received from the flow's | o P(f) - The priority of flow f which is received from the flow's | |||
congestion controller; the FSE uses this variable for calculating | congestion controller; the FSE uses this variable for calculating | |||
FSE R. | FSE_R(f). | |||
o S_P - The sum of all the priorities. | o S_P - The sum of all the priorities. | |||
5.3.1. Example algorithm 1 - Active FSE | 5.3.1. Example algorithm 1 - Active FSE | |||
This algorithm was designed to be the simplest possible method to | This algorithm was designed to be the simplest possible method to | |||
assign rates according to the priorities of flows. Simulations | assign rates according to the priorities of flows. Simulations | |||
results in [fse] indicate that it does however not significantly | results in [fse] indicate that it does however not significantly | |||
reduce queuing delay and packet loss. | reduce queuing delay and packet loss. | |||
(1) When a flow f starts, it registers itself with SBD and the FSE. | (1) When a flow f starts, it registers itself with SBD and the FSE. | |||
FSE_R is initialized with the congestion controller's initial | FSE_R(f) is initialized with the congestion controller's initial | |||
rate. SBD will assign the correct FGI. When a flow is assigned | rate. SBD will assign the correct FGI. When a flow is assigned | |||
an FGI, it adds its FSE_R to S_CR. | an FGI, it adds its FSE_R(f) to S_CR. | |||
(2) When a flow f stops or pauses, its entry is removed from the | (2) When a flow f stops or pauses, its entry is removed from the | |||
list. | list. | |||
(3) Every time the congestion controller of the flow f determines a | (3) Every time the congestion controller of the flow f determines a | |||
new sending rate CC_R, the flow calls UPDATE, which carries out | new sending rate CC_R(f), the flow calls UPDATE, which carries | |||
the tasks listed below to derive the new sending rates for all | out the tasks listed below to derive the new sending rates for | |||
the flows in the FG. A flow's UPDATE function uses a local | all the flows in the FG. A flow's UPDATE function uses a local | |||
(i.e. per-flow) temporary variable S_P, which is the sum of all | (i.e. per-flow) temporary variable S_P, which is the sum of all | |||
the priorities. | the priorities. | |||
(a) It updates S_CR. | (a) It updates S_CR. | |||
S_CR = S_CR + CC_R - FSE_R(f) | S_CR = S_CR + CC_R(f) - FSE_R(f) | |||
(b) It calculates the sum of all the priorities, S_P. | (b) It calculates the sum of all the priorities, S_P. | |||
S_P = 0 | S_P = 0 | |||
for all flows i in FG do | for all flows i in FG do | |||
S_P = S_P + P(i) | S_P = S_P + P(i) | |||
end for | end for | |||
(c) It calculates the sending rates for all the flows in an FG | (c) It calculates the sending rates for all the flows in an FG | |||
and distributes them. | and distributes them. | |||
skipping to change at page 9, line 39 ¶ | skipping to change at page 10, line 13 ¶ | |||
end for | end for | |||
5.3.2. Example algorithm 2 - Conservative Active FSE | 5.3.2. Example algorithm 2 - Conservative Active FSE | |||
This algorithm extends algorithm 1 to conservatively emulate the | This algorithm extends algorithm 1 to conservatively emulate the | |||
behavior of a single flow by proportionally reducing the aggregate | behavior of a single flow by proportionally reducing the aggregate | |||
rate on congestion. Simulations results in [fse] indicate that it | rate on congestion. Simulations results in [fse] indicate that it | |||
can significantly reduce queuing delay and packet loss. | can significantly reduce queuing delay and packet loss. | |||
(1) When a flow f starts, it registers itself with SBD and the FSE. | (1) When a flow f starts, it registers itself with SBD and the FSE. | |||
FSE_R is initialized with the congestion controller's initial | FSE_R(f) is initialized with the congestion controller's initial | |||
rate. SBD will assign the correct FGI. When a flow is assigned | rate. SBD will assign the correct FGI. When a flow is assigned | |||
an FGI, it adds its FSE_R to S_CR. | an FGI, it adds its FSE_R(f) to S_CR. | |||
(2) When a flow f stops or pauses, its entry is removed from the | (2) When a flow f stops or pauses, its entry is removed from the | |||
list. | list. | |||
(3) Every time the congestion controller of the flow f determines a | (3) Every time the congestion controller of the flow f determines a | |||
new sending rate CC_R, the flow calls UPDATE, which carries out | new sending rate CC_R(f), the flow calls UPDATE, which carries | |||
the tasks listed below to derive the new sending rates for all | out the tasks listed below to derive the new sending rates for | |||
the flows in the FG. A flow's UPDATE function uses a local | all the flows in the FG. A flow's UPDATE function uses a local | |||
(i.e. per-flow) temporary variable S_P, which is the sum of all | (i.e. per-flow) temporary variable S_P, which is the sum of all | |||
the priorities, and a local variable DELTA, which is used to | the priorities, and a local variable DELTA, which is used to | |||
calculate the difference between CC_R and the previously stored | calculate the difference between CC_R(f) and the previously | |||
FSE_R. To prevent flows from either ignoring congestion or | stored FSE_R(f). To prevent flows from either ignoring | |||
overreacting, a timer keeps them from changing their rates | congestion or overreacting, a timer keeps them from changing | |||
immediately after the common rate reduction that follows a | their rates immediately after the common rate reduction that | |||
congestion event. This timer is set to 2 RTTs of the flow that | follows a congestion event. This timer is set to 2 RTTs of the | |||
experienced congestion because it is assumed that a congestion | flow that experienced congestion because it is assumed that a | |||
event can persist for up to one RTT of that flow, with another | congestion event can persist for up to one RTT of that flow, | |||
RTT added to compensate for fluctuations in the measured RTT | with another RTT added to compensate for fluctuations in the | |||
value. | measured RTT value. | |||
(a) It updates S_CR based on DELTA. | (a) It updates S_CR based on DELTA. | |||
if Timer has expired or not set then | if Timer has expired or not set then | |||
DELTA = CC_R - FSE_R(f) | DELTA = CC_R(f) - FSE_R(f) | |||
if DELTA < 0 then // Reduce S_CR proportionally | if DELTA < 0 then // Reduce S_CR proportionally | |||
S_CR = S_CR * CC_R / FSE_R(f) | S_CR = S_CR * CC_R(f) / FSE_R(f) | |||
Set Timer for 2 RTTs | Set Timer for 2 RTTs | |||
else | else | |||
S_CR = S_CR + DELTA | S_CR = S_CR + DELTA | |||
end if | end if | |||
end if | end if | |||
(b) It calculates the sum of all the priorities, S_P. | (b) It calculates the sum of all the priorities, S_P. | |||
S_P = 0 | S_P = 0 | |||
for all flows i in FG do | for all flows i in FG do | |||
skipping to change at page 12, line 17 ¶ | skipping to change at page 12, line 33 ¶ | |||
The algorithm described in this memo has so far been evaluated using | The algorithm described in this memo has so far been evaluated using | |||
simulations covering all the tests for more than one flow from | simulations covering all the tests for more than one flow from | |||
[I-D.ietf-rmcat-eval-test] (see [IETF-93], [IETF-94]). Experiments | [I-D.ietf-rmcat-eval-test] (see [IETF-93], [IETF-94]). Experiments | |||
should confirm these results using at least the NADA congestion | should confirm these results using at least the NADA congestion | |||
control algorithm with real-life code (e.g., browsers communicating | control algorithm with real-life code (e.g., browsers communicating | |||
over an emulated network covering the conditions in | over an emulated network covering the conditions in | |||
[I-D.ietf-rmcat-eval-test]. The tests with real-life code should be | [I-D.ietf-rmcat-eval-test]. The tests with real-life code should be | |||
repeated afterwards in real network environments and monitored. | repeated afterwards in real network environments and monitored. | |||
Experiments should investigate cases where the media coder's output | Experiments should investigate cases where the media coder's output | |||
rate is below the rate that is calculated by the coupling algorithm | rate is below the rate that is calculated by the coupling algorithm | |||
(FSE_R in algorithms 1 and 2, section 5.3). Implementers and testers | (FSE_R(i) in algorithms 1 and 2, section 5.3). Implementers and | |||
are invited to document their findings in an Internet draft. | testers are invited to document their findings in an Internet draft. | |||
8. Acknowledgements | 8. Acknowledgements | |||
This document has benefitted from discussions with and feedback from | This document has benefitted from discussions with and feedback from | |||
Andreas Petlund, Anna Brunstrom, David Hayes, David Ros (who also | Andreas Petlund, Anna Brunstrom, Colin Perkins, David Hayes, David | |||
gave the FSE its name), Ingemar Johansson, Karen Nielsen, Kristian | Ros (who also gave the FSE its name), Ingemar Johansson, Karen | |||
Hiorth, Mirja Kuehlewind, Martin Stiemerling, Varun Singh, Xiaoqing | Nielsen, Kristian Hiorth, Mirja Kuehlewind, Martin Stiemerling, Varun | |||
Zhu, and Zaheduzzaman Sarker. The authors would like to especially | Singh, Xiaoqing Zhu, and Zaheduzzaman Sarker. The authors would like | |||
thank Xiaoqing Zhu and Stefan Holmer for helping with NADA and GCC. | to especially thank Xiaoqing Zhu and Stefan Holmer for helping with | |||
NADA and GCC. | ||||
This work was partially funded by the European Community under its | This work was partially funded by the European Community under its | |||
Seventh Framework Programme through the Reducing Internet Transport | Seventh Framework Programme through the Reducing Internet Transport | |||
Latency (RITE) project (ICT-317700). | Latency (RITE) project (ICT-317700). | |||
9. IANA Considerations | 9. IANA Considerations | |||
This memo includes no request to IANA. | This memo includes no request to IANA. | |||
10. Security Considerations | 10. Security Considerations | |||
skipping to change at page 13, line 22 ¶ | skipping to change at page 13, line 39 ¶ | |||
a fair allocation in which the priority mechanism is implicitly | a fair allocation in which the priority mechanism is implicitly | |||
eliminated, and no major harm is done. | eliminated, and no major harm is done. | |||
11. References | 11. References | |||
11.1. Normative References | 11.1. Normative References | |||
[I-D.ietf-rmcat-nada] | [I-D.ietf-rmcat-nada] | |||
Zhu, X., Pan, R., Ramalho, M., Cruz, S., Jones, P., Fu, | Zhu, X., Pan, R., Ramalho, M., Cruz, S., Jones, P., Fu, | |||
J., D'Aronco, S., and C. Ganzhorn, "NADA: A Unified | J., D'Aronco, S., and C. Ganzhorn, "NADA: A Unified | |||
Congestion Control Scheme for Real-Time Media", | Congestion Control Scheme for Real-Time Media", draft- | |||
draft-ietf-rmcat-nada-03 (work in progress), | ietf-rmcat-nada-03 (work in progress), September 2016. | |||
September 2016. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/ | Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/ | |||
RFC2119, March 1997, | RFC2119, March 1997, | |||
<http://www.rfc-editor.org/info/rfc2119>. | <http://www.rfc-editor.org/info/rfc2119>. | |||
[RFC3124] Balakrishnan, H. and S. Seshan, "The Congestion Manager", | [RFC3124] Balakrishnan, H. and S. Seshan, "The Congestion Manager", | |||
RFC 3124, DOI 10.17487/RFC3124, June 2001, | RFC 3124, DOI 10.17487/RFC3124, June 2001, | |||
<http://www.rfc-editor.org/info/rfc3124>. | <http://www.rfc-editor.org/info/rfc3124>. | |||
[RFC5348] Floyd, S., Handley, M., Padhye, J., and J. Widmer, "TCP | [RFC5348] Floyd, S., Handley, M., Padhye, J., and J. Widmer, "TCP | |||
Friendly Rate Control (TFRC): Protocol Specification", | Friendly Rate Control (TFRC): Protocol Specification", RFC | |||
RFC 5348, DOI 10.17487/RFC5348, September 2008, | 5348, DOI 10.17487/RFC5348, September 2008, | |||
<http://www.rfc-editor.org/info/rfc5348>. | <http://www.rfc-editor.org/info/rfc5348>. | |||
11.2. Informative References | 11.2. Informative References | |||
[anrw2016] | ||||
Islam, S. and M. Welzl, "Start Me Up:Determining and | ||||
Sharing TCP's Initial Congestion Window", ACM, IRTF, ISOC | ||||
Applied Networking Research Workshop 2016 (ANRW 2016) , | ||||
2016. | ||||
[fse] Islam, S., Welzl, M., Gjessing, S., and N. Khademi, | ||||
"Coupled Congestion Control for RTP Media", ACM SIGCOMM | ||||
Capacity Sharing Workshop (CSWS 2014) and ACM SIGCOMM CCR | ||||
44(4) 2014; extended version available as a technical | ||||
report from | ||||
http://safiquli.at.ifi.uio.no/paper/fse-tech-report.pdf , | ||||
2014. | ||||
[fse-noms] | ||||
Islam, S., Welzl, M., Hayes, D., and S. Gjessing, | ||||
"Managing Real-Time Media Flows through a Flow State | ||||
Exchange", IEEE NOMS 2016, Istanbul, Turkey , 2016. | ||||
[I-D.ietf-rmcat-eval-test] | [I-D.ietf-rmcat-eval-test] | |||
Sarker, Z., Singh, V., Zhu, X., and M. Ramalho, "Test | Sarker, Z., Singh, V., Zhu, X., and M. Ramalho, "Test | |||
Cases for Evaluating RMCAT Proposals", | Cases for Evaluating RMCAT Proposals", draft-ietf-rmcat- | |||
draft-ietf-rmcat-eval-test-04 (work in progress), | eval-test-04 (work in progress), October 2016. | |||
October 2016. | ||||
[I-D.ietf-rmcat-gcc] | [I-D.ietf-rmcat-gcc] | |||
Holmer, S., Lundin, H., Carlucci, G., Cicco, L., and S. | Holmer, S., Lundin, H., Carlucci, G., Cicco, L., and S. | |||
Mascolo, "A Google Congestion Control Algorithm for Real- | Mascolo, "A Google Congestion Control Algorithm for Real- | |||
Time Communication", draft-ietf-rmcat-gcc-02 (work in | Time Communication", draft-ietf-rmcat-gcc-02 (work in | |||
progress), July 2016. | progress), July 2016. | |||
[I-D.ietf-rmcat-sbd] | [I-D.ietf-rmcat-sbd] | |||
Hayes, D., Ferlin, S., Welzl, M., and K. Hiorth, "Shared | Hayes, D., Ferlin, S., Welzl, M., and K. Hiorth, "Shared | |||
Bottleneck Detection for Coupled Congestion Control for | Bottleneck Detection for Coupled Congestion Control for | |||
RTP Media.", draft-ietf-rmcat-sbd-04 (work in progress), | RTP Media.", draft-ietf-rmcat-sbd-04 (work in progress), | |||
March 2016. | March 2016. | |||
[I-D.ietf-rtcweb-transports] | [I-D.ietf-rtcweb-transports] | |||
Alvestrand, H., "Transports for WebRTC", | Alvestrand, H., "Transports for WebRTC", Internet-draft | |||
draft-ietf-rtcweb-transports-11.txt (work in progress), | draft-ietf-rtcweb-transports-17.txt, October 2016. | |||
January 2016. | ||||
[IETF-93] Islam, S., Welzl, M., and S. Gjessing, "Updates on Coupled | [IETF-93] Islam, S., Welzl, M., and S. Gjessing, "Updates on Coupled | |||
Congestion Control for RTP Media", July 2015, | Congestion Control for RTP Media", July 2015, | |||
<https://www.ietf.org/proceedings/93/rmcat.html>. | <https://www.ietf.org/proceedings/93/rmcat.html>. | |||
[IETF-94] Islam, S., Welzl, M., and S. Gjessing, "Updates on Coupled | [IETF-94] Islam, S., Welzl, M., and S. Gjessing, "Updates on Coupled | |||
Congestion Control for RTP Media", November 2015, | Congestion Control for RTP Media", November 2015, | |||
<https://www.ietf.org/proceedings/94/rmcat.html>. | <https://www.ietf.org/proceedings/94/rmcat.html>. | |||
[RFC7478] Holmberg, C., Hakansson, S., and G. Eriksson, "Web Real- | [RFC7478] Holmberg, C., Hakansson, S., and G. Eriksson, "Web Real- | |||
Time Communication Use Cases and Requirements", RFC 7478, | Time Communication Use Cases and Requirements", RFC 7478, | |||
DOI 10.17487/RFC7478, March 2015, | DOI 10.17487/RFC7478, March 2015, | |||
<http://www.rfc-editor.org/info/rfc7478>. | <http://www.rfc-editor.org/info/rfc7478>. | |||
[anrw2016] | [RFC7656] Lennox, J., Gross, K., Nandakumar, S., Salgueiro, G., and | |||
Islam, S. and M. Welzl, "Start Me Up:Determining and | B. Burman, Ed., "A Taxonomy of Semantics and Mechanisms | |||
Sharing TCP's Initial Congestion Window", ACM, IRTF, ISOC | for Real-Time Transport Protocol (RTP) Sources", RFC 7656, | |||
Applied Networking Research Workshop 2016 (ANRW 2016) , | DOI 10.17487/RFC7656, November 2015, | |||
2016. | <http://www.rfc-editor.org/info/rfc7656>. | |||
[fse] Islam, S., Welzl, M., Gjessing, S., and N. Khademi, | ||||
"Coupled Congestion Control for RTP Media", ACM SIGCOMM | ||||
Capacity Sharing Workshop (CSWS 2014) and ACM SIGCOMM CCR | ||||
44(4) 2014; extended version available as a technical | ||||
report from | ||||
http://safiquli.at.ifi.uio.no/paper/fse-tech-report.pdf , | ||||
2014. | ||||
[fse-noms] | ||||
Islam, S., Welzl, M., Hayes, D., and S. Gjessing, | ||||
"Managing Real-Time Media Flows through a Flow State | ||||
Exchange", IEEE NOMS 2016, Istanbul, Turkey , 2016. | ||||
[rtcweb-rtp-usage] | [rtcweb-rtp-usage] | |||
Perkins, C., Westerlund, M., and J. Ott, "Web Real-Time | Perkins, C., Westerlund, M., and J. Ott, "Web Real-Time | |||
Communication (WebRTC): Media Transport and Use of RTP", | Communication (WebRTC): Media Transport and Use of RTP", | |||
draft-ietf-rtcweb-rtp-usage-26.txt (work in progress), | Internet-draft draft-ietf-rtcweb-rtp-usage-26.txt, March | |||
March 2016. | 2016. | |||
[transport-multiplex] | [transport-multiplex] | |||
Westerlund, M. and C. Perkins, "Multiple RTP Sessions on a | Westerlund, M. and C. Perkins, "Multiple RTP Sessions on a | |||
Single Lower-Layer Transport", | Single Lower-Layer Transport", Internet-draft draft- | |||
draft-westerlund-avtcore-transport-multiplexing-07.txt | westerlund-avtcore-transport-multiplexing-07.txt, October | |||
(work in progress), October 2013. | 2013. | |||
Appendix A. Application to GCC | Appendix A. Application to GCC | |||
Google Congestion Control (GCC) [I-D.ietf-rmcat-gcc] is another | Google Congestion Control (GCC) [I-D.ietf-rmcat-gcc] is another | |||
congestion control scheme for RTP flows that is under development. | congestion control scheme for RTP flows that is under development. | |||
GCC is not yet finalised, but at the time of this writing, the rate | GCC is not yet finalised, but at the time of this writing, the rate | |||
control of GCC employs two parts: controlling the bandwidth estimate | control of GCC employs two parts: controlling the bandwidth estimate | |||
based on delay, and controlling the bandwidth estimate based on loss. | based on delay, and controlling the bandwidth estimate based on loss. | |||
Both are designed to estimate the available bandwidth, A_hat. | Both are designed to estimate the available bandwidth, A_hat. | |||
skipping to change at page 16, line 8 ¶ | skipping to change at page 16, line 29 ¶ | |||
rate that should be used instead of the rate that the congestion | rate that should be used instead of the rate that the congestion | |||
controller has determined. This can make a passive algorithm easier | controller has determined. This can make a passive algorithm easier | |||
to implement; however, when round-trip times of flows are unequal, | to implement; however, when round-trip times of flows are unequal, | |||
shorter-RTT flows may (depending on the congestion control algorithm) | shorter-RTT flows may (depending on the congestion control algorithm) | |||
update and react to the overall FSE state more often than longer-RTT | update and react to the overall FSE state more often than longer-RTT | |||
flows, which can produce unwanted side effects. This problem is more | flows, which can produce unwanted side effects. This problem is more | |||
significant when the congestion control convergence depends on the | significant when the congestion control convergence depends on the | |||
RTT. While the passive algorithm works better for congestion | RTT. While the passive algorithm works better for congestion | |||
controls with RTT-independent convergence, it can still produce | controls with RTT-independent convergence, it can still produce | |||
oscillations on short time scales. The algorithm described below is | oscillations on short time scales. The algorithm described below is | |||
therefore considered as highly experimental. Results of a simplified | therefore considered as highly experimental and not safe to deploy | |||
passive FSE algorithm with both NADA and GCC can be found in | outside of testbed environments. Results of a simplified passive FSE | |||
[fse-noms]. | algorithm with both NADA and GCC can be found in [fse-noms]. | |||
This passive version of the FSE stores the following information in | This passive version of the FSE stores the following information in | |||
addition to the variables described in Section 5.2: | addition to the variables described in Section 5.2: | |||
o The desired rate DR. This can be smaller than the calculated rate | o The desired rate DR(f) of flow f. This can be smaller than the | |||
if the application feeding into the flow has less data to send | calculated rate if the application feeding into the flow has less | |||
than the congestion controller would allow. In case of a bulk | data to send than the congestion controller would allow. In case | |||
transfer, DR must be set to CC_R received from the flow's | of a bulk transfer, DR(f) must be set to CC_R(f) received from the | |||
congestion module. | congestion module of flow f. | |||
The passive version of the FSE contains one static variable per FG | The passive version of the FSE contains one static variable per FG | |||
called TLO (Total Leftover Rate -- used to let a flow 'take' | called TLO (Total Leftover Rate -- used to let a flow 'take' | |||
bandwidth from application-limited or terminated flows) which is | bandwidth from application-limited or terminated flows) which is | |||
initialized to 0. For the passive version, S_CR is limited to | initialized to 0. For the passive version, S_CR is limited to | |||
increase or decrease as conservatively as a flow's congestion | increase or decrease as conservatively as a flow's congestion | |||
controller decides in order to prohibit sudden rate jumps. | controller decides in order to prohibit sudden rate jumps. | |||
(1) When a flow f starts, it registers itself with SBD and the FSE. | (1) When a flow f starts, it registers itself with SBD and the FSE. | |||
FSE_R and DR are initialized with the congestion controller's | FSE_R(f) and DR(f) are initialized with the congestion | |||
initial rate. SBD will assign the correct FGI. When a flow is | controller's initial rate. SBD will assign the correct FGI. | |||
assigned an FGI, it adds its FSE_R to S_CR. | When a flow is assigned an FGI, it adds its FSE_R(f) to S_CR. | |||
(2) When a flow f stops or pauses, it sets its DR to 0 and sets P to | (2) When a flow f stops or pauses, it sets its DR(f) to 0 and sets | |||
-1. | P(f) to -1. | |||
(3) Every time the congestion controller of the flow f determines a | (3) Every time the congestion controller of the flow f determines a | |||
new sending rate CC_R, assuming the flow's new desired rate | new sending rate CC_R(f), assuming the flow's new desired rate | |||
new_DR to be "infinity" in case of a bulk data transfer with an | new_DR(f) to be "infinity" in case of a bulk data transfer with | |||
unknown maximum rate, the flow calls UPDATE, which carries out | an unknown maximum rate, the flow calls UPDATE, which carries | |||
the tasks listed below to derive the flow's new sending rate, | out the tasks listed below to derive the flow's new sending | |||
Rate. A flow's UPDATE function uses a few local (i.e. per-flow) | rate, Rate(f). A flow's UPDATE function uses a few local (i.e. | |||
temporary variables, which are all initialized to 0: DELTA, | per-flow) temporary variables, which are all initialized to 0: | |||
new_S_CR and S_P. | DELTA, new_S_CR and S_P. | |||
(a) For all the flows in its FG (including itself), it | (a) For all the flows in its FG (including itself), it | |||
calculates the sum of all the calculated rates, new_S_CR. | calculates the sum of all the calculated rates, new_S_CR. | |||
Then it calculates the difference between FSE_R(f) and | Then it calculates DELTA: the difference between FSE_R(f) | |||
CC_R, DELTA. | and CC_R(f). | |||
for all flows i in FG do | for all flows i in FG do | |||
new_S_CR = new_S_CR + FSE_R(i) | new_S_CR = new_S_CR + FSE_R(i) | |||
end for | end for | |||
DELTA = CC_R - FSE_R(f) | DELTA = CC_R(f) - FSE_R(f) | |||
(b) It updates S_CR, FSE_R(f) and DR(f). | (b) It updates S_CR, FSE_R(f) and DR(f). | |||
FSE_R(f) = CC_R | FSE_R(f) = CC_R(f) | |||
if DELTA > 0 then // the flow's rate has increased | if DELTA > 0 then // the flow's rate has increased | |||
S_CR = S_CR + DELTA | S_CR = S_CR + DELTA | |||
else if DELTA < 0 then | else if DELTA < 0 then | |||
S_CR = new_S_CR + DELTA | S_CR = new_S_CR + DELTA | |||
end if | end if | |||
DR(f) = min(new_DR,FSE_R(f)) | DR(f) = min(new_DR(f),FSE_R(f)) | |||
(c) It calculates the leftover rate TLO, removes the terminated | (c) It calculates the leftover rate TLO, removes the terminated | |||
flows from the FSE and calculates the sum of all the | flows from the FSE and calculates the sum of all the | |||
priorities, S_P. | priorities, S_P. | |||
for all flows i in FG do | for all flows i in FG do | |||
if P(i)<0 then | if P(i)<0 then | |||
delete flow | delete flow | |||
else | else | |||
S_P = S_P + P(i) | S_P = S_P + P(i) | |||
end if | end if | |||
end for | end for | |||
if DR(f) < FSE_R(f) then | if DR(f) < FSE_R(f) then | |||
TLO = TLO + (P(f)/S_P) * S_CR - DR(f)) | TLO = TLO + (P(f)/S_P) * S_CR - DR(f)) | |||
end if | end if | |||
(d) It calculates the sending rate, Rate. | (d) It calculates the sending rate, Rate(f). | |||
Rate = min(new_DR, (P(f)*S_CR)/S_P + TLO) | Rate(f) = min(new_DR(f), (P(f)*S_CR)/S_P + TLO) | |||
if Rate != new_DR and TLO > 0 then | if Rate(f) != new_DR(f) and TLO > 0 then | |||
TLO = 0 // f has 'taken' TLO | TLO = 0 // f has 'taken' TLO | |||
end if | end if | |||
(e) It updates DR(f) and FSE_R(f) with Rate. | (e) It updates DR(f) and FSE_R(f) with Rate(f). | |||
if Rate > DR(f) then | if Rate(f) > DR(f) then | |||
DR(f) = Rate | DR(f) = Rate(f) | |||
end if | end if | |||
FSE_R(f) = Rate | FSE_R(f) = Rate(f) | |||
The goals of the flow algorithm are to achieve prioritization, | The goals of the flow algorithm are to achieve prioritization, | |||
improve network utilization in the face of application-limited flows, | improve network utilization in the face of application-limited flows, | |||
and impose limits on the increase behavior such that the negative | and impose limits on the increase behavior such that the negative | |||
impact of multiple flows trying to increase their rate together is | impact of multiple flows trying to increase their rate together is | |||
minimized. It does that by assigning a flow a sending rate that may | minimized. It does that by assigning a flow a sending rate that may | |||
not be what the flow's congestion controller expected. It therefore | not be what the flow's congestion controller expected. It therefore | |||
builds on the assumption that no significant inefficiencies arise | builds on the assumption that no significant inefficiencies arise | |||
from temporary application-limited behavior or from quickly jumping | from temporary application-limited behavior or from quickly jumping | |||
to a rate that is higher than the congestion controller intended. | to a rate that is higher than the congestion controller intended. | |||
skipping to change at page 19, line 29 ¶ | skipping to change at page 20, line 17 ¶ | |||
| | | | | | | | | | | | | | | | |||
| 1 | 1 | 1 | 10 | 10 | 10 | | | 1 | 1 | 1 | 10 | 10 | 10 | | |||
| 2 | 1 | 0.5 | 1 | 1 | 1 | | | 2 | 1 | 0.5 | 1 | 1 | 1 | | |||
------------------------------------------ | ------------------------------------------ | |||
S_CR = 11, TLO = 0 | S_CR = 11, TLO = 0 | |||
Now assume that the first flow updates its rate to 8, because the | Now assume that the first flow updates its rate to 8, because the | |||
total sending rate of 11 exceeds the total capacity. Let us take a | total sending rate of 11 exceeds the total capacity. Let us take a | |||
closer look at what happens in step 3 of the flow algorithm. | closer look at what happens in step 3 of the flow algorithm. | |||
CC_R = 8. new_DR = infinity. | CC_R(1) = 8. new_DR(1) = infinity. | |||
3 a) new_S_CR = 11; DELTA = 8 - 10 = -2. | 3 a) new_S_CR = 11; DELTA = 8 - 10 = -2. | |||
3 b) FSE_Rf) = 8. DELTA is negative, hence S_CR = 9; | 3 b) FSE_R(1) = 8. DELTA is negative, hence S_CR = 9; | |||
DR(f) = 8. | DR(1) = 8. | |||
3 c) S_P = 1.5. | 3 c) S_P = 1.5. | |||
3 d) new sending rate = min(infinity, 1/1.5 * 9 + 0) = 6. | 3 d) new sending rate Rate(1) = min(infinity, 1/1.5 * 9 + 0) = 6. | |||
3 e) FSE_R(f) = 6. | 3 e) FSE_R(1) = 6. | |||
The resulting FSE looks as follows: | The resulting FSE looks as follows: | |||
------------------------------------------- | ------------------------------------------- | |||
| # | FGI | P | FSE_R | DR | Rate | | | # | FGI | P | FSE_R | DR | Rate | | |||
| | | | | | | | | | | | | | | | |||
| 1 | 1 | 1 | 6 | 8 | 6 | | | 1 | 1 | 1 | 6 | 8 | 6 | | |||
| 2 | 1 | 0.5 | 1 | 1 | 1 | | | 2 | 1 | 0.5 | 1 | 1 | 1 | | |||
------------------------------------------- | ------------------------------------------- | |||
S_CR = 9, TLO = 0 | S_CR = 9, TLO = 0 | |||
The effect is that flow #1 is sending with 6 Mbit/s instead of the 8 | The effect is that flow #1 is sending with 6 Mbit/s instead of the 8 | |||
Mbit/s that the congestion controller derived. Let us now assume | Mbit/s that the congestion controller derived. Let us now assume | |||
that flow #2 updates its rate. Its congestion controller detects | that flow #2 updates its rate. Its congestion controller detects | |||
that the network is not fully saturated (the actual total sending | that the network is not fully saturated (the actual total sending | |||
rate is 6+1=7) and increases its rate. | rate is 6+1=7) and increases its rate. | |||
CC_R=2. new_DR = infinity. | CC_R(2) = 2. new_DR(2) = infinity. | |||
3 a) new_S_CR = 7; DELTA = 2 - 1 = 1. | 3 a) new_S_CR = 7; DELTA = 2 - 1 = 1. | |||
3 b) FSE_R(f) = 2. DELTA is positive, hence S_CR = 9 + 1 = 10; | 3 b) FSE_R(2) = 2. DELTA is positive, hence S_CR = 9 + 1 = 10; | |||
DR(f) = 2. | DR(2) = 2. | |||
3 c) S_P = 1.5. | 3 c) S_P = 1.5. | |||
3 d) new sending rate = min(infinity, 0.5/1.5 * 10 + 0) = 3.33. | 3 d) Rate(2) = min(infinity, 0.5/1.5 * 10 + 0) = 3.33. | |||
3 e) DR(f) = FSE_R(f) = 3.33. | 3 e) DR(2) = FSE_R(2) = 3.33. | |||
The resulting FSE looks as follows: | The resulting FSE looks as follows: | |||
------------------------------------------- | ------------------------------------------- | |||
| # | FGI | P | FSE_R | DR | Rate | | | # | FGI | P | FSE_R | DR | Rate | | |||
| | | | | | | | | | | | | | | | |||
| 1 | 1 | 1 | 6 | 8 | 6 | | | 1 | 1 | 1 | 6 | 8 | 6 | | |||
| 2 | 1 | 0.5 | 3.33 | 3.33 | 3.33 | | | 2 | 1 | 0.5 | 3.33 | 3.33 | 3.33 | | |||
------------------------------------------- | ------------------------------------------- | |||
S_CR = 10, TLO = 0 | S_CR = 10, TLO = 0 | |||
The effect is that flow #2 is now sending with 3.33 Mbit/s, which is | The effect is that flow #2 is now sending with 3.33 Mbit/s, which is | |||
close to half of the rate of flow #1 and leads to a total utilization | close to half of the rate of flow #1 and leads to a total utilization | |||
of 6(#1) + 3.33(#2) = 9.33 Mbit/s. Flow #2's congestion controller | of 6(#1) + 3.33(#2) = 9.33 Mbit/s. Flow #2's congestion controller | |||
has increased its rate faster than the controller actually expected. | has increased its rate faster than the controller actually expected. | |||
Now, flow #1 updates its rate. Its congestion controller detects | Now, flow #1 updates its rate. Its congestion controller detects | |||
that the network is not fully saturated and increases its rate. | that the network is not fully saturated and increases its rate. | |||
Additionally, the application feeding into flow #1 limits the flow's | Additionally, the application feeding into flow #1 limits the flow's | |||
sending rate to at most 2 Mbit/s. | sending rate to at most 2 Mbit/s. | |||
CC_R=7. new_DR=2. | CC_R(1) = 7. new_DR(1) = 2. | |||
3 a) new_S_CR = 9.33; DELTA = 1. | 3 a) new_S_CR = 9.33; DELTA = 1. | |||
3 b) FSE_R(f) = 7, DELTA is positive, hence S_CR = 10 + 1 = 11; | 3 b) FSE_R(1) = 7, DELTA is positive, hence S_CR = 10 + 1 = 11; | |||
DR = min(2, 7) = 2. | DR(1) = min(2, 7) = 2. | |||
3 c) S_P = 1.5; DR(f) < FSE_R(f), hence TLO = 1/1.5 * 11 - 2 = 5.33. | 3 c) S_P = 1.5; DR(1) < FSE_R(1), hence TLO = 1/1.5 * 11 - 2 = 5.33. | |||
3 d) new sending rate = min(2, 1/1.5 * 11 + 5.33) = 2. | 3 d) Rate(1) = min(2, 1/1.5 * 11 + 5.33) = 2. | |||
3 e) FSE_R(f) = 2. | 3 e) FSE_R(1) = 2. | |||
The resulting FSE looks as follows: | The resulting FSE looks as follows: | |||
------------------------------------------- | ------------------------------------------- | |||
| # | FGI | P | FSE_R | DR | Rate | | | # | FGI | P | FSE_R | DR | Rate | | |||
| | | | | | | | | | | | | | | | |||
| 1 | 1 | 1 | 2 | 2 | 2 | | | 1 | 1 | 1 | 2 | 2 | 2 | | |||
| 2 | 1 | 0.5 | 3.33 | 3.33 | 3.33 | | | 2 | 1 | 0.5 | 3.33 | 3.33 | 3.33 | | |||
------------------------------------------- | ------------------------------------------- | |||
S_CR = 11, TLO = 5.33 | S_CR = 11, TLO = 5.33 | |||
Now, the total rate of the two flows is 2 + 3.33 = 5.33 Mbit/s, i.e. | Now, the total rate of the two flows is 2 + 3.33 = 5.33 Mbit/s, i.e. | |||
the network is significantly underutilized due to the limitation of | the network is significantly underutilized due to the limitation of | |||
flow #1. Flow #2 updates its rate. Its congestion controller | flow #1. Flow #2 updates its rate. Its congestion controller | |||
detects that the network is not fully saturated and increases its | detects that the network is not fully saturated and increases its | |||
rate. | rate. | |||
CC_R=4.33. new_DR = infinity. | CC_R(2) = 4.33. new_DR(2) = infinity. | |||
3 a) new_S_CR = 5.33; DELTA = 1. | 3 a) new_S_CR = 5.33; DELTA = 1. | |||
3 b) FSE_R(f) = 4.33. DELTA is positive, hence S_CR = 12; | 3 b) FSE_R(2) = 4.33. DELTA is positive, hence S_CR = 12; | |||
DR(f) = 4.33. | DR(2) = 4.33. | |||
3 c) S_P = 1.5. | 3 c) S_P = 1.5. | |||
3 d) new sending rate: min(infinity, 0.5/1.5 * 12 + 5.33 ) = 9.33. | 3 d) Rate(2) = min(infinity, 0.5/1.5 * 12 + 5.33 ) = 9.33. | |||
3 e) FSE_R(f) = 9.33, DR(f) = 9.33. | 3 e) FSE_R(2) = 9.33, DR(2) = 9.33. | |||
The resulting FSE looks as follows: | The resulting FSE looks as follows: | |||
------------------------------------------- | ------------------------------------------- | |||
| # | FGI | P | FSE_R | DR | Rate | | | # | FGI | P | FSE_R | DR | Rate | | |||
| | | | | | | | | | | | | | | | |||
| 1 | 1 | 1 | 2 | 2 | 2 | | | 1 | 1 | 1 | 2 | 2 | 2 | | |||
| 2 | 1 | 0.5 | 9.33 | 9.33 | 9.33 | | | 2 | 1 | 0.5 | 9.33 | 9.33 | 9.33 | | |||
------------------------------------------- | ------------------------------------------- | |||
S_CR = 12, TLO = 0 | S_CR = 12, TLO = 0 | |||
Now, the total rate of the two flows is 2 + 9.33 = 11.33 Mbit/s. | Now, the total rate of the two flows is 2 + 9.33 = 11.33 Mbit/s. | |||
Finally, flow #1 terminates. It sets P to -1 and DR to 0. Let us | Finally, flow #1 terminates. It sets P(1) to -1 and DR(1) to 0. Let | |||
assume that it terminated late enough for flow #2 to still experience | us assume that it terminated late enough for flow #2 to still | |||
the network in a congested state, i.e. flow #2 decreases its rate in | experience the network in a congested state, i.e. flow #2 decreases | |||
the next iteration. | its rate in the next iteration. | |||
CC_R = 7.33. new_DR = infinity. | CC_R(2) = 7.33. new_DR(2) = infinity. | |||
3 a) new_S_CR = 11.33; DELTA = -2. | 3 a) new_S_CR = 11.33; DELTA = -2. | |||
3 b) FSE_R(f) = 7.33. DELTA is negative, hence S_CR = 9.33; | 3 b) FSE_R(2) = 7.33. DELTA is negative, hence S_CR = 9.33; | |||
DR(f) = 7.33. | DR(2) = 7.33. | |||
3 c) Flow 1 has P = -1, hence it is deleted from the FSE. | 3 c) Flow 1 has P(1) = -1, hence it is deleted from the FSE. | |||
S_P = 0.5. | S_P = 0.5. | |||
3 d) new sending rate: min(infinity, 0.5/0.5*9.33 + 0) = 9.33. | 3 d) Rate(2) = min(infinity, 0.5/0.5*9.33 + 0) = 9.33. | |||
3 e) FSE_R(f) = DR(f) = 9.33. | 3 e) FSE_R(2) = DR(2) = 9.33. | |||
The resulting FSE looks as follows: | The resulting FSE looks as follows: | |||
------------------------------------------- | ------------------------------------------- | |||
| # | FGI | P | FSE_R | DR | Rate | | | # | FGI | P | FSE_R | DR | Rate | | |||
| | | | | | | | | | | | | | | | |||
| 2 | 1 | 0.5 | 9.33 | 9.33 | 9.33 | | | 2 | 1 | 0.5 | 9.33 | 9.33 | 9.33 | | |||
------------------------------------------- | ------------------------------------------- | |||
S_CR = 9.33, TLO = 0 | S_CR = 9.33, TLO = 0 | |||
Appendix D. Change log | Appendix D. Change log | |||
skipping to change at page 24, line 34 ¶ | skipping to change at page 25, line 21 ¶ | |||
o Changed several occurrences of "NADA and GCC" to "NADA", including | o Changed several occurrences of "NADA and GCC" to "NADA", including | |||
the abstract. | the abstract. | |||
o Moved the application to GCC to an appendix, and made the GCC | o Moved the application to GCC to an appendix, and made the GCC | |||
reference informative. | reference informative. | |||
o Provided a few more general recommendations on applying the | o Provided a few more general recommendations on applying the | |||
coupling algorithm. | coupling algorithm. | |||
D.2.7. Changes from -05 to -06 | ||||
o Incorporated comments by Colin Perkins. | ||||
Authors' Addresses | Authors' Addresses | |||
Safiqul Islam | Safiqul Islam | |||
University of Oslo | University of Oslo | |||
PO Box 1080 Blindern | PO Box 1080 Blindern | |||
Oslo, N-0316 | Oslo N-0316 | |||
Norway | Norway | |||
Phone: +47 22 84 08 37 | Phone: +47 22 84 08 37 | |||
Email: safiquli@ifi.uio.no | Email: safiquli@ifi.uio.no | |||
Michael Welzl | Michael Welzl | |||
University of Oslo | University of Oslo | |||
PO Box 1080 Blindern | PO Box 1080 Blindern | |||
Oslo, N-0316 | Oslo N-0316 | |||
Norway | Norway | |||
Phone: +47 22 85 24 20 | Phone: +47 22 85 24 20 | |||
Email: michawe@ifi.uio.no | Email: michawe@ifi.uio.no | |||
Stein Gjessing | Stein Gjessing | |||
University of Oslo | University of Oslo | |||
PO Box 1080 Blindern | PO Box 1080 Blindern | |||
Oslo, N-0316 | Oslo N-0316 | |||
Norway | Norway | |||
Phone: +47 22 85 24 44 | Phone: +47 22 85 24 44 | |||
Email: steing@ifi.uio.no | Email: steing@ifi.uio.no | |||
End of changes. 80 change blocks. | ||||
217 lines changed or deleted | 233 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |