当前的TCP 实现将TCP 端节点之间的中间网络视为一个不透明的“黑盒”。TCP 包进入和流出这个盒子。有些时候进入盒子的包被丢失了。因为今天的数字和光媒体上出现比特级错误的机会非常少,TCP 的设计者们就假设包的丢失很大程度上是因为路由器的拥塞,也即是路由器用来容纳进入包的缓冲已经被填满了,这样路由器会静默地丢弃接下来进入的包。
尽管TCP可以检测到TCP包的丢失并且进行重传,但是从TCP处理过程,重传过程和吞吐率下降这些方面看,这个重传过程将会耗费很大。
当一个发送的TCP端节点检测倒一个包丢失时,可以进行快速重传或者包的重传计时器超时而重传。然后该TCP端节点减小发送窗口(在等待响应之前可以发送的包数量),进行慢启动和拥塞避免算法(RFC 2001)。这会立刻降低发送端的发送速率,以便路由器来减轻拥塞。发送端会逐渐将发送窗口恢复倒拥塞发生前的大小。
尽管因为路由器拥塞而产生的包丢失是偶然发生的事件,它们并不会负面地影响块数据传输,只是会增加一些重传数据包和恢复发送速率的时间。慢启动和拥塞避免算法对于时间敏感的,成块数据流的控制效果非常好。然而,TCP处理丢包的方法对于交互式的,丢失敏感和时间敏感的流量来说效果不是很好。
另外一个关于路由器拥塞的问题是拥塞对于多个数据流的影响。当路由器开始丢弃进入的数据包时,它一般并不区分数据流的不同。当多个TCP数据流都产生包丢失时,所有的数据流都要减少自身的发送速率。根据路由器拥塞减轻的程度,多个TCP数据流将会逐渐恢复自身的发送速率。这会降低路由器及相关链路的使用率,直到所有的TCP数据流恢复到以拥塞之前的速率进行发送。路由器从拥塞状态又进入到了低使用状态。
这种拥塞后因为重传和低链路使用而带来的吞吐量问题,是仅仅通过发送端来管理拥塞的结果。为了避免因为路由器拥塞而带来的丢包而产生的一系列问题,TCP/IP的设计者们创建了一些用于主机和路由器的标准。这些标准描述了在IP路由器上进行的主动队列管理算法(AQM)(RFC 2309),使得路由器能够监控转发队列的状态,以提供一个路由器向发送端报告发生拥塞的机制,让发送端在路由器开始丢包前降低发送速率。这种路由器报告和主机响应机制被称为显式拥塞通告(ECN)(RFC 3168)。
当拥塞发生时,发送主机必须仍然在降低它们的发送速率。然而,通过避免包的丢失,发送主机无需进入重传过程,丢失敏感的数据包流也不会因为拥塞而受到很大影响。
显式拥塞通告
IP和TCP使用包头中的未使用字段来支持ECN。
在网络层(IP),一个发送主机必须能够表明自身可以进行ECN,路由器在转发时必须能够表明它正在经历拥塞。
在传输层(TCP),TCP端必须对对方表明自身是可以进行ECN操作的。接收端必须能够通知发送端它收到了一个来自路由器的拥塞通告。发送端必须能够通知接收端它受到了来自接收端的通告并且已经降低了发送速率。
IP包头中的8位的服务类型域(TOS)原先在RFC791中被定义为表明包的发送优先级,时延,吞吐量,可靠性和消耗等特征。在RFC2474中被重新定义为包含一个6位的区分服务码点(DSCP)和两个未用的位。DSCP值表明一个在路由器上配置的和队列相关联的发送优先级。IP对ECN的支持使用到了TOS域中剩下的这两位。如图1所示。
在RFC2474中TOS域未使用的两位在RFC3168中被定义为ECN域,包含如下值:
00:发送主机不支持ECN
01或者10:发送主机支持ECN
11:路由器正在经历拥塞
一个支持ECN的主机发送数据包时将ECN设置为01或者10。对于支持ECN的主机发送的包,如果路径上的路由器支持ECN并且经历拥塞,它将ECN域设置为11。如果该数值已经被设置为11,那么下游路径上的路由器不会修改该值。
|