A Nice flow monitors round-trip delays, estimates the total queue size
at the bottleneck router, and signals congestion when this total queue
size exceeds a fraction of the estimated maximum queue capacity. Nice
uses , the minimum observed round trip time, as the estimate
of the round trip delay when queues are empty, and it uses
as
an estimate of the round trip time when the bottleneck queue is full.
If more than
of the packets Nice sends during a RTT
window encounter delays exceeding
, our detector signals congestion.
Round-trip delays of
packets are indicative of the current bottleneck queue size and the
threshold represents the fraction of the total queue capacity that
starts to trigger congestion.
The Nice congestion
avoidance mechanism incorporating the interference
trigger with threshold
and fraction
can be written as follows
(
is the round-trip delay experienced by each
packet):
per ack operation:
if (![]()
++;
per round operation:
if![]()
![]()
else {
... // Vegas congestion avoidance follows
}
Maintaining a window of less than one causes us to lose ack-clocking, but the flow continues to send at most as many packets into the network as it gets out. In this phase the packets act as network probes waiting for congestion to dissipate. By allowing the window to go below one, Nice retains the non-interference property even for a large number of flows. Both our analysis and our experiments confirm the importance of this feature: this optimization significantly reduces interference, particularly when testing against several background flows. A similar optimization has been suggested even for regular flows to handle cases when the number of flows starts to approach the bottleneck router buffer size [35].
When a Nice flow signals congestion, it halves its current congestion window. In contrast Vegas reduces its window by one packet each round that encounters long round trip times and only halves its window if packets are lost (falling back on Reno-like behavior.) The combination of more aggressive detection and more aggressive reaction may make it more difficult for Nice to maximize utilization of spare capacity, but our design goals lead us to minimize interference even at the potential cost of utilization. Our experimental results show that even with these aggressively timid policies, we achieve reasonable levels of utilization in practice.
As in TCP Vegas, maintaining running measures of and
have their limitations
- for example, if the network is in a state of persistent congestion, a
bad estimate of
is likely to be obtained. However, past
studies [1,44] have indicated
that a good estimate of the minimum round-trip
delay can typically be obtained in a short time; our experience supports this
claim.
The use of minimum and maximum values makes the prototype sensitive
to outliers. Using the first and ninety-ninth percentile values could
improve the robustness of this algorithm, but we have not tested this
optimization.
Route changes during a transfer can also contribute to
inaccuracies in RTT estimates. However such changes are
uncommon [40] and we speculate that they can be handled by
maintaining exponentially decaying averages for
and
estimates.