TFRC,即TCP-Friendly rate control,是一个为单播流设计的拥塞控制机制,使用了和TCP类似的吞吐量方程,目的是为了在网络中可以和TCP公平地竞争。主要应用场景是应用层需要有平滑的吞吐量,固定报文大小,发生拥塞时,发送码率是秒级地变化。
TFRC是一个基于接收端的机制,也就是说拥塞的计算是在接收端,而不是发送端。基于接收端的机制更适用于广播场景,因为将计算放在接收端,可以将计算分布到分担到各个接收端而不是一个发送端。
【注】TFRC-PS和TFRC不同,报文大小不必相同,可以通过调整报文大小,保持拥有固定发送码率。
TFRC的拥塞控制,基于丢包事件和环路时延建立吞吐量方程,根据这个方程得到发送码率。TCP的吞吐量方程粗略地将发送码率看成是丢包率、环路时延、包大小的方程,因此为了很好地和TCP竞争,TFRC也使用了TCP的吞吐量方程。TFRC里面定义的丢包事件是指,一个以及多个丢包或者是窗口内的被标记的包,这里的mark包用来明确地表明有拥塞Explicit Congestion Notification。
工作机制:
TFRC使用了和TCP类似的方程,输入为丢包事件率和RTT,但是需要注意的是TCP的吞吐量方程考虑到了TCP的重传超时行为,这导致TCP有很高的丢包率。当前TFRC使用的吞吐量方程是Reno TCP的简化版本,作者认为的理想型的是使用SACK TCP模型。
方程如下:
\[X = s / (R*\sqrt{2*b*p/3} + (t\_RTO * (3*\sqrt{3*b*p/8} * p * (1+32*p^2))))\]在TFRC里面把t_RTO简化成t_RTO = 4*R。现在很多TCP延迟确认,即一个包确认多个接收,而很多TCP实现中一个ACK只确认一个接收,因此这里b取1。
发送端的包需要包含以下内容:
接收端发送反馈报文:
数据发送端按照接收端端反馈的码率来发包,如果发送端在两个RTT时间内都没有收到任何反馈包,那么发送端会将其发送码率减半。这由无反馈定时器实现。
这个协议里,假定包大小以来于数据,虽然有变化,而不受码率控制,也就是可以统计出平均包大小。
如果您觉得文章对您有用能够解决您的问题,欢迎您通过扫码进行打赏支持,谢谢!