%!PS-Adobe-3.0
%%BoundingBox: 24 24 588 768
%%Title: Enscript Output
%%For: Sally Floyd
%%Creator: GNU enscript 1.6.1
%%CreationDate: Sun Jan 26 18:15:30 2003
%%Orientation: Portrait
%%Pages: (atend)
%%DocumentMedia: Letter 612 792 0 () ()
%%DocumentNeededResources: (atend)
%%EndComments
%%BeginProlog
%%BeginResource: procset Enscript-Prolog 1.6 1
%
% Procedures.
%
/_S { % save current state
/_s save def
} def
/_R { % restore from saved state
_s restore
} def
/S { % showpage protecting gstate
gsave
showpage
grestore
} bind def
/MF { % fontname newfontname -> - make a new encoded font
/newfontname exch def
/fontname exch def
/fontdict fontname findfont def
/newfont fontdict maxlength dict def
fontdict {
exch
dup /FID eq {
% skip FID pair
pop pop
} {
% copy to the new font dictionary
exch newfont 3 1 roll put
} ifelse
} forall
newfont /FontName newfontname put
% insert only valid encoding vectors
encoding_vector length 256 eq {
newfont /Encoding encoding_vector put
} if
newfontname newfont definefont pop
} def
/SF { % fontname width height -> - set a new font
/height exch def
/width exch def
findfont
[width 0 0 height 0 0] makefont setfont
} def
/SUF { % fontname width height -> - set a new user font
/height exch def
/width exch def
/F-gs-user-font MF
/F-gs-user-font width height SF
} def
/M {moveto} bind def
/s {show} bind def
/Box { % x y w h -> - define box path
/d_h exch def /d_w exch def /d_y exch def /d_x exch def
d_x d_y moveto
d_w 0 rlineto
0 d_h rlineto
d_w neg 0 rlineto
closepath
} def
/bgs { % x y height blskip gray str -> - show string with bg color
/str exch def
/gray exch def
/blskip exch def
/height exch def
/y exch def
/x exch def
gsave
x y blskip sub str stringwidth pop height Box
gray setgray
fill
grestore
x y M str s
} def
% Highlight bars.
/highlight_bars { % nlines lineheight output_y_margin gray -> -
gsave
setgray
/ymarg exch def
/lineheight exch def
/nlines exch def
% This 2 is just a magic number to sync highlight lines to text.
0 d_header_y ymarg sub 2 sub translate
/cw d_output_w cols div def
/nrows d_output_h ymarg 2 mul sub lineheight div cvi def
% for each column
0 1 cols 1 sub {
cw mul /xp exch def
% for each rows
0 1 nrows 1 sub {
/rn exch def
rn lineheight mul neg /yp exch def
rn nlines idiv 2 mod 0 eq {
% Draw highlight bar. 4 is just a magic indentation.
xp 4 add yp cw 8 sub lineheight neg Box fill
} if
} for
} for
grestore
} def
% Line highlight bar.
/line_highlight { % x y width height gray -> -
gsave
/gray exch def
Box gray setgray fill
grestore
} def
% Column separator lines.
/column_lines {
gsave
.1 setlinewidth
0 d_footer_h translate
/cw d_output_w cols div def
1 1 cols 1 sub {
cw mul 0 moveto
0 d_output_h rlineto stroke
} for
grestore
} def
% Column borders.
/column_borders {
gsave
.1 setlinewidth
0 d_footer_h moveto
0 d_output_h rlineto
d_output_w 0 rlineto
0 d_output_h neg rlineto
closepath stroke
grestore
} def
% Do the actual underlay drawing
/draw_underlay {
ul_style 0 eq {
ul_str true charpath stroke
} {
ul_str show
} ifelse
} def
% Underlay
/underlay { % - -> -
gsave
0 d_page_h translate
d_page_h neg d_page_w atan rotate
ul_gray setgray
ul_font setfont
/dw d_page_h dup mul d_page_w dup mul add sqrt def
ul_str stringwidth pop dw exch sub 2 div ul_h_ptsize -2 div moveto
draw_underlay
grestore
} def
/user_underlay { % - -> -
gsave
ul_x ul_y translate
ul_angle rotate
ul_gray setgray
ul_font setfont
0 0 ul_h_ptsize 2 div sub moveto
draw_underlay
grestore
} def
% Page prefeed
/page_prefeed { % bool -> -
statusdict /prefeed known {
statusdict exch /prefeed exch put
} {
pop
} ifelse
} def
% Wrapped line markers
/wrapped_line_mark { % x y charwith charheight type -> -
/type exch def
/h exch def
/w exch def
/y exch def
/x exch def
type 2 eq {
% Black boxes (like TeX does)
gsave
0 setlinewidth
x w 4 div add y M
0 h rlineto w 2 div 0 rlineto 0 h neg rlineto
closepath fill
grestore
} {
type 3 eq {
% Small arrows
gsave
.2 setlinewidth
x w 2 div add y h 2 div add M
w 4 div 0 rlineto
x w 4 div add y lineto stroke
x w 4 div add w 8 div add y h 4 div add M
x w 4 div add y lineto
w 4 div h 8 div rlineto stroke
grestore
} {
% do nothing
} ifelse
} ifelse
} def
% EPSF import.
/BeginEPSF {
/b4_Inc_state save def % Save state for cleanup
/dict_count countdictstack def % Count objects on dict stack
/op_count count 1 sub def % Count objects on operand stack
userdict begin
/showpage { } def
0 setgray 0 setlinecap
1 setlinewidth 0 setlinejoin
10 setmiterlimit [ ] 0 setdash newpath
/languagelevel where {
pop languagelevel
1 ne {
false setstrokeadjust false setoverprint
} if
} if
} bind def
/EndEPSF {
count op_count sub { pos } repeat % Clean up stacks
countdictstack dict_count sub { end } repeat
b4_Inc_state restore
} bind def
% Check PostScript language level.
/languagelevel where {
pop /gs_languagelevel languagelevel def
} {
/gs_languagelevel 1 def
} ifelse
%%EndResource
%%BeginResource: procset Enscript-Encoding-88591 1.6 1
/encoding_vector [
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
/space /exclam /quotedbl /numbersign
/dollar /percent /ampersand /quoteright
/parenleft /parenright /asterisk /plus
/comma /hyphen /period /slash
/zero /one /two /three
/four /five /six /seven
/eight /nine /colon /semicolon
/less /equal /greater /question
/at /A /B /C
/D /E /F /G
/H /I /J /K
/L /M /N /O
/P /Q /R /S
/T /U /V /W
/X /Y /Z /bracketleft
/backslash /bracketright /asciicircum /underscore
/quoteleft /a /b /c
/d /e /f /g
/h /i /j /k
/l /m /n /o
/p /q /r /s
/t /u /v /w
/x /y /z /braceleft
/bar /braceright /tilde /.notdef
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
/space /exclamdown /cent /sterling
/currency /yen /brokenbar /section
/dieresis /copyright /ordfeminine /guillemotleft
/logicalnot /hyphen /registered /macron
/degree /plusminus /twosuperior /threesuperior
/acute /mu /paragraph /bullet
/cedilla /onesuperior /ordmasculine /guillemotright
/onequarter /onehalf /threequarters /questiondown
/Agrave /Aacute /Acircumflex /Atilde
/Adieresis /Aring /AE /Ccedilla
/Egrave /Eacute /Ecircumflex /Edieresis
/Igrave /Iacute /Icircumflex /Idieresis
/Eth /Ntilde /Ograve /Oacute
/Ocircumflex /Otilde /Odieresis /multiply
/Oslash /Ugrave /Uacute /Ucircumflex
/Udieresis /Yacute /Thorn /germandbls
/agrave /aacute /acircumflex /atilde
/adieresis /aring /ae /ccedilla
/egrave /eacute /ecircumflex /edieresis
/igrave /iacute /icircumflex /idieresis
/eth /ntilde /ograve /oacute
/ocircumflex /otilde /odieresis /divide
/oslash /ugrave /uacute /ucircumflex
/udieresis /yacute /thorn /ydieresis
] def
%%EndResource
%%EndProlog
%%BeginSetup
%%IncludeResource: font Courier-Bold
%%IncludeResource: font Courier
/HFpt_w 10 def
/HFpt_h 10 def
/Courier-Bold /HF-gs-font MF
/HF /HF-gs-font findfont [HFpt_w 0 0 HFpt_h 0 0] makefont def
/Courier /F-gs-font MF
/F-gs-font 10 10 SF
/#copies 1 def
% Pagedevice definitions:
gs_languagelevel 1 gt {
<<
/PageSize [612 792]
>> setpagedevice
} if
/d_page_w 564 def
/d_page_h 744 def
/d_header_x 0 def
/d_header_y 744 def
/d_header_w 564 def
/d_header_h 0 def
/d_footer_x 0 def
/d_footer_y 0 def
/d_footer_w 564 def
/d_footer_h 0 def
/d_output_w 564 def
/d_output_h 744 def
/cols 1 def
%%EndSetup
%%Page: (1) 1
%%BeginPageSetup
_S
24 24 translate
/pagenum 1 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 665 M
(Network Working Group M. Handley) s
5 654 M
(Request for Comments: 3448 S. Floyd) s
5 643 M
(Category: Standards Track ICIR) s
5 632 M
( J. Padhye) s
5 621 M
( Microsoft) s
5 610 M
( J. Widmer) s
5 599 M
( University of Mannheim) s
5 588 M
( January 2003) s
5 555 M
( TCP Friendly Rate Control \(TFRC\):) s
5 544 M
( Protocol Specification) s
5 522 M
(Status of this Memo) s
5 500 M
( This document specifies an Internet standards track protocol for the) s
5 489 M
( Internet community, and requests discussion and suggestions for) s
5 478 M
( improvements. Please refer to the current edition of the "Internet) s
5 467 M
( Official Protocol Standards" \(STD 1\) for the standardization state) s
5 456 M
( and status of this protocol. Distribution of this memo is unlimited.) s
5 434 M
(Copyright Notice) s
5 412 M
( Copyright \(C\) The Internet Society \(2003\). All Rights Reserved.) s
5 390 M
(Abstract) s
5 368 M
( This document specifies TCP-Friendly Rate Control \(TFRC\). TFRC is a) s
5 357 M
( congestion control mechanism for unicast flows operating in a best-) s
5 346 M
( effort Internet environment. It is reasonably fair when competing) s
5 335 M
( for bandwidth with TCP flows, but has a much lower variation of) s
5 324 M
( throughput over time compared with TCP, making it more suitable for) s
5 313 M
( applications such as telephony or streaming media where a relatively) s
5 302 M
( smooth sending rate is of importance.) s
5 280 M
(Table of Contents) s
5 258 M
( 1. Introduction. . . . . . . . . . . . . . . . . . . . . . 2) s
5 247 M
( 2. Terminology . . . . . . . . . . . . . . . . . . . . . . 3) s
5 236 M
( 3. Protocol Mechanism. . . . . . . . . . . . . . . . . . . 3) s
5 225 M
( 3.1. TCP Throughput Equation. . . . . . . . . . . . . . 4) s
5 214 M
( 3.2. Packet Contents. . . . . . . . . . . . . . . . . . 6) s
5 203 M
( 3.2.1. Data Packets. . . . . . . . . . . . . . . . 6) s
5 192 M
( 3.2.2. Feedback Packets. . . . . . . . . . . . . . 7) s
5 181 M
( 4. Data Sender Protocol. . . . . . . . . . . . . . . . . . 7) s
5 170 M
( 4.1. Measuring the Packet Size. . . . . . . . . . . . . 8) s
5 159 M
( 4.2. Sender Initialization. . . . . . . . . . . . . . . 8) s
5 104 M
(Handley, et. al. Standards Track [Page 1]) s
_R
S
%%Page: (2) 2
%%BeginPageSetup
_S
24 24 translate
/pagenum 2 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( 4.3. Sender behavior when a feedback packet is) s
5 676 M
( received. . . . . . . . . . . . . .. . . . . . . . 8) s
5 665 M
( 4.4. Expiration of nofeedback timer . . . . . . . . . . 9) s
5 654 M
( 4.5. Preventing Oscillations. . . . . . . . . . . . . . 10) s
5 643 M
( 4.6. Scheduling of Packet Transmissions . . . . . . . . 11) s
5 632 M
( 5. Calculation of the Loss Event Rate \(p\). . . . . . . . . 12) s
5 621 M
( 5.1. Detection of Lost or Marked Packets. . . . . . . . 12) s
5 610 M
( 5.2. Translation from Loss History to Loss Events . . . 13) s
5 599 M
( 5.3. Inter-loss Event Interval. . . . . . . . . . . . . 14) s
5 588 M
( 5.4. Average Loss Interval. . . . . . . . . . . . . . . 14) s
5 577 M
( 5.5. History Discounting. . . . . . . . . . . . . . . . 15) s
5 566 M
( 6. Data Receiver Protocol. . . . . . . . . . . . . . . . . 17) s
5 555 M
( 6.1. Receiver behavior when a data packet is) s
5 544 M
( received . . . . . . . . . . . . . . . . . . . . . 18) s
5 533 M
( 6.2. Expiration of feedback timer . . . . . . . . . . . 18) s
5 522 M
( 6.3. Receiver initialization. . . . . . . . . . . . . . 19) s
5 511 M
( 6.3.1. Initializing the Loss History after the) s
5 500 M
( First Loss Event . . . . . . . . . . . . . 19) s
5 489 M
( 7. Sender-based Variants . . . . . . . . . . . . . . . . . 20) s
5 478 M
( 8. Implementation Issues . . . . . . . . . . . . . . . . . 20) s
5 467 M
( 9. Security Considerations . . . . . . . . . . . . . . . . 21) s
5 456 M
( 10. IANA Considerations . . . . . . . . . . . . . . . . . . 22) s
5 445 M
( 11. Acknowledgments . . . . . . . . . . . . . . . . . . . . 22) s
5 434 M
( 12. Non-Normative References. . . . . . . . . . . . . . . . 22) s
5 423 M
( 13. Authors' Addresses. . . . . . . . . . . . . . . . . . . 23) s
5 412 M
( 14. Full Copyright Statement. . . . . . . . . . . . . . . . 24) s
5 390 M
(1. Introduction) s
5 368 M
( This document specifies TCP-Friendly Rate Control \(TFRC\). TFRC is a) s
5 357 M
( congestion control mechanism designed for unicast flows operating in) s
5 346 M
( an Internet environment and competing with TCP traffic [2]. Instead) s
5 335 M
( of specifying a complete protocol, this document simply specifies a) s
5 324 M
( congestion control mechanism that could be used in a transport) s
5 313 M
( protocol such as RTP [7], in an application incorporating end-to-end) s
5 302 M
( congestion control at the application level, or in the context of) s
5 291 M
( endpoint congestion management [1]. This document does not discuss) s
5 280 M
( packet formats or reliability. Implementation-related issues are) s
5 269 M
( discussed only briefly, in Section 8.) s
5 247 M
( TFRC is designed to be reasonably fair when competing for bandwidth) s
5 236 M
( with TCP flows, where a flow is "reasonably fair" if its sending rate) s
5 225 M
( is generally within a factor of two of the sending rate of a TCP flow) s
5 214 M
( under the same conditions. However, TFRC has a much lower variation) s
5 203 M
( of throughput over time compared with TCP, which makes it more) s
5 192 M
( suitable for applications such as telephony or streaming media where) s
5 181 M
( a relatively smooth sending rate is of importance.) s
5 126 M
(Handley, et. al. Standards Track [Page 2]) s
_R
S
%%Page: (3) 3
%%BeginPageSetup
_S
24 24 translate
/pagenum 3 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( The penalty of having smoother throughput than TCP while competing) s
5 676 M
( fairly for bandwidth is that TFRC responds slower than TCP to changes) s
5 665 M
( in available bandwidth. Thus TFRC should only be used when the) s
5 654 M
( application has a requirement for smooth throughput, in particular,) s
5 643 M
( avoiding TCP's halving of the sending rate in response to a single) s
5 632 M
( packet drop. For applications that simply need to transfer as much) s
5 621 M
( data as possible in as short a time as possible we recommend using) s
5 610 M
( TCP, or if reliability is not required, using an Additive-Increase,) s
5 599 M
( Multiplicative-Decrease \(AIMD\) congestion control scheme with similar) s
5 588 M
( parameters to those used by TCP.) s
5 566 M
( TFRC is designed for applications that use a fixed packet size, and) s
5 555 M
( vary their sending rate in packets per second in response to) s
5 544 M
( congestion. Some audio applications require a fixed interval of time) s
5 533 M
( between packets and vary their packet size instead of their packet) s
5 522 M
( rate in response to congestion. The congestion control mechanism in) s
5 511 M
( this document cannot be used by those applications; TFRC-PS \(for) s
5 500 M
( TFRC-PacketSize\) is a variant of TFRC for applications that have a) s
5 489 M
( fixed sending rate but vary their packet size in response to) s
5 478 M
( congestion. TFRC-PS will be specified in a later document.) s
5 456 M
( TFRC is a receiver-based mechanism, with the calculation of the) s
5 445 M
( congestion control information \(i.e., the loss event rate\) in the) s
5 434 M
( data receiver rather in the data sender. This is well-suited to an) s
5 423 M
( application where the sender is a large server handling many) s
5 412 M
( concurrent connections, and the receiver has more memory and CPU) s
5 401 M
( cycles available for computation. In addition, a receiver-based) s
5 390 M
( mechanism is more suitable as a building block for multicast) s
5 379 M
( congestion control.) s
5 357 M
(2. Terminology) s
5 335 M
( In this document, the key words "MUST", "MUST NOT", "REQUIRED",) s
5 324 M
( "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",) s
5 313 M
( and "OPTIONAL" are to be interpreted as described in BCP 14, RFC 2119) s
5 302 M
( and indicate requirement levels for compliant TFRC implementations.) s
5 280 M
(3. Protocol Mechanism) s
5 258 M
( For its congestion control mechanism, TFRC directly uses a throughput) s
5 247 M
( equation for the allowed sending rate as a function of the loss event) s
5 236 M
( rate and round-trip time. In order to compete fairly with TCP, TFRC) s
5 225 M
( uses the TCP throughput equation, which roughly describes TCP's) s
5 214 M
( sending rate as a function of the loss event rate, round-trip time,) s
5 203 M
( and packet size. We define a loss event as one or more lost or) s
5 192 M
( marked packets from a window of data, where a marked packet refers to) s
5 181 M
( a congestion indication from Explicit Congestion Notification \(ECN\)) s
5 170 M
( [6].) s
5 126 M
(Handley, et. al. Standards Track [Page 3]) s
_R
S
%%Page: (4) 4
%%BeginPageSetup
_S
24 24 translate
/pagenum 4 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( Generally speaking, TFRC's congestion control mechanism works as) s
5 676 M
( follows:) s
5 654 M
( o The receiver measures the loss event rate and feeds this) s
5 643 M
( information back to the sender.) s
5 621 M
( o The sender also uses these feedback messages to measure the) s
5 610 M
( round-trip time \(RTT\).) s
5 588 M
( o The loss event rate and RTT are then fed into TFRC's throughput) s
5 577 M
( equation, giving the acceptable transmit rate.) s
5 555 M
( o The sender then adjusts its transmit rate to match the calculated) s
5 544 M
( rate.) s
5 522 M
( The dynamics of TFRC are sensitive to how the measurements are) s
5 511 M
( performed and applied. We recommend specific mechanisms below to) s
5 500 M
( perform and apply these measurements. Other mechanisms are possible,) s
5 489 M
( but it is important to understand how the interactions between) s
5 478 M
( mechanisms affect the dynamics of TFRC.) s
5 456 M
(3.1. TCP Throughput Equation) s
5 434 M
( Any realistic equation giving TCP throughput as a function of loss) s
5 423 M
( event rate and RTT should be suitable for use in TFRC. However, we) s
5 412 M
( note that the TCP throughput equation used must reflect TCP's) s
5 401 M
( retransmit timeout behavior, as this dominates TCP throughput at) s
5 390 M
( higher loss rates. We also note that the assumptions implicit in the) s
5 379 M
( throughput equation about the loss event rate parameter have to be a) s
5 368 M
( reasonable match to how the loss rate or loss event rate is actually) s
5 357 M
( measured. While this match is not perfect for the throughput) s
5 346 M
( equation and loss rate measurement mechanisms given below, in) s
5 335 M
( practice the assumptions turn out to be close enough.) s
5 313 M
( The throughput equation we currently recommend for TFRC is a slightly) s
5 302 M
( simplified version of the throughput equation for Reno TCP from [4].) s
5 291 M
( Ideally we'd prefer a throughput equation based on SACK TCP, but no) s
5 280 M
( one has yet derived the throughput equation for SACK TCP, and from) s
5 269 M
( both simulations and experiments, the differences between the two) s
5 258 M
( equations are relatively minor.) s
5 236 M
( The throughput equation is:) s
5 214 M
( s) s
5 203 M
( X = ----------------------------------------------------------) s
5 192 M
( R*sqrt\(2*b*p/3\) + \(t_RTO * \(3*sqrt\(3*b*p/8\) * p * \(1+32*p^2\)\)\)) s
5 126 M
(Handley, et. al. Standards Track [Page 4]) s
_R
S
%%Page: (5) 5
%%BeginPageSetup
_S
24 24 translate
/pagenum 5 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( Where:) s
5 665 M
( X is the transmit rate in bytes/second.) s
5 643 M
( s is the packet size in bytes.) s
5 621 M
( R is the round trip time in seconds.) s
5 599 M
( p is the loss event rate, between 0 and 1.0, of the number of loss) s
5 588 M
( events as a fraction of the number of packets transmitted.) s
5 566 M
( t_RTO is the TCP retransmission timeout value in seconds.) s
5 544 M
( b is the number of packets acknowledged by a single TCP) s
5 533 M
( acknowledgement.) s
5 511 M
( We further simplify this by setting t_RTO = 4*R. A more accurate) s
5 500 M
( calculation of t_RTO is possible, but experiments with the current) s
5 489 M
( setting have resulted in reasonable fairness with existing TCP) s
5 478 M
( implementations [9]. Another possibility would be to set t_RTO =) s
5 467 M
( max\(4R, one second\), to match the recommended minimum of one second) s
5 456 M
( on the RTO [5].) s
5 434 M
( Many current TCP connections use delayed acknowledgements, sending an) s
5 423 M
( acknowledgement for every two data packets received, and thus have a) s
5 412 M
( sending rate modeled by b = 2. However, TCP is also allowed to send) s
5 401 M
( an acknowledgement for every data packet, and this would be modeled) s
5 390 M
( by b = 1. Because many TCP implementations do not use delayed) s
5 379 M
( acknowledgements, we recommend b = 1.) s
5 357 M
( In future, different TCP equations may be substituted for this) s
5 346 M
( equation. The requirement is that the throughput equation be a) s
5 335 M
( reasonable approximation of the sending rate of TCP for conformant) s
5 324 M
( TCP congestion control.) s
5 302 M
( The parameters s \(packet size\), p \(loss event rate\) and R \(RTT\) need) s
5 291 M
( to be measured or calculated by a TFRC implementation. The) s
5 280 M
( measurement of s is specified in Section 4.1, measurement of R is) s
5 269 M
( specified in Section 4.3, and measurement of p is specified in) s
5 258 M
( Section 5. In the rest of this document all data rates are measured) s
5 247 M
( in bytes/second.) s
5 126 M
(Handley, et. al. Standards Track [Page 5]) s
_R
S
%%Page: (6) 6
%%BeginPageSetup
_S
24 24 translate
/pagenum 6 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
(3.2. Packet Contents) s
5 665 M
( Before specifying the sender and receiver functionality, we describe) s
5 654 M
( the contents of the data packets sent by the sender and feedback) s
5 643 M
( packets sent by the receiver. As TFRC will be used along with a) s
5 632 M
( transport protocol, we do not specify packet formats, as these depend) s
5 621 M
( on the details of the transport protocol used.) s
5 599 M
(3.2.1. Data Packets) s
5 577 M
( Each data packet sent by the data sender contains the following) s
5 566 M
( information:) s
5 544 M
( o A sequence number. This number is incremented by one for each) s
5 533 M
( data packet transmitted. The field must be sufficiently large) s
5 522 M
( that it does not wrap causing two different packets with the same) s
5 511 M
( sequence number to be in the receiver's recent packet history at) s
5 500 M
( the same time.) s
5 478 M
( o A timestamp indicating when the packet is sent. We denote by ts_i) s
5 467 M
( the timestamp of the packet with sequence number i. The) s
5 456 M
( resolution of the timestamp should typically be measured in) s
5 445 M
( milliseconds. This timestamp is used by the receiver to determine) s
5 434 M
( which losses belong to the same loss event. The timestamp is also) s
5 423 M
( echoed by the receiver to enable the sender to estimate the) s
5 412 M
( round-trip time, for senders that do not save timestamps of) s
5 401 M
( transmitted data packets. We note that as an alternative to a) s
5 390 M
( timestamp incremented in milliseconds, a "timestamp" that) s
5 379 M
( increments every quarter of a round-trip time would be sufficient) s
5 368 M
( for determining when losses belong to the same loss event, in the) s
5 357 M
( context of a protocol where this is understood by both sender and) s
5 346 M
( receiver, and where the sender saves the timestamps of transmitted) s
5 335 M
( data packets.) s
5 313 M
( o The sender's current estimate of the round trip time. The) s
5 302 M
( estimate reported in packet i is denoted by R_i. The round-trip) s
5 291 M
( time estimate is used by the receiver, along with the timestamp,) s
5 280 M
( to determine when multiple losses belong to the same loss event.) s
5 269 M
( If the sender sends a coarse-grained "timestamp" that increments) s
5 258 M
( every quarter of a round-trip time, as discussed above, then the) s
5 247 M
( sender does not need to send its current estimate of the round) s
5 236 M
( trip time.) s
5 126 M
(Handley, et. al. Standards Track [Page 6]) s
_R
S
%%Page: (7) 7
%%BeginPageSetup
_S
24 24 translate
/pagenum 7 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
(3.2.2. Feedback Packets) s
5 665 M
( Each feedback packet sent by the data receiver contains the following) s
5 654 M
( information:) s
5 632 M
( o The timestamp of the last data packet received. We denote this by) s
5 621 M
( t_recvdata. If the last packet received at the receiver has) s
5 610 M
( sequence number i, then t_recvdata = ts_i. This timestamp is used) s
5 599 M
( by the sender to estimate the round-trip time, and is only needed) s
5 588 M
( if the sender does not save timestamps of transmitted data) s
5 577 M
( packets.) s
5 555 M
( o The amount of time elapsed between the receipt of the last data) s
5 544 M
( packet at the receiver, and the generation of this feedback) s
5 533 M
( report. We denote this by t_delay.) s
5 511 M
( o The rate at which the receiver estimates that data was received) s
5 500 M
( since the last feedback report was sent. We denote this by) s
5 489 M
( X_recv.) s
5 467 M
( o The receiver's current estimate of the loss event rate, p.) s
5 445 M
(4. Data Sender Protocol) s
5 423 M
( The data sender sends a stream of data packets to the data receiver) s
5 412 M
( at a controlled rate. When a feedback packet is received from the) s
5 401 M
( data receiver, the data sender changes its sending rate, based on the) s
5 390 M
( information contained in the feedback report. If the sender does not) s
5 379 M
( receive a feedback report for two round trip times, it cuts its) s
5 368 M
( sending rate in half. This is achieved by means of a timer called) s
5 357 M
( the nofeedback timer.) s
5 335 M
( We specify the sender-side protocol in the following steps:) s
5 313 M
( o Measurement of the mean packet size being sent.) s
5 291 M
( o The sender behavior when a feedback packet is received.) s
5 269 M
( o The sender behavior when the nofeedback timer expires.) s
5 247 M
( o Oscillation prevention \(optional\)) s
5 225 M
( o Scheduling of transmission on non-realtime operating systems.) s
5 126 M
(Handley, et. al. Standards Track [Page 7]) s
_R
S
%%Page: (8) 8
%%BeginPageSetup
_S
24 24 translate
/pagenum 8 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
(4.1. Measuring the Packet Size) s
5 665 M
( The parameter s \(packet size\) is normally known to an application.) s
5 654 M
( This may not be so in two cases:) s
5 632 M
( o The packet size naturally varies depending on the data. In this) s
5 621 M
( case, although the packet size varies, that variation is not) s
5 610 M
( coupled to the transmit rate. It should normally be safe to use) s
5 599 M
( an estimate of the mean packet size for s.) s
5 577 M
( o The application needs to change the packet size rather than the) s
5 566 M
( number of packets per second to perform congestion control. This) s
5 555 M
( would normally be the case with packet audio applications where a) s
5 544 M
( fixed interval of time needs to be represented by each packet.) s
5 533 M
( Such applications need to have a completely different way of) s
5 522 M
( measuring parameters.) s
5 500 M
( The second class of applications are discussed separately in a) s
5 489 M
( separate document on TFRC-PS. For the remainder of this section we) s
5 478 M
( assume the sender can estimate the packet size, and that congestion) s
5 467 M
( control is performed by adjusting the number of packets sent per) s
5 456 M
( second.) s
5 434 M
(4.2. Sender Initialization) s
5 412 M
( To initialize the sender, the value of X is set to 1 packet/second) s
5 401 M
( and the nofeedback timer is set to expire after 2 seconds. The) s
5 390 M
( initial values for R \(RTT\) and t_RTO are undefined until they are set) s
5 379 M
( as described below. The initial value of tld, for the Time Last) s
5 368 M
( Doubled during slow-start, is set to -1.) s
5 346 M
(4.3. Sender behavior when a feedback packet is received) s
5 324 M
( The sender knows its current sending rate, X, and maintains an) s
5 313 M
( estimate of the current round trip time, R, and an estimate of the) s
5 302 M
( timeout interval, t_RTO.) s
5 280 M
( When a feedback packet is received by the sender at time t_now, the) s
5 269 M
( following actions should be performed:) s
5 247 M
( 1\) Calculate a new round trip sample.) s
5 236 M
( R_sample = \(t_now - t_recvdata\) - t_delay.) s
5 126 M
(Handley, et. al. Standards Track [Page 8]) s
_R
S
%%Page: (9) 9
%%BeginPageSetup
_S
24 24 translate
/pagenum 9 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( 2\) Update the round trip time estimate:) s
5 665 M
( If no feedback has been received before) s
5 654 M
( R = R_sample;) s
5 643 M
( Else) s
5 632 M
( R = q*R + \(1-q\)*R_sample;) s
5 610 M
( TFRC is not sensitive to the precise value for the filter constant q,) s
5 599 M
( but we recommend a default value of 0.9.) s
5 577 M
( 3\) Update the timeout interval:) s
5 555 M
( t_RTO = 4*R.) s
5 533 M
( 4\) Update the sending rate as follows:) s
5 511 M
( If \(p > 0\)) s
5 500 M
( Calculate X_calc using the TCP throughput equation.) s
5 489 M
( X = max\(min\(X_calc, 2*X_recv\), s/t_mbi\);) s
5 478 M
( Else) s
5 467 M
( If \(t_now - tld >= R\)) s
5 456 M
( X = max\(min\(2*X, 2*X_recv\), s/R\);) s
5 445 M
( tld = t_now;) s
5 423 M
( Note that if p == 0, then the sender is in slow-start phase, where) s
5 412 M
( it approximately doubles the sending rate each round-trip time) s
5 401 M
( until a loss occurs. The s/R term gives a minimum sending rate) s
5 390 M
( during slow-start of one packet per RTT. The parameter t_mbi is) s
5 379 M
( 64 seconds, and represents the maximum inter-packet backoff) s
5 368 M
( interval in the persistent absence of feedback. Thus, when p > 0) s
5 357 M
( the sender sends at least one packet every 64 seconds.) s
5 335 M
( 5\) Reset the nofeedback timer to expire after max\(4*R, 2*s/X\)) s
5 324 M
( seconds.) s
5 302 M
(4.4. Expiration of nofeedback timer) s
5 280 M
( If the nofeedback timer expires, the sender should perform the) s
5 269 M
( following actions:) s
5 247 M
( 1\) Cut the sending rate in half. If the sender has received feedback) s
5 236 M
( from the receiver, this is done by modifying the sender's cached) s
5 225 M
( copy of X_recv \(the receive rate\). Because the sending rate is) s
5 214 M
( limited to at most twice X_recv, modifying X_recv limits the) s
5 203 M
( current sending rate, but allows the sender to slow-start,) s
5 192 M
( doubling its sending rate each RTT, if feedback messages resume) s
5 181 M
( reporting no losses.) s
5 126 M
(Handley, et. al. Standards Track [Page 9]) s
_R
S
%%Page: (10) 10
%%BeginPageSetup
_S
24 24 translate
/pagenum 10 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( If \(X_calc > 2*X_recv\)) s
5 676 M
( X_recv = max\(X_recv/2, s/\(2*t_mbi\)\);) s
5 665 M
( Else) s
5 654 M
( X_recv = X_calc/4;) s
5 632 M
( The term s/\(2*t_mbi\) limits the backoff to one packet every 64) s
5 621 M
( seconds in the case of persistent absence of feedback.) s
5 599 M
( 2\) The value of X must then be recalculated as described under point) s
5 588 M
( \(4\) above.) s
5 566 M
( If the nofeedback timer expires when the sender does not yet have) s
5 555 M
( an RTT sample, and has not yet received any feedback from the) s
5 544 M
( receiver, then step \(1\) can be skipped, and the sending rate cut) s
5 533 M
( in half directly:) s
5 511 M
( X = max\(X/2, s/t_mbi\)) s
5 489 M
( 3\) Restart the nofeedback timer to expire after max\(4*R, 2*s/X\)) s
5 478 M
( seconds.) s
5 456 M
( Note that when the sender stops sending, the receiver will stop) s
5 445 M
( sending feedback. This will cause the nofeedback timer to start to) s
5 434 M
( expire and decrease X_recv. If the sender subsequently starts to) s
5 423 M
( send again, X_recv will limit the transmit rate, and a normal) s
5 412 M
( slowstart phase will occur until the transmit rate reaches X_calc.) s
5 390 M
( If the sender has been idle since this nofeedback timer was set and) s
5 379 M
( X_recv is less than four packets per round-trip time, then X_recv) s
5 368 M
( should not be halved in response to the timer expiration. This) s
5 357 M
( ensures that the allowed sending rate is never reduced to less than) s
5 346 M
( two packets per round-trip time as a result of an idle period.) s
5 324 M
(4.5. Preventing Oscillations) s
5 302 M
( To prevent oscillatory behavior in environments with a low degree of) s
5 291 M
( statistical multiplexing it is useful to modify sender's transmit) s
5 280 M
( rate to provide congestion avoidance behavior by reducing the) s
5 269 M
( transmit rate as the queuing delay \(and hence RTT\) increases. To do) s
5 258 M
( this the sender maintains an estimate of the long-term RTT and) s
5 247 M
( modifies its sending rate depending on how the most recent sample of) s
5 236 M
( the RTT differs from this value. The long-term sample is R_sqmean,) s
5 225 M
( and is set as follows:) s
5 203 M
( If no feedback has been received before) s
5 192 M
( R_sqmean = sqrt\(R_sample\);) s
5 181 M
( Else) s
5 170 M
( R_sqmean = q2*R_sqmean + \(1-q2\)*sqrt\(R_sample\);) s
5 126 M
(Handley, et. al. Standards Track [Page 10]) s
_R
S
%%Page: (11) 11
%%BeginPageSetup
_S
24 24 translate
/pagenum 11 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( Thus R_sqmean gives the exponentially weighted moving average of the) s
5 676 M
( square root of the RTT samples. The constant q2 should be set) s
5 665 M
( similarly to q, and we recommend a value of 0.9 as the default.) s
5 643 M
( The sender obtains the base transmit rate, X, from the throughput) s
5 632 M
( function. It then calculates a modified instantaneous transmit rate) s
5 621 M
( X_inst, as follows:) s
5 599 M
( X_inst = X * R_sqmean / sqrt\(R_sample\);) s
5 577 M
( When sqrt\(R_sample\) is greater than R_sqmean then the queue is) s
5 566 M
( typically increasing and so the transmit rate needs to be decreased) s
5 555 M
( for stable operation.) s
5 533 M
( Note: This modification is not always strictly required, especially) s
5 522 M
( if the degree of statistical multiplexing in the network is high.) s
5 511 M
( However, we recommend that it is done because it does make TFRC) s
5 500 M
( behave better in environments with a low level of statistical) s
5 489 M
( multiplexing. If it is not done, we recommend using a very low value) s
5 478 M
( of q, such that q is close to or exactly zero.) s
5 456 M
(4.6. Scheduling of Packet Transmissions) s
5 434 M
( As TFRC is rate-based, and as operating systems typically cannot) s
5 423 M
( schedule events precisely, it is necessary to be opportunistic about) s
5 412 M
( sending data packets so that the correct average rate is maintained) s
5 401 M
( despite the course-grain or irregular scheduling of the operating) s
5 390 M
( system. Thus a typical sending loop will calculate the correct) s
5 379 M
( inter-packet interval, t_ipi, as follows:) s
5 357 M
( t_ipi = s/X_inst;) s
5 335 M
( When a sender first starts sending at time t_0, it calculates t_ipi,) s
5 324 M
( and calculates a nominal send time t_1 = t_0 + t_ipi for packet 1.) s
5 313 M
( When the application becomes idle, it checks the current time, t_now,) s
5 302 M
( and then requests re-scheduling after \(t_ipi - \(t_now - t_0\)\)) s
5 291 M
( seconds. When the application is re-scheduled, it checks the current) s
5 280 M
( time, t_now, again. If \(t_now > t_1 - delta\) then packet 1 is sent.) s
5 258 M
( Now a new t_ipi may be calculated, and used to calculate a nominal) s
5 247 M
( send time t_2 for packet 2: t2 = t_1 + t_ipi. The process then) s
5 236 M
( repeats, with each successive packet's send time being calculated) s
5 225 M
( from the nominal send time of the previous packet.) s
5 203 M
( In some cases, when the nominal send time, t_i, of the next packet is) s
5 192 M
( calculated, it may already be the case that t_now > t_i - delta. In) s
5 181 M
( such a case the packet should be sent immediately. Thus if the) s
5 170 M
( operating system has coarse timer granularity and the transmit rate) s
5 126 M
(Handley, et. al. Standards Track [Page 11]) s
_R
S
%%Page: (12) 12
%%BeginPageSetup
_S
24 24 translate
/pagenum 12 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( is high, then TFRC may send short bursts of several packets separated) s
5 676 M
( by intervals of the OS timer granularity.) s
5 654 M
( The parameter delta is to allow a degree of flexibility in the send) s
5 643 M
( time of a packet. If the operating system has a scheduling timer) s
5 632 M
( granularity of t_gran seconds, then delta would typically be set to:) s
5 610 M
( delta = min\(t_ipi/2, t_gran/2\);) s
5 588 M
( t_gran is 10ms on many Unix systems. If t_gran is not known, a value) s
5 577 M
( of 10ms can be safely assumed.) s
5 555 M
(5. Calculation of the Loss Event Rate \(p\)) s
5 533 M
( Obtaining an accurate and stable measurement of the loss event rate) s
5 522 M
( is of primary importance for TFRC. Loss rate measurement is) s
5 511 M
( performed at the receiver, based on the detection of lost or marked) s
5 500 M
( packets from the sequence numbers of arriving packets. We describe) s
5 489 M
( this process before describing the rest of the receiver protocol.) s
5 467 M
(5.1. Detection of Lost or Marked Packets) s
5 445 M
( TFRC assumes that all packets contain a sequence number that is) s
5 434 M
( incremented by one for each packet that is sent. For the purposes of) s
5 423 M
( this specification, we require that if a lost packet is) s
5 412 M
( retransmitted, the retransmission is given a new sequence number that) s
5 401 M
( is the latest in the transmission sequence, and not the same sequence) s
5 390 M
( number as the packet that was lost. If a transport protocol has the) s
5 379 M
( requirement that it must retransmit with the original sequence) s
5 368 M
( number, then the transport protocol designer must figure out how to) s
5 357 M
( distinguish delayed from retransmitted packets and how to detect lost) s
5 346 M
( retransmissions.) s
5 324 M
( The receiver maintains a data structure that keeps track of which) s
5 313 M
( packets have arrived and which are missing. For the purposes of) s
5 302 M
( specification, we assume that the data structure consists of a list) s
5 291 M
( of packets that have arrived along with the receiver timestamp when) s
5 280 M
( each packet was received. In practice this data structure will) s
5 269 M
( normally be stored in a more compact representation, but this is) s
5 258 M
( implementation-specific.) s
5 236 M
( The loss of a packet is detected by the arrival of at least three) s
5 225 M
( packets with a higher sequence number than the lost packet. The) s
5 214 M
( requirement for three subsequent packets is the same as with TCP, and) s
5 203 M
( is to make TFRC more robust in the presence of reordering. In) s
5 192 M
( contrast to TCP, if a packet arrives late \(after 3 subsequent packets) s
5 181 M
( arrived\) in TFRC, the late packet can fill the hole in TFRC's) s
5 170 M
( reception record, and the receiver can recalculate the loss event) s
5 126 M
(Handley, et. al. Standards Track [Page 12]) s
_R
S
%%Page: (13) 13
%%BeginPageSetup
_S
24 24 translate
/pagenum 13 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( rate. Future versions of TFRC might make the requirement for three) s
5 676 M
( subsequent packets adaptive based on experienced packet reordering,) s
5 665 M
( but we do not specify such a mechanism here.) s
5 643 M
( For an ECN-capable connection, a marked packet is detected as a) s
5 632 M
( congestion event as soon as it arrives, without having to wait for) s
5 621 M
( the arrival of subsequent packets.) s
5 599 M
(5.2. Translation from Loss History to Loss Events) s
5 577 M
( TFRC requires that the loss fraction be robust to several consecutive) s
5 566 M
( packets lost where those packets are part of the same loss event.) s
5 555 M
( This is similar to TCP, which \(typically\) only performs one halving) s
5 544 M
( of the congestion window during any single RTT. Thus the receiver) s
5 533 M
( needs to map the packet loss history into a loss event record, where) s
5 522 M
( a loss event is one or more packets lost in an RTT. To perform this) s
5 511 M
( mapping, the receiver needs to know the RTT to use, and this is) s
5 500 M
( supplied periodically by the sender, typically as control information) s
5 489 M
( piggy-backed onto a data packet. TFRC is not sensitive to how the) s
5 478 M
( RTT measurement sent to the receiver is made, but we recommend using) s
5 467 M
( the sender's calculated RTT, R, \(see Section 4.3\) for this purpose.) s
5 445 M
( To determine whether a lost or marked packet should start a new loss) s
5 434 M
( event, or be counted as part of an existing loss event, we need to) s
5 423 M
( compare the sequence numbers and timestamps of the packets that) s
5 412 M
( arrived at the receiver. For a marked packet S_new, its reception) s
5 401 M
( time T_new can be noted directly. For a lost packet, we can) s
5 390 M
( interpolate to infer the nominal "arrival time". Assume:) s
5 368 M
( S_loss is the sequence number of a lost packet.) s
5 346 M
( S_before is the sequence number of the last packet to arrive with) s
5 335 M
( sequence number before S_loss.) s
5 313 M
( S_after is the sequence number of the first packet to arrive with) s
5 302 M
( sequence number after S_loss.) s
5 280 M
( T_before is the reception time of S_before.) s
5 258 M
( T_after is the reception time of S_after.) s
5 236 M
( Note that T_before can either be before or after T_after due to) s
5 225 M
( reordering.) s
5 126 M
(Handley, et. al. Standards Track [Page 13]) s
_R
S
%%Page: (14) 14
%%BeginPageSetup
_S
24 24 translate
/pagenum 14 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( For a lost packet S_loss, we can interpolate its nominal "arrival) s
5 676 M
( time" at the receiver from the arrival times of S_before and S_after.) s
5 665 M
( Thus:) s
5 643 M
( T_loss = T_before + \( \(T_after - T_before\)) s
5 632 M
( * \(S_loss - S_before\)/\(S_after - S_before\) \);) s
5 610 M
( Note that if the sequence space wrapped between S_before and S_after,) s
5 599 M
( then the sequence numbers must be modified to take this into account) s
5 588 M
( before performing this calculation. If the largest possible sequence) s
5 577 M
( number is S_max, and S_before > S_after, then modifying each sequence) s
5 566 M
( number S by S' = \(S + \(S_max + 1\)/2\) mod \(S_max + 1\) would normally) s
5 555 M
( be sufficient.) s
5 533 M
( If the lost packet S_old was determined to have started the previous) s
5 522 M
( loss event, and we have just determined that S_new has been lost,) s
5 511 M
( then we interpolate the nominal arrival times of S_old and S_new,) s
5 500 M
( called T_old and T_new respectively.) s
5 478 M
( If T_old + R >= T_new, then S_new is part of the existing loss event.) s
5 467 M
( Otherwise S_new is the first packet in a new loss event.) s
5 445 M
(5.3. Inter-loss Event Interval) s
5 423 M
( If a loss interval, A, is determined to have started with packet) s
5 412 M
( sequence number S_A and the next loss interval, B, started with) s
5 401 M
( packet sequence number S_B, then the number of packets in loss) s
5 390 M
( interval A is given by \(S_B - S_A\).) s
5 368 M
(5.4. Average Loss Interval) s
5 346 M
( To calculate the loss event rate p, we first calculate the average) s
5 335 M
( loss interval. This is done using a filter that weights the n most) s
5 324 M
( recent loss event intervals in such a way that the measured loss) s
5 313 M
( event rate changes smoothly.) s
5 291 M
( Weights w_0 to w_\(n-1\) are calculated as:) s
5 269 M
( If \(i < n/2\)) s
5 258 M
( w_i = 1;) s
5 247 M
( Else) s
5 236 M
( w_i = 1 - \(i - \(n/2 - 1\)\)/\(n/2 + 1\);) s
5 214 M
( Thus if n=8, the values of w_0 to w_7 are:) s
5 192 M
( 1.0, 1.0, 1.0, 1.0, 0.8, 0.6, 0.4, 0.2) s
5 126 M
(Handley, et. al. Standards Track [Page 14]) s
_R
S
%%Page: (15) 15
%%BeginPageSetup
_S
24 24 translate
/pagenum 15 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( The value n for the number of loss intervals used in calculating the) s
5 676 M
( loss event rate determines TFRC's speed in responding to changes in) s
5 665 M
( the level of congestion. As currently specified, TFRC should not be) s
5 654 M
( used for values of n significantly greater than 8, for traffic that) s
5 643 M
( might compete in the global Internet with TCP. At the very least,) s
5 632 M
( safe operation with values of n greater than 8 would require a slight) s
5 621 M
( change to TFRC's mechanisms to include a more severe response to two) s
5 610 M
( or more round-trip times with heavy packet loss.) s
5 588 M
( When calculating the average loss interval we need to decide whether) s
5 577 M
( to include the interval since the most recent packet loss event. We) s
5 566 M
( only do this if it is sufficiently large to increase the average loss) s
5 555 M
( interval.) s
5 533 M
( Thus if the most recent loss intervals are I_0 to I_n, with I_0 being) s
5 522 M
( the interval since the most recent loss event, then we calculate the) s
5 511 M
( average loss interval I_mean as:) s
5 489 M
( I_tot0 = 0;) s
5 478 M
( I_tot1 = 0;) s
5 467 M
( W_tot = 0;) s
5 456 M
( for \(i = 0 to n-1\) {) s
5 445 M
( I_tot0 = I_tot0 + \(I_i * w_i\);) s
5 434 M
( W_tot = W_tot + w_i;) s
5 423 M
( }) s
5 412 M
( for \(i = 1 to n\) {) s
5 401 M
( I_tot1 = I_tot1 + \(I_i * w_\(i-1\)\);) s
5 390 M
( }) s
5 379 M
( I_tot = max\(I_tot0, I_tot1\);) s
5 368 M
( I_mean = I_tot/W_tot;) s
5 346 M
( The loss event rate, p is simply:) s
5 324 M
( p = 1 / I_mean;) s
5 302 M
(5.5. History Discounting) s
5 280 M
( As described in Section 5.4, the most recent loss interval is only) s
5 269 M
( assigned 1/\(0.75*n\) of the total weight in calculating the average) s
5 258 M
( loss interval, regardless of the size of the most recent loss) s
5 247 M
( interval. This section describes an optional history discounting) s
5 236 M
( mechanism, discussed further in [3] and [9], that allows the TFRC) s
5 225 M
( receiver to adjust the weights, concentrating more of the relative) s
5 214 M
( weight on the most recent loss interval, when the most recent loss) s
5 203 M
( interval is more than twice as large as the computed average loss) s
5 192 M
( interval.) s
5 126 M
(Handley, et. al. Standards Track [Page 15]) s
_R
S
%%Page: (16) 16
%%BeginPageSetup
_S
24 24 translate
/pagenum 16 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( To carry out history discounting, we associate a discount factor DF_i) s
5 676 M
( with each loss interval L_i, for i > 0, where each discount factor is) s
5 665 M
( a floating point number. The discount array maintains the cumulative) s
5 654 M
( history of discounting for each loss interval. At the beginning, the) s
5 643 M
( values of DF_i in the discount array are initialized to 1:) s
5 621 M
( for \(i = 1 to n\) {) s
5 610 M
( DF_i = 1;) s
5 599 M
( }) s
5 577 M
( History discounting also uses a general discount factor DF, also a) s
5 566 M
( floating point number, that is also initialized to 1. First we show) s
5 555 M
( how the discount factors are used in calculating the average loss) s
5 544 M
( interval, and then we describe later in this section how the discount) s
5 533 M
( factors are modified over time.) s
5 511 M
( As described in Section 5.4 the average loss interval is calculated) s
5 500 M
( using the n previous loss intervals I_1, ..., I_n, and the interval) s
5 489 M
( I_0 that represents the number of packets received since the last) s
5 478 M
( loss event. The computation of the average loss interval using the) s
5 467 M
( discount factors is a simple modification of the procedure in Section) s
5 456 M
( 5.4, as follows:) s
5 434 M
( I_tot0 = I_0 * w_0) s
5 423 M
( I_tot1 = 0;) s
5 412 M
( W_tot0 = w_0) s
5 401 M
( W_tot1 = 0;) s
5 390 M
( for \(i = 1 to n-1\) {) s
5 379 M
( I_tot0 = I_tot0 + \(I_i * w_i * DF_i * DF\);) s
5 368 M
( W_tot0 = W_tot0 + w_i * DF_i * DF;) s
5 357 M
( }) s
5 346 M
( for \(i = 1 to n\) {) s
5 335 M
( I_tot1 = I_tot1 + \(I_i * w_\(i-1\) * DF_i\);) s
5 324 M
( W_tot1 = W_tot1 + w_\(i-1\) * DF_i;) s
5 313 M
( }) s
5 302 M
( p = min\(W_tot0/I_tot0, W_tot1/I_tot1\);) s
5 280 M
( The general discounting factor, DF is updated on every packet arrival) s
5 269 M
( as follows. First, the receiver computes the weighted average I_mean) s
5 258 M
( of the loss intervals I_1, ..., I_n:) s
5 236 M
( I_tot = 0;) s
5 225 M
( W_tot = 0;) s
5 214 M
( for \(i = 1 to n\) {) s
5 203 M
( W_tot = W_tot + w_\(i-1\) * DF_i;) s
5 192 M
( I_tot = I_tot + \(I_i * w_\(i-1\) * DF_i\);) s
5 181 M
( }) s
5 170 M
( I_mean = I_tot / W_tot;) s
5 126 M
(Handley, et. al. Standards Track [Page 16]) s
_R
S
%%Page: (17) 17
%%BeginPageSetup
_S
24 24 translate
/pagenum 17 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( This weighted average I_mean is compared to I_0, the number of) s
5 676 M
( packets received since the last loss event. If I_0 is greater than) s
5 665 M
( twice I_mean, then the new loss interval is considerably larger than) s
5 654 M
( the old ones, and the general discount factor DF is updated to) s
5 643 M
( decrease the relative weight on the older intervals, as follows:) s
5 621 M
( if \(I_0 > 2 * I_mean\) {) s
5 610 M
( DF = 2 * I_mean/I_0;) s
5 599 M
( if \(DF < THRESHOLD\)) s
5 588 M
( DF = THRESHOLD;) s
5 577 M
( } else) s
5 566 M
( DF = 1;) s
5 544 M
( A nonzero value for THRESHOLD ensures that older loss intervals from) s
5 533 M
( an earlier time of high congestion are not discounted entirely. We) s
5 522 M
( recommend a THRESHOLD of 0.5. Note that with each new packet) s
5 511 M
( arrival, I_0 will increase further, and the discount factor DF will) s
5 500 M
( be updated.) s
5 478 M
( When a new loss event occurs, the current interval shifts from I_0 to) s
5 467 M
( I_1, loss interval I_i shifts to interval I_\(i+1\), and the loss) s
5 456 M
( interval I_n is forgotten. The previous discount factor DF has to be) s
5 445 M
( incorporated into the discount array. Because DF_i carries the) s
5 434 M
( discount factor associated with loss interval I_i, the DF_i array has) s
5 423 M
( to be shifted as well. This is done as follows:) s
5 401 M
( for \(i = 1 to n\) {) s
5 390 M
( DF_i = DF * DF_i;) s
5 379 M
( }) s
5 368 M
( for \(i = n-1 to 0 step -1\) {) s
5 357 M
( DF_\(i+1\) = DF_i;) s
5 346 M
( }) s
5 335 M
( I_0 = 1;) s
5 324 M
( DF_0 = 1;) s
5 313 M
( DF = 1;) s
5 291 M
( This completes the description of the optional history discounting) s
5 280 M
( mechanism. We emphasize that this is an optional mechanism whose) s
5 269 M
( sole purpose is to allow TFRC to response somewhat more quickly to) s
5 258 M
( the sudden absence of congestion, as represented by a long current) s
5 247 M
( loss interval.) s
5 225 M
(6. Data Receiver Protocol) s
5 203 M
( The receiver periodically sends feedback messages to the sender.) s
5 192 M
( Feedback packets should normally be sent at least once per RTT,) s
5 181 M
( unless the sender is sending at a rate of less than one packet per) s
5 170 M
( RTT, in which case a feedback packet should be send for every data) s
5 126 M
(Handley, et. al. Standards Track [Page 17]) s
_R
S
%%Page: (18) 18
%%BeginPageSetup
_S
24 24 translate
/pagenum 18 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( packet received. A feedback packet should also be sent whenever a) s
5 676 M
( new loss event is detected without waiting for the end of an RTT, and) s
5 665 M
( whenever an out-of-order data packet is received that removes a loss) s
5 654 M
( event from the history.) s
5 632 M
( If the sender is transmitting at a high rate \(many packets per RTT\)) s
5 621 M
( there may be some advantages to sending periodic feedback messages) s
5 610 M
( more than once per RTT as this allows faster response to changing RTT) s
5 599 M
( measurements, and more resilience to feedback packet loss. However,) s
5 588 M
( there is little gain from sending a large number of feedback messages) s
5 577 M
( per RTT.) s
5 555 M
(6.1. Receiver behavior when a data packet is received) s
5 533 M
( When a data packet is received, the receiver performs the following) s
5 522 M
( steps:) s
5 500 M
( 1\) Add the packet to the packet history.) s
5 478 M
( 2\) Let the previous value of p be p_prev. Calculate the new value of) s
5 467 M
( p as described in Section 5.) s
5 445 M
( 3\) If p > p_prev, cause the feedback timer to expire, and perform the) s
5 434 M
( actions described in Section 6.2) s
5 412 M
( If p <= p_prev no action need be performed.) s
5 390 M
( However an optimization might check to see if the arrival of the) s
5 379 M
( packet caused a hole in the packet history to be filled and) s
5 368 M
( consequently two loss intervals were merged into one. If this is) s
5 357 M
( the case, the receiver might also send feedback immediately. The) s
5 346 M
( effects of such an optimization are normally expected to be small.) s
5 324 M
(6.2. Expiration of feedback timer) s
5 302 M
( When the feedback timer at the receiver expires, the action to be) s
5 291 M
( taken depends on whether data packets have been received since the) s
5 280 M
( last feedback was sent.) s
5 258 M
( Let the maximum sequence number of a packet at the receiver so far be) s
5 247 M
( S_m, and the value of the RTT measurement included in packet S_m be) s
5 236 M
( R_m. If data packets have been received since the previous feedback) s
5 225 M
( was sent, the receiver performs the following steps:) s
5 203 M
( 1\) Calculate the average loss event rate using the algorithm) s
5 192 M
( described above.) s
5 126 M
(Handley, et. al. Standards Track [Page 18]) s
_R
S
%%Page: (19) 19
%%BeginPageSetup
_S
24 24 translate
/pagenum 19 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( 2\) Calculate the measured receive rate, X_recv, based on the packets) s
5 676 M
( received within the previous R_m seconds.) s
5 654 M
( 3\) Prepare and send a feedback packet containing the information) s
5 643 M
( described in Section 3.2.2) s
5 621 M
( 4\) Restart the feedback timer to expire after R_m seconds.) s
5 599 M
( If no data packets have been received since the last feedback was) s
5 588 M
( sent, no feedback packet is sent, and the feedback timer is restarted) s
5 577 M
( to expire after R_m seconds.) s
5 555 M
(6.3. Receiver initialization) s
5 533 M
( The receiver is initialized by the first packet that arrives at the) s
5 522 M
( receiver. Let the sequence number of this packet be i.) s
5 500 M
( When the first packet is received:) s
5 478 M
( o Set p=0) s
5 456 M
( o Set X_recv = 0.) s
5 434 M
( o Prepare and send a feedback packet.) s
5 412 M
( o Set the feedback timer to expire after R_i seconds.) s
5 390 M
(6.3.1. Initializing the Loss History after the First Loss Event) s
5 368 M
( The number of packets until the first loss can not be used to compute) s
5 357 M
( the sending rate directly, as the sending rate changes rapidly during) s
5 346 M
( this time. TFRC assumes that the correct data rate after the first) s
5 335 M
( loss is half of the sending rate when the loss occurred. TFRC) s
5 324 M
( approximates this target rate by X_recv, the receive rate over the) s
5 313 M
( most recent round-trip time. After the first loss, instead of) s
5 302 M
( initializing the first loss interval to the number of packets sent) s
5 291 M
( until the first loss, the TFRC receiver calculates the loss interval) s
5 280 M
( that would be required to produce the data rate X_recv, and uses this) s
5 269 M
( synthetic loss interval to seed the loss history mechanism.) s
5 247 M
( TFRC does this by finding some value p for which the throughput) s
5 236 M
( equation in Section 3.1 gives a sending rate within 5% of X_recv,) s
5 225 M
( given the current packet size s and round-trip time R. The first) s
5 214 M
( loss interval is then set to 1/p. \(The 5% tolerance is introduced) s
5 203 M
( simply because the throughput equation is difficult to invert, and we) s
5 192 M
( want to reduce the costs of calculating p numerically.\)) s
5 126 M
(Handley, et. al. Standards Track [Page 19]) s
_R
S
%%Page: (20) 20
%%BeginPageSetup
_S
24 24 translate
/pagenum 20 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
(7. Sender-based Variants) s
5 665 M
( It would be possible to implement a sender-based variant of TFRC,) s
5 654 M
( where the receiver uses reliable delivery to send information about) s
5 643 M
( packet losses to the sender, and the sender computes the packet loss) s
5 632 M
( rate and the acceptable transmit rate. However, we do not specify) s
5 621 M
( the details of a sender-based variant in this document.) s
5 599 M
( The main advantages of a sender-based variant of TFRC would be that) s
5 588 M
( the sender would not have to trust the receiver's calculation of the) s
5 577 M
( packet loss rate. However, with the requirement of reliable delivery) s
5 566 M
( of loss information from the receiver to the sender, a sender-based) s
5 555 M
( TFRC would have much tighter constraints on the transport protocol in) s
5 544 M
( which it is embedded.) s
5 522 M
( In contrast, the receiver-based variant of TFRC specified in this) s
5 511 M
( document is robust to the loss of feedback packets, and therefore) s
5 500 M
( does not require the reliable delivery of feedback packets. It is) s
5 489 M
( also better suited for applications such as streaming media from web) s
5 478 M
( servers, where it is typically desirable to offload work from the) s
5 467 M
( server to the client as much as possible.) s
5 445 M
( The sender-based and receiver-based variants also have different) s
5 434 M
( properties in terms of upgrades. For example, for changes in the) s
5 423 M
( procedure for calculating the packet loss rate, the sender would have) s
5 412 M
( to be upgraded in the sender-based variant, and the receiver would) s
5 401 M
( have to be upgraded in the receiver-based variant.) s
5 379 M
(8. Implementation Issues) s
5 357 M
( This document has specified the TFRC congestion control mechanism,) s
5 346 M
( for use by applications and transport protocols. This section) s
5 335 M
( mentions briefly some of the few implementation issues.) s
5 313 M
( For t_RTO = 4*R and b = 1, the throughput equation in Section 3.1 can) s
5 302 M
( be expressed as follows:) s
5 280 M
( s) s
5 269 M
( X = --------) s
5 258 M
( R * f\(p\)) s
5 236 M
( for) s
5 214 M
( f\(p\) = sqrt\(2*p/3\) + \(12*sqrt\(3*p/8\) * p * \(1+32*p^2\)\).) s
5 192 M
( A table lookup could be used for the function f\(p\).) s
5 126 M
(Handley, et. al. Standards Track [Page 20]) s
_R
S
%%Page: (21) 21
%%BeginPageSetup
_S
24 24 translate
/pagenum 21 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( Many of the multiplications \(e.g., q and 1-q for the round-trip time) s
5 676 M
( average, a factor of 4 for the timeout interval\) are or could be by) s
5 665 M
( powers of two, and therefore could be implemented as simple shift) s
5 654 M
( operations.) s
5 632 M
( We note that the optional sender mechanism for preventing) s
5 621 M
( oscillations described in Section 4.5 uses a square-root computation.) s
5 599 M
( The calculation of the average loss interval in Section 5.4 involves) s
5 588 M
( multiplications by the weights w_0 to w_\(n-1\), which for n=8 are:) s
5 566 M
( 1.0, 1.0, 1.0, 1.0, 0.8, 0.6, 0.4, 0.2.) s
5 544 M
( With a minor loss of smoothness, it would be possible to use weights) s
5 533 M
( that were powers of two or sums of powers of two, e.g.,) s
5 511 M
( 1.0, 1.0, 1.0, 1.0, 0.75, 0.5, 0.25, 0.25.) s
5 489 M
( The optional history discounting mechanism described in Section 5.5) s
5 478 M
( is used in the calculation of the average loss rate. The history) s
5 467 M
( discounting mechanism is invoked only when there has been an) s
5 456 M
( unusually long interval with no packet losses. For a more efficient) s
5 445 M
( operation, the discount factor DF_i could be restricted to be a power) s
5 434 M
( of two.) s
5 412 M
(9. Security Considerations) s
5 390 M
( TFRC is not a transport protocol in its own right, but a congestion) s
5 379 M
( control mechanism that is intended to be used in conjunction with a) s
5 368 M
( transport protocol. Therefore security primarily needs to be) s
5 357 M
( considered in the context of a specific transport protocol and its) s
5 346 M
( authentication mechanisms.) s
5 324 M
( Congestion control mechanisms can potentially be exploited to create) s
5 313 M
( denial of service. This may occur through spoofed feedback. Thus) s
5 302 M
( any transport protocol that uses TFRC should take care to ensure that) s
5 291 M
( feedback is only accepted from the receiver of the data. The precise) s
5 280 M
( mechanism to achieve this will however depend on the transport) s
5 269 M
( protocol itself.) s
5 247 M
( In addition, congestion control mechanisms may potentially be) s
5 236 M
( manipulated by a greedy receiver that wishes to receive more than its) s
5 225 M
( fair share of network bandwidth. A receiver might do this by) s
5 214 M
( claiming to have received packets that in fact were lost due to) s
5 203 M
( congestion. Possible defenses against such a receiver would normally) s
5 192 M
( include some form of nonce that the receiver must feed back to the) s
5 181 M
( sender to prove receipt. However, the details of such a nonce would) s
5 126 M
(Handley, et. al. Standards Track [Page 21]) s
_R
S
%%Page: (22) 22
%%BeginPageSetup
_S
24 24 translate
/pagenum 22 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( depend on the transport protocol, and in particular on whether the) s
5 676 M
( transport protocol is reliable or unreliable.) s
5 654 M
( We expect that protocols incorporating ECN with TFRC will also want) s
5 643 M
( to incorporate feedback from the receiver to the sender using the ECN) s
5 632 M
( nonce [WES02]. The ECN nonce is a modification to ECN that protects) s
5 621 M
( the sender from the accidental or malicious concealment of marked) s
5 610 M
( packets. Again, the details of such a nonce would depend on the) s
5 599 M
( transport protocol, and are not addressed in this document.) s
5 577 M
(10. IANA Considerations) s
5 555 M
( There are no IANA actions required for this document.) s
5 533 M
(11. Acknowledgments) s
5 511 M
( We would like to acknowledge feedback and discussions on equation-) s
5 500 M
( based congestion control with a wide range of people, including) s
5 489 M
( members of the Reliable Multicast Research Group, the Reliable) s
5 478 M
( Multicast Transport Working Group, and the End-to-End Research Group.) s
5 467 M
( We would like to thank Ken Lofgren, Mike Luby, Eduardo Urzaiz,) s
5 456 M
( Vladica Stanisic, Randall Stewart, Shushan Wen, and Wendy Lee) s
5 445 M
( \(lhh@zsu.edu.cn\) for feedback on earlier versions of this document,) s
5 434 M
( and to thank Mark Allman for his extensive feedback from using the) s
5 423 M
( document to produce a working implementation.) s
5 401 M
(12. Informational References) s
5 379 M
( [1] Balakrishnan, H., Rahul, H., and S. Seshan, "An Integrated) s
5 368 M
( Congestion Management Architecture for Internet Hosts," Proc. ACM) s
5 357 M
( SIGCOMM, Cambridge, MA, September 1999.) s
5 335 M
( [2] Floyd, S., Handley, M., Padhye, J. and J. Widmer, "Equation-Based) s
5 324 M
( Congestion Control for Unicast Applications", August 2000, Proc.) s
5 313 M
( ACM SIGCOMM 2000.) s
5 291 M
( [3] Floyd, S., Handley, M., Padhye, J. and J. Widmer, "Equation-Based) s
5 280 M
( Congestion Control for Unicast Applications: the Extended) s
5 269 M
( Version", ICSI tech report TR-00-03, March 2000.) s
5 247 M
( [4] Padhye, J., Firoiu, V., Towsley, D. and J. Kurose, "Modeling TCP) s
5 236 M
( Throughput: A Simple Model and its Empirical Validation", Proc.) s
5 225 M
( ACM SIGCOMM 1998.) s
5 203 M
( [5] Paxson V. and M. Allman, "Computing TCP's Retransmission Timer",) s
5 192 M
( RFC 2988, November 2000.) s
5 126 M
(Handley, et. al. Standards Track [Page 22]) s
_R
S
%%Page: (23) 23
%%BeginPageSetup
_S
24 24 translate
/pagenum 23 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
( [6] Ramakrishnan, K., Floyd, S. and D. Black, "The Addition of) s
5 676 M
( Explicit Congestion Notification \(ECN\) to IP", RFC 3168,) s
5 665 M
( September 2001.) s
5 643 M
( [7] Schulzrinne, H., Casner, S., Frederick, R. and V. Jacobson, "RTP:) s
5 632 M
( A Transport Protocol for Real-Time Applications", RFC 1889,) s
5 621 M
( January 1996.) s
5 599 M
( [8] Wetherall, D., Ely, D., N. Spring, S. Savage, and T. Anderson,) s
5 588 M
( "Robust Congestion Signaling", IEEE International Conference on) s
5 577 M
( Network Protocols, November 2001.) s
5 555 M
( [9] Widmer, J., "Equation-Based Congestion Control", Diploma Thesis,) s
5 544 M
( University of Mannheim, February 2000. URL) s
5 533 M
( "http://www.icir.org/tfrc/".) s
5 511 M
(13. Authors' Addresses) s
5 489 M
( Mark Handley) s
5 478 M
( ICIR/ICSI) s
5 467 M
( 1947 Center St, Suite 600) s
5 456 M
( Berkeley, CA 94708) s
5 434 M
( EMail: mjh@icir.org) s
5 401 M
( Sally Floyd) s
5 390 M
( ICIR/ICSI) s
5 379 M
( 1947 Center St, Suite 600) s
5 368 M
( Berkeley, CA 94708) s
5 346 M
( EMail: floyd@icir.org) s
5 313 M
( Jitendra Padhye) s
5 302 M
( Microsoft Research) s
5 280 M
( EMail: padhye@microsoft.com) s
5 247 M
( Joerg Widmer) s
5 236 M
( Lehrstuhl Praktische Informatik IV) s
5 225 M
( Universitat Mannheim) s
5 214 M
( L 15, 16 - Room 415) s
5 203 M
( D-68131 Mannheim) s
5 192 M
( Germany) s
5 170 M
( EMail: widmer@informatik.uni-mannheim.de) s
5 126 M
(Handley, et. al. Standards Track [Page 23]) s
_R
S
%%Page: (24) 24
%%BeginPageSetup
_S
24 24 translate
/pagenum 24 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
5 720 M
(RFC 3448 TFRC: Protocol Specification January 2003) s
5 687 M
(14. Full Copyright Statement) s
5 665 M
( Copyright \(C\) The Internet Society \(2003\). All Rights Reserved.) s
5 643 M
( This document and translations of it may be copied and furnished to) s
5 632 M
( others, and derivative works that comment on or otherwise explain it) s
5 621 M
( or assist in its implementation may be prepared, copied, published) s
5 610 M
( and distributed, in whole or in part, without restriction of any) s
5 599 M
( kind, provided that the above copyright notice and this paragraph are) s
5 588 M
( included on all such copies and derivative works. However, this) s
5 577 M
( document itself may not be modified in any way, such as by removing) s
5 566 M
( the copyright notice or references to the Internet Society or other) s
5 555 M
( Internet organizations, except as needed for the purpose of) s
5 544 M
( developing Internet standards in which case the procedures for) s
5 533 M
( copyrights defined in the Internet Standards process must be) s
5 522 M
( followed, or as required to translate it into languages other than) s
5 511 M
( English.) s
5 489 M
( The limited permissions granted above are perpetual and will not be) s
5 478 M
( revoked by the Internet Society or its successors or assigns.) s
5 456 M
( This document and the information contained herein is provided on an) s
5 445 M
( "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING) s
5 434 M
( TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING) s
5 423 M
( BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION) s
5 412 M
( HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF) s
5 401 M
( MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.) s
5 379 M
(Acknowledgement) s
5 357 M
( Funding for the RFC Editor function is currently provided by the) s
5 346 M
( Internet Society.) s
5 126 M
(Handley, et. al. Standards Track [Page 24]) s
_R
S
%%Page: (25) 25
%%BeginPageSetup
_S
24 24 translate
/pagenum 25 def
/fname (rfc3448.txt) def
/fdir () def
/ftail (rfc3448.txt) def
/user_header_p false def
%%EndPageSetup
_R
S
%%Trailer
%%Pages: 25
%%DocumentNeededResources: font Courier-Bold Courier
%%EOF