TCP Friendly Rate Control (TFRC) Protocol Specification

By -
摘要
TFRC 是一个网络拥塞控制机制,它和很公平的和TCP竞争带宽在和并且在吞吐量上比TCP更加平稳。 所以TFRC更适合一些需要平稳带宽的应用如:网络电话、流媒体。
 
介绍
TFRC是一个网络拥塞控制机制而不是一个完整的协议,它可以用在应用层中使用或者在终端拥塞管理系统里面使用。这个文档不讨论报文的格式和可靠性,并且实现相关的问题只会进行简短的讨论。TFRC 在和TCP竞争带宽的时候被设计出表现非常公平,这里的相当公平是指它的发送速率是在同情况下 TCP 发送速率因素两个中的一个。但是随着时间变化 TFRC 比起TCP能在吞吐上表现更加平稳,所以它更加适和对平稳带宽要求非常高的互联网产品,比如说:网络电话、流媒体。
由于 TFRC 比TCP有更加平稳的带宽,造成了它比 TCP 在网络带宽环境变化时相应慢。因此TFRC应该用到哪些需要平稳吞吐的应用程序中,特别是为了避免TCP因为一个丢包就造成了发送速率直接减半的情况。对于哪些只是需要在短时间简单的发送更多数据的程序,我们推荐使用TCP。 或则使用被TCP使用的加法递增(Additive-Increase)和倍数递减(Multiplicative-Decrease)拥塞控制方法在对安全性要求不高的程序中。
TFRC是一个固定包大小和在拥塞控制中使用变化每分钟包发送速率的机制。有一些音频的程序需要固定的包发送间隔和变化的包大小来应对网络拥塞变化。这篇文章描述的拥塞控制机制不能用于这类的应用程序中。 TFRC-PS(for TFRC-PacketSize)是TFRC的一个变体,它使用的是固定包发送速率和变化包大小的策略来应对网络拥塞变化。
TFRC是一个基于包接受者机制(receiver-base mechanism),接受者计算拥塞控制相关的信息(例如:丢包事件率)。这个非常适合那些操作着成千上万的服务器,因为包接受者有更多的内存和CPU计算周期。另外接受者机制更加适合构建多播拥塞控制。
协议机制
对于拥塞协议机制, TFRC直接使用吞吐方程来表征发送速率, 其中发送速率与事件丢失率(loss event rate)和一个数据包的来回时间(round-trip time)相关。为了完全的和TCP竞争, TFRC使用了TCP的一个由3个参数描述的方程(事件丢失率、来回时间、包大小)。这里定义时间丢失率为: 一个或多个包的丢失,或拥塞通知指令标记的包。
通常TFRC拥塞控制机制分为这几步:
  • 接收者计算事件丢失率,然后反馈这些信息到发送者
  • 发送者用这个丢失率来计算来回时间(round-trip time)
  • TFRC使用丢失率和来回时间计算传输率
  • 发送者调整传输率为当前计算的值

TFRC 会因这几个因子的计算方法和实现而变化。 我们这里推荐几个具体的计算方法和实现,当然其他的计算方法也可以,但是要记住他们会实时的影响 TFRC。

1.TCP吞吐方程
任何一个TCP吞吐方程使用的事件丢失率和RTT都能够用在TFRC上。但是我们必须注意TCP的吞吐方程必须反映出TCP的超时重传行为,因为超时重传决定了TCP的吞吐。我们同样要注意一个隐藏在吞吐方程中的假设:方程中的事件丢失率参数必须逼近实际的丢失率(loss rate)或者事件丢失率(loss event rate)。然而下面的吞吐方程和丢失率计算的逼近方法不太完美,但是实际中这个假设证明是非常的接近真实的情况。
我们推荐一个从Reno TCP简化的吞吐方程。理想情况下我们的吞吐方程应该基于SACK TCP,但是没有一个人的实验和仿真愿意这样做。因为这两个方程之间的区别非常小。
简化的吞吐方程如下:
参数的含义如下:
  • X为传输率(bytes/second)
  • S为以字节为单位的包大小
  • R为以秒为但单位的时间
  • p为事件丢失率,其区间为[0, 1.0], 丢失包个数占总传输包的比例
  • t_RTO为以秒为单位超时重传的时间值
  • b每个ACK包确认数据包的个数

我们将更加的简化这个方程 t_RTO = 4 * R。 一个更加精确的计算t_RTO是可能的,但是实验证明这种简化和TCP对比起来是可以接受的。另一个可行的计算方式为:t_RTO = max(4R, one second),这种方式尽量的逼近1秒。

许多当前的TCP链接使用延时确认(delayed acknowledgements),每两个包发送一个 ACK,因此吞吐方程中的b = 2。然而 TCP 也可以每一个数据包发送一次 ACK,这样的话吞吐方程中的b = 1。因为许多 TCP 的实现不适用延时确认的方式,所以我们推荐b = 1。
以后可以是使用各种的 TCP 方程来替换这个方程,唯一的要求就是吞吐方程必须很好的逼近TCP的发送率,这样才能和 TCP 的拥塞控制协议保持一致。 参数s(包大小)、p(丢失率)、R(RTT)的计算方法需要被TFRC实现,关于他们的实现我们将在下面的文章中一一道来。在本文章的后面部分的所以数据传输率都是字节/秒(bytes/second)。
2.包内容
在定义发送者和接受的功能之前,我们描述发送者的数据包内容和接受者反馈包的内容。因为TFRC要依赖于传输层协议,所以我们这里不定义包的格式,这里依赖于传输层协议的具体细节。
2.1 数据包
发送者发送的每个数据包都包含了一下的信息:
  • 序列号. 每发送一个数据包,序列号加1,这个域必须足够的大以至于不会造成两个数据包同事拥有相同的序列号。
  • 时间戳. 表示每个包发送的时间,我们用ts_i表示其中i还表示这个包的序列号。时间戳的精度通常是毫秒级别的。 时间戳被接受者用来确定丢包是属于哪个丢包事件,接受者将会回显时间戳给发送者使发送者能够知道RTT,但是对于发送者而言他们他们不会保存时间戳。

发表评论

电子邮件地址不会被公开。