[e2e] Observations on RFC 3448 (TFRC)
Dado Colussi
gdc at iki.fi
Tue Sep 28 06:10:13 PDT 2004
Hi folks,
I went through the RFC 3448 (TFRC) in quite detail recently and made
some observations I thought I might share here.
Section 4.4 Expiration of nofeedback timer:
<quote>
If (X_calc > 2*X_recv)
</quote>
X_calc can be computed only when p > 0. The given code
fragment assumes a valid X_calc.
Section 4.6 Scheduling of Packet Transmissions: on 4th line:
<quote>
course-grain
</quote>
Should be coarse-grain?
Section 5.5 History Discounting:
The elements from 1 to n of DF_i array are initialized to 1.
DF_0 is left uninitialized. It is, however, referred to in
the last code fragment when a new loss event occurs:
<quote>
for (i = n-1 to 0 step -1) {
DF_(i+1) = DF * DF_i
}
</quote>
DF_1 is set to DF_0 which is effectively a random value.
DF_0 is initialized to 0 only right after that. Thus, the
random value traverses through the DF_i array until discarded
after n loss events.
Section 6.2 Expiration of feedback timer, bullet 2:
<quote>
Calculate the measured receive rate, X_recv, based on the
packets received within the previous R_m seconds.
</quote>
Feedback is sent approximately once per round-trip time, if
data packet have been received since last feedback. If the
data rate is less than one packet per round-trip time,
feedback is sent only at "rounds" where data messages have
been received. However, X_calc is calculated over a R_m
seconds.
Now, if the data rate is less than one packet per round-trip
time, X_calc is calculated using one packet over a time frame
of R_m seconds. For a source sending a packet every fourth
round, the receiver calculates X_recv four times larger than
it really is.
How about calculating X_recv over the time between two
consecutive feedbacks?
Section 6.3 Receiver initialization:
<quote>
When the first packet is received:
...
o Set the feedback timer to expire after R_i seconds.
</quote>
In section 4.2 Sender initialization the sender's estimate
of round-trip time time is explicitly left undefined until
measured. Thus, the first packet contains an undefined
value as round-trip time estimate and the feedback timer
gets initialized to an undefined time.
I solved this by sending feedback for each packet until
the sender provided a valid estimate.
Section 6.3.1 Initializing the Loss History after the First Loss Event
<quote>
... the TFRC receiver calculates the loss interval that would
be required to produce the data rate X_recv, and uses this
synthetic loss interval to seed the loss history mechanism.
</quote>
The document is not being explicit how the seeding is done.
The NS-2 implementation appears to seed the first element of
the loss history array. I first interpreted this so that all
n elements are to be seeded.
Another issue that crossed my mind is related to ECN. What
if the very first packet contans ECN bit?
Best regards,
Dado
More information about the end2end-interest
mailing list