Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5760352
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: 网络与安全

2009-09-23 14:35:04

TCP拥塞控制机制回顾

   在分析Low-Rate DoS攻击之前,我们先回顾一下TCP的拥塞控制原理。TCP协议采用滑动窗口和差错控制机制实现端到端的流量控制,在实际应用中,这两种机制和其他一些措施结合使用,以达到拥塞检测、拥塞避免、拥塞恢复的目的。这些措施包括:RTT方差估计、指数RTO退避、Karn算法、慢启动、拥塞控制、快速重传、快速恢复等。这些名词还能记得多少;-)没关系,接下来会顺带解释这些名词的。
   TCP的拥塞控制机制的主要作用是使TCP连接在网络发生拥塞时退避(back off),也就是说TCP源端会对网络发出的拥塞信号(congestion notification)如丢包、重复的ACK等,作出响应通过自适应的调整发送端窗口的大小,使网络链路达到最有效的利用。
   在拥塞控制机制下,可将链路状态分为三种情况:慢启动状态、超时重传状态和稳定状态。其中标准TCP稳定状态下主要采用加性增加乘性减少AIMD算法和快速重传/快速恢复算法。

慢启动状态
建立新的TCP连接或者连接从超时中恢复时,链路进入慢启动状态。拥塞窗口(Congestion Window, cwnd)开始设置为一个最大报文段MSS,每接收到一个ACK确认,cwnd就增加一倍,这样cwnd就随着往返时间(Round Trip Time, RTT)呈指数级增长。当cwnd增长到慢启动阈值ssthresh时,链路进入稳定状态,cwnd按线性规律增长。

超时重传状态
如果TCP源端发现其设置的超时重传定时器超时,即认为网络发生了严重拥塞(因为通常传输引起的数据包损坏和丢失是小概率事件)。链路进入超时重传状态,慢启动阈值ssthresh被设置为当前cwnd的一半,重传丢失的数据包,且cwnd被设置为1,链路重新进入慢启动状态。为了获得更好的性能,RFC 2988建议TCP流的RTO的最小值为1s,而且每经历一次超时就增加一倍(RTO指数退避)。

稳定状态
标准版本的TCP当链路处于稳定状态时,使用基于发送窗口的加性增加乘性减少(Additive Increase Multiplicative Decrease, AIMD)算法,对网络状况作出快速反应,以保证链路的稳定性及带宽的享用公平性。加性增大AI:当网络中没有拥塞时,发送窗口cwnd以线性的方式每个往返时间RTT增加一个报文段长度(MSS);乘性减少MD:当网络中出现轻度拥塞时,即TCP源端连续收到3个相同的确认包时,则将其cwnd减半,并重传此包。快速重传是指当TCP源端接收到3个相同的ACK报文,则认为网络出现轻度拥塞,立即重传丢失的报文,而不必等待RTO超时,同时将cwnd减半快速恢复是基于“管道”模型的“数据包守恒”原则,即同一时刻在网络中传输的数据包的数量是恒定的,只有当“旧”数据包离开网络后,才能发送“新”数据包进入网络。如果发送方接收到一个重复的ACK,则认为已经有一个数据包离开网络了,于是拥塞窗口加1。因此如果源端接收到3个相同的ACK报文,则cwnd被设置为(cwnd/2+3)mss。

超时重传机制避免了TCP流在网络拥塞的时候加剧网络拥塞,因为超时已经表明网络严重拥塞了;慢启动算法又使得TCP流在网络拥塞消失后有效的增加吞吐量。快速重传和快速恢复是在网络轻度拥塞时候,TCP采用AIMD算法进行自适应的调整过程,使得TCP流再次趋于稳定。


接下来有两个算法Jacobson算法和Karn算法,这两个算法是用来计算RTT和RTO的。我们已经回顾了TCP的超时重传机制,当一个报文丢失应答后,过了RTO后,会进入超时重传状态。那么这个RTO的值是设置为多少合适呢?时间间隔太短则可能导致大量不必要的重传;太长则导致性能下降。TCP 采用了一个高度动态的算法,来不断的调整时间间隔,这个算法就是 Jacobson 1988 算法。

Jacobson算法:
在此算法中, TCP 需要维护几个变量:
1) RTT:对往返时间的当前最佳估计值
当一个数据段被发送出去后,TCP 启动定时器,如果在定时器过期之前确认数据段回来的话,则 TCP 测量一下这次确认所花的时间 M,然后根据如下公式更新 RTT。

RTT = a*RTT + (1-a)*M
 
其中 a 是平滑因子,典型的值是 7/8
这个公式的意思就是说,旧的 RTT 占有 7/8 的权重,新的往返时间占有 1/8 的权重
2) D:平滑的平均偏差
有了 RTT, 如何选择 RTO 仍然需要考量。
它的计算公式是: D = a*D + (1-a)*|RTT-M|

RTO 的计算公式: RTO = RTT + 4D
注意:RTT往返时间 vs RTO 重传超时

Karn算法:
Jacobson 算法只用于处理正常的情况,但是当发生重传后,如果收到一个确认,这时候就不用这个算法来调整 RTT 值了。因为你无法判断这个确认是针对第一次传输,还是后来的重传。在这种情况下,采用 Karn 算法来调整 RTT 的值

