[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