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. 脉冲式拒绝服务攻击及其防御 陆伟宙,余顺争

linux c 拒绝服务攻击,低速率拒绝服务攻击原理相关推荐

  1. 羊城杯 Crypto RRRRRRRSA (连分数,低解密指数攻击原理)

    题面 import hashlib import sympy from Crypto.Util.number import *flag = 'GWHT{************}'flag1 = fl ...

  2. linux洪水攻击软件,SYN洪水攻击工具hping SYN-Flooding tool

    这是SYN洪水攻击工具hping SYN-Flooding tool,是一個網路工具,可以用來測試firewall, 網路效能, 觀察遠端主機的回應狀態,包括TCP,UDP,ICMP. 软件介绍 前段 ...

  3. linux禁止ping, 服务器防止ping拒绝服务网络攻击

    linux禁止ping, 服务器防止ping拒绝服务网络攻击 为了服务器的安全, 防止网络攻击(DOS 攻击消耗网络宽带,CPU资源), 需要服务器设置 禁止ping 通常有两种方式 第一种是通过防火 ...

  4. 利用Linux下DDOS工具tfn2k进行DDOS攻击试验

    "Tribe Flood Network 2000 (TFN2K)是一款分布式拒绝服务(DDOS)的攻击工具.TFN2K是由德国著名黑客Mixter编写的同类攻击工具TFN的后续版本.本文将 ...

  5. 低解密指数攻击_CTF中RSA的一些攻击思路

    本文为看雪论坛优秀文章看雪论坛作者ID:丿feng本文简略总结了前人的一些RSA攻击思路,代码或来源于网上或本人原创.并已在GitHub上开源,github地址:https://github.com/ ...

  6. 在Linux上使用netstat命令查证DDOS攻击的方法

    导读 DOS攻击或者DDOS攻击是试图让机器或者网络资源不可用的攻击.这种攻击的攻击目标网站或者服务通常是托管在高防服务器比如银行,信用卡支付网管,甚至根域名服务器. 服务器出现缓慢的状况可能由很多事 ...

  7. Linux Kernel ‘_xfs_buf_find()’函数空指针引用拒绝服务漏洞

    漏洞名称: Linux Kernel '_xfs_buf_find()'函数空指针引用拒绝服务漏洞 CNNVD编号: CNNVD-201303-071 发布时间: 2013-03-06 更新时间: 2 ...

  8. linux查看发起ddos攻击的ip,在Linux上使用netstat命令查证DDOS攻击的方法

    导读 DOS攻击或者DDOS攻击是试图让机器或者网络资源不可用的攻击.这种攻击的攻击目标网站或者服务通常是托管在高防服务器比如银行,信用卡支付网管,甚至根域名服务器. 服务器出现缓慢的状况可能由很多事 ...

  9. linux文件描述符导致squid拒绝服务

    linux文件描述符导致squid拒绝服务   前几天因工作需要在RHEL4.8上面架设了一个squid双网代理,刚开始测试一切正常,然后就在前台负载均衡服务器把这个代理地址加上,运行一段时间后,客服 ...

  10. Extremely hard RSA 低加密指数攻击

    题目说明 没想到RSA4096都被你给破了,一定是我的问题,给了你太多信息,这次我只给你一个flag的加密值和公钥(Extremely hard RSA),仍然是RSA4096,我就不信你还能解出来. ...

最新文章

  1. 安装完DevExpress14.2.5,如何破解它呢?
  2. 微型计算机一般按字长进行分类,关于计算机中:字,字节,字长,位的关系
  3. 一维数组的求平均成绩 Day06
  4. python语言程序设计基础第二版第六章答案-Python语言程序设计基础(第2版) 课后题 第六章...
  5. Fully Convolutional Networks for Semantic Segmentation (FCN)论文翻译和理解
  6. setTimeout使用问题
  7. spring boot微服务通用部署启动脚本
  8. android彻底关闭应用程序方法
  9. linux如何调试脚本文件目录,如何在Linux下调试Bash Shell脚本的方法
  10. PAT练习题:D进制的A+B(C++)
  11. 向“3+1” SQLServer2008集群增加磁盘
  12. python判断线程结束_判断Threading.start新线程是否执行完毕的实例
  13. java8 function 多线程安全_Java8新特性_传统时间格式化的线程安全问题
  14. VB查询ACCESS数据库内容
  15. Python学习笔记(三)列表
  16. HTML渐变背景不重复,CSS背景渐变重复问题
  17. 为什么我们不应该使用微信或者 QQ 作为团队协作的 IM 工具?
  18. 利用计算机可以干什么,打开电脑不知道干什么 多个领域运用广【图解】
  19. 用ArcMap打开MXD文件报One or more layers failed to draw错误!
  20. springboot的Sort排序时遇到的问题 has private access in ‘org.springframework.data.domain.Sort‘

热门文章

  1. Java笔记-递归(汉洛塔)
  2. USB转串口电路之CH340G
  3. 一个Logo道出了DELL EMC存储的追求与梦想
  4. Linux应急响应排查
  5. 企业信息与网络通信安全 团队成员简历-叶俊 (转)
  6. 编译QT项目出现错误:error C2144: syntax error : 'void' should be preceded by ';'
  7. python:实现base64加密和base64解密算法(附完整源码)
  8. 我的练习项目: 模拟淘宝搜索商品、添加商品到购物车功能、修改商品信息功能
  9. VirtualXposed框架里点权限管理-XPrivacyLua下载安装失败
  10. Python-docx 读写 Word 文档:插入图片、表格,设置表格样式,章节,页眉页脚等