Karn 算法很简单:
1) 对于发生重传的数据段,在收到确认后,不更新 RTT
2) 在重传的时候,RTO 是倍增的,直到达到最大值的限制。如果重传超过一定的次数,TCP 连接会断开
3) 在重传并收到确认后,如果下一次的数据段没有发生重传(即一次性收到确认),则又恢复 Jacobson 算法


具体的测量和计算过程,可以参考《TCP/IP详解 卷1:协议》的12.4节"往返时间RTT的例子"。

低速率拒绝服务攻击原理

低速率拒绝服务(Low-Rate Denial of Service, LDoS)攻击,也被称为脉冲式拒绝服务(Pulsing-based denial of service, PDoS)攻击。LDoS主要是利用端系统或网络中常见的自适应机制所存在的安全漏洞,通过低速率周期性攻击流,使得TCP流吞吐量严重下降。由于只是脉冲性数据流,不是持续的flood数据流,相对数据量和速度都偏小,因此被称为低速率拒绝服务攻击。

LDoS攻击的核心思想在于攻击瓶颈链路或者是路由器,在瞬间产生拥塞,导致大量TCP报文丢失,迫使网络发出拥塞信号(丢包,对端重传的ACK),使得源端的TCP拥塞控制机制启用,进行自适应的调整发送窗口大小,尝试恢复到稳定状态。周期性的进行攻击,就会造成TCP性能的震荡,严重降低TCP的吞吐量。
自适应协议在设计的时候主要注重的是系统稳态时的有效性、公平性和稳定性,对其安全性考虑不多,这就导致了其自身的脆弱性。为了使系统达到最高性能,系统或网络协议往往假设系统大部分时间都是处于稳定状态的,并全力保证系统稳定状态的性能,却忽略了系统的暂态性能,即系统不稳定以及从不稳定到稳定状态转换过程中的性能。LDoS攻击利用系统的暂态性能比较低的特征,通过周期性发起一定强度的攻击流,使系统不断在失效和稳定两个状态切换,即总是处于低效暂态,从而降低系统的整体性能。

针对TCP拥塞控制机制,其失效条件为丢包或者是重复的ACK,这些失效条件将会导致TCP传输进入暂态。通常来讲当网络发生拥塞的时候,才会出现上面的失效条件。那么,作为攻击者,应该如何构造这些失效条件呢?LDoS大部分时间内保持沉默,而在特定时刻,短时间内发送脉冲式攻击流,造成部分网络数据包丢失,使得TCP发送方误认为存在拥塞,根据其超时重传和AIMD等自适应机制重传数据包并减小拥塞窗口的大小。

目前提出的LDoS攻击按其攻击所利用的脆弱性不同,大致可分为针对TCP拥塞控制机制和针对路由器主动队列管理机制两大类。这里,我们主要关注针对TCP拥塞控制机制的LDoS。对于针对TCP拥塞控制机制的LDoS攻击,又分为:基于重传超时机制的LDoS攻击和基于AIMD机制的LDoS攻击。

基于超时重传机制的LDoS攻击
根据TCP超时重传机制,发送端为发送出去的每个报文段设置一个定时器,如果在收到对该报文的确认之前定时器就超时了,则发送端将其发送窗口Cwnd减为1,然后重新发送此包,并根据指数退避算法将RTO设置为原先的2倍,等待应答包的到来,如果重传包依然超时,则继续重传,直到重传成功或放弃重传;如果重传成功,则系统进入慢启动状态。因此,如果攻击者精确的直到TCP发送方每次发送报文设置的RTO值,在其每次重传数据包的时候发动脉冲攻击,从而使得每次重传都失败,这样攻击达到最完美的效果:拥塞窗口一直保持为1,吞吐量为0。

上面描述的是基于超时重传机制的同步LDoS攻击,这种攻击仅限于理论上,因为它要求攻击者对RTO把握的非常精确,在实际网络中很难得以实现。另外一种简单的方法是使攻击流具有固定周期,这种攻击称为异步攻击,其脉冲发送时间点与重传定时器的超时并不重合。

基于AIMD机制的LDoS攻击
与基于超时重传机制的LDoS攻击不同,基于AIMD机制的LDoS攻击所发出的攻击脉冲强度稍弱,只会引起网络的轻度拥塞,TCP发送方所接收到的拥塞信号是3个重复的ACK包,而不是重传定时器超时。在基于AIMD的LDoS攻击下,链路始终处于AIMD状态下,而不会尽入超时重传或者是慢启动状态,但是其拥塞窗口是不断减小的,系统性能逐步下降,最后拥塞窗口减小到一个极限值并维持在这个极限值左右不变,系统性能达到最差,且无法恢复。

注意:基于重传超时机制的LDoS攻击能够使发送窗口维持在1附近,基于AIMD的LDoS攻击能够使发送窗口进行逐步收敛,在一个很小值附近。

参考:
1. TCP/IP详解 卷1:协议 第21章 TCP的超时与重传
2. http://blog.csdn.net/rstevens/archive/2007/05/30/1631752.aspx TCP的超时重传
3. 低速率拒绝服务攻击研究综述 何炎祥,刘陶,曹强,熊琦,韩奕
4. 脉冲式拒绝服务攻击及其防御 陆伟宙,余顺争
阅读(7271) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~