流量控制h3c 流量整形形有什么区别

1543人阅读
Cisco与网络技术(83)
流量整形流量整形通过减少外出流量的速率来强迫流量遵循某种带宽的分配限制。不像流量监管会丢弃超过突发尺寸的流量,它是将突发的流量放入到流量整形的缓冲区中,当带宽可用时,再将它们发送出去,或者是当缓冲的数据包的数量低于配置的限制时,再发送出去,因此平滑流量的输出。
注意:流量整形并不替代正常的电路配置。它设计的主要目的是平滑流量的突发。流量整形不给一个接口提供额外的带宽,接口在持续拥塞的情况下还是会丢弃数据包。
流量整形使用一种令牌桶的系统来决定是否传输、延迟或者丢弃新的数据包。使用这种令牌桶系统,每一个接口都有承诺的信息速率(CIR),它是在一个时间段内接口能够传输数据包的速率。持续突发速率(Bc)定义了在一个时间间隔内令牌桶可以含有的最大令牌数。当数据包到达一个接口后,它就会从令牌桶中取出一个令牌。当数据包被发送以后,令牌就会释放。当过了时间间隔(Tc)后,这个令牌就会回到令牌桶中。如果令牌桶空了,任何新到达那个接口的数据包都会被放到队列中,直到时间间隔过去,令牌又重新填入。如果CIR持续超过,令牌就会以大于它们添加的速度从令牌桶中挪走,而去填充队列并且导致数据包被丢弃掉。好的流量整形设计的关键时间里的令牌桶能够持续的有足够的令牌来排队或者转发每一个数据包,当数据包从缓冲区移走并且发送后可以替换令牌。
通用流量整形
流量整形可以应用到一些不同的二层技术中去,例如以太、ATM(可变比特率VBR和可用比特率ABR)、HDLC、PPP(ISDN和拨号接口不支持)和帧中继。除了帧中继外,所有的这些技术都支持通用流量整形(GTS),GTS有能力在每一个接口的基础上平滑输出的流量。GTS也可以整形在访问控制列表中定义的某种类型的流量,通过在流量整形中指定组来实现。
CIR:承诺信息速率,这个速率指的是流量在正常情况下发送的速率。
Bc:持续突发速率,指的是在每个时间间隔内流量被允许突发超出正常流量速率的速率,以比特表示。
Be:过量突发速率,是指在第一个时间间隔内,流量被允许突发超出持续突发速率的速率。
Tc:时间间隔,每隔一个Tc,流量会被填充到流量整形的令牌桶中。为了正确配置流量整形,首先必须知道流量整形用于填充令牌桶的时间间隔,通过使用下面的公式:Tc=Bc/CIR。
注意:流量整形的时间间隔不能小于10ms或者大于125ms。路由器基于Tc=Bc/CIR的公式发现最好的时间间隔。默认的时间间隔是125ms。这个时间间隔是CIR和Bc配置的结果,用户不可配置。思科建议Bc应当是CIR的1/8,他将会在每秒钟内产生8个125ms的时间间隔。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:585154次
积分:8573
积分:8573
排名:第1951名
原创:285篇
转载:18篇
评论:80条
(2)(1)(1)(2)(2)(2)(1)(1)(1)(3)(1)(1)(5)(2)(1)(1)(1)(1)(2)(1)(2)(1)(1)(1)(1)(6)(1)(1)(1)(2)(3)(1)(3)(1)(1)(3)(1)(1)(1)(2)(4)(5)(16)(9)(3)(4)(4)(2)(11)(5)(1)(3)(5)(1)(2)(2)(4)(3)(2)(2)(1)(1)(1)(2)(2)(2)(1)(2)(1)(8)(5)(4)(4)(2)(1)(1)(30)(5)(1)(10)(15)(9)(10)(4)(11)(2)(15)(6)kingsir827 的BLOG
用户名:kingsir827
文章数:160
评论数:137
访问量:139978
注册日期:
阅读量:5863
阅读量:12276
阅读量:413687
阅读量:1101466
51CTO推荐博文
理解流量控制(整形和监管行为)流量控制是对已经成功分类的具体流量执行的一种管制行为,这控制行为从实施特性上大致可分为两种:流量监管(policing),事实上就是限速,如果可能它将超过限定速率的流量丢弃,或者重标记流量行为,流量整形(shaping)事实上就是尽量最大努力缓存并平滑流量,这两种行为将导致两种不同的现象。在开始描述监管(policing)和整形(shaping)之间还必须得来清晰的理解两个给流量控制密切相关的专业术语:接入速率与认购速率。注意:流量控制技术包括了流量整形和流量监管,但是它们的实质和效果是完全不一样!&理解接入速率AR与认购速率CIR接入速率(Access Rate):&&& 是指物理接口的接入速率,如图中S1/0接口的 128Kbit/s,就是接入速度,如果是T1的接入速率就是1.544MB,通常接入速度是以物理传输介质的时钟频率所决定的。请严格区别接入速度和认购速率的差异,如果您的接入128Kbit/s,但是认购速率只有64Kbit/s,那么您的网络设备将采取这样一个行为:网络设备接口发送数据是还是以128Kbit/s来发送,因为这是一个物理事实,无法改变。但是当通过运营商的接入层后,你们的流量将被限制在认购速率之内,也就是64Kbit/s,否则运营商的网络将会因为用户的高速的接入速率而过载。认购速率(traffic contract):认购流量也叫“契约流量”,所谓契约流量就是指用户花钱在ISP(Internet服务供应商)处购买的网络流速,这个速度是指ISP在任何时候都应该为用户保障的速率。通常它还有一个名称叫CIR(承诺信息速率CommittedInformation Rate),打个更实际更好理解的比喻:当您安装宽带业务时,业务员通常都会给您讲他们的宽带是100MB,1000MB光纤接入到桌面,但当你签订认购合同时(宽带服务合同),通常在那张纸上的认购流量速率(也就是CIR)一般都只有1MB、1.5MB、2MB、4MB等。此时您可能会想:业务员推销宽带时所描述的100MB,1000MB光纤接入到桌面那不正是在忽悠大众吗?其实也不能这么说,因为业务员所描述的是接入速率(AR)而非承诺速率,通常您只能充分使用花钱购买的认购速率也就是CIR所规定的带宽范围,您可以当这是种“扬长避短”的销售技巧。换而言之,虽然用户可能有很高的接入速率,比如现今的PC机的网卡基本上都可以达到1G的速率,但是这个高接入速率会被ISP运营商限制到给您的认购速率(承诺速率)之内。&提问: ISP运营商如何将用户速率控制在其认购速率之内?通常ISP运营商都会通过policing(监管)行为,将用户使用接入速率发送的流量限制在认购速率之内,关于流量监管到底是怎么做的,后面会详细描述理论和演示相关的实验,这里不得不提到的一个注意事项就是其实用户也需要使用shaping(整形)技术,将接入速率整形为适应认购速率(后面就叫CIR)的行为,如果是主机,一般能自动完成,因为主机上存在QOS数据包的计划程序,如果企业接入ISP的边界路由器,那么就需要执行手工的流量整形配置。当然这也是在流量控制部分要掌握的重点。&理解流量控制中的监管(限速)行为:&&&& 如图5所示,为流量的监管前后的示意图,可清晰的看出,没有被监管之前的流量,在限定速率之上的那部分,在执行监管这后,流量的波峰被丢弃,流量监管这种行为仅仅是对超过限定速率的流量进行丢弃或者重标记流量(一般重标记会降级流量的优先程度),不对流量做缓存,所以不会为那些没有超过限定的流量造成更大的延迟。更直接的讲流量监管实际上是一种限速行为,超额部分被丢弃的流量会引发重传。实践行为:一般什么时候实施流量监管?从实践角度讲,如果一个用户网络发送过多的流量,比如以接入速率发送了超过认购速率范围以外的数据到一个另一个网络,比如:比如用户只购买了2MB的速率,但是用户却以100MB或者1G的物理速率发送数据到运营商的网络,那么这个时候,用户过多的数据发送会导致运营商的网络过载,所以此时需要在运营商的接入设备上(事实上也就是面向用户的第一个接入设备),实现流量监管。将用户流量监管到认购速率之内。还有就是需要对特定的某种类别的流量限制在一个特定的速率上,可以使用流量监管,这种情况通常发生在ISP运营商和用户之间就某项类别的流量达成了一项服务等级的协订。如果需要将超过特点限制的流量进行重标记,通常是降低它的紧急程度,那么建议使用流量监管。因为流量监管有重标记流量的功能。&12.4.4理解流量控制中的整形(缓存)行为:流量整形与流量监管有着不同的实质,流量整形是将超过限额的流量进行缓存,然后基于特定的策略和规则来传递这部分缓存的流量,达到平滑流量的效果。如图6所示,超过整形速率之上的流量在被实施流量整形后,这部分超额流量将以换回更大的转发延迟为代价来得到发送,而不是丢弃,所以在图6的环境中虚线所示的流量就是被整形后的流量,可看出它更加的平滑,但是在时间轴上的转发延迟将更大。那么流量整形会不会丢包?回答是尽量不丢弃,尽量缓存,但是,当缓存的流量到达缓存区的极限时,流量还是会被丢弃,但这种丢弃与流量监管的丢弃是两种不同的实质,流量整形的丢弃,是“迫不得已,不得不丢”。实践行为:一般什么时候实施流量整形?从实践的角度讲主要有两个原因要求用户必须执行流量整形: 第一个原因:一般应用到一个邻居网络执行了流量监管(限制)环境中,比如ISP运营商会对用户的网络进行监管到认购流量范围之内(花钱支持的那部分流量),在这种情况下如果用户不对其自己的流量进行整形,比如一个较高的接入速率向ISP运营商发送数据,那么这样做的后果将会其得ISP的监管策略将用户的大量数据丢弃,流量整形就让用户的数据以加大延迟为代价来避免数据被丢弃,因为不加选择的丢弃数据并不是一个好事情,特别是大量的丢弃TCP数据,会造成整个网络的全局同步,关于“全局同步”的问题将在拥塞管理与避免时作更多说明。第二个原因:由于网络边界设备的出口拥塞,那在产生拥塞的接口上应用流量整形,可以避免,或者说至少可以缓解拥塞。&12.4.5流量监管和流量整形的差异:1 流量监管和整形都是对流量的一种控制机制,监管是限定速率,丢弃超额,或者重标记流量,流量整形是尽量缓存,平滑流量,只有当缓存被充满时,才丢弃。2 流量监管可以用于出站或者入站方向,而流量整形需要缓存数据,只能应用于出站方向。3 流量监管有重标记数据的能力,而流量整形没有标记能力。4 由于流量整形需要缓存流量,所以它需要消耗内存,因为超额流量会在下一个周期被发送,所以会造成可变的延迟和抖动;而流量监管不需要缓存数据所以不会消耗内存,由于丢弃超额流量,所以不会产生可变的延迟。5 在某些情况下,流量整形会基于网络信号进行响应,比如:拥塞通知。流量监管是不需要。本文出自 “” 博客,谢绝转载!
了这篇文章
类别:┆阅读(0)┆评论(0)Redis 与网络流量整形 - 文章 - 伯乐在线
& Redis 与网络流量整形
我们希望服务器能在请求流量的控制上有一定的自动控制能力;本文通过简介令牌桶算法和讨论算法的 redis 实现给出流量整形(traffic shaping)的示例,来介绍网络流量整形。
令牌桶算法
(token bucket) 并不是网络流量整形中的奇技淫巧,而是非常常用的算法,从百度百科上已经可以对它有一个概括的了解。对此算法的深入读者可自行查阅研究,这里我通俗化的来解释一下这个算法。
在令牌桶算法中,每一个访客都拥有一个独立的“令牌桶”,在这个“令牌桶”里放了一些“令牌”,访客每次来访都会消耗“令牌桶”中的“令牌”,如果“令牌桶”空了,将会对访客做特殊处理(如拒绝其继续访问以达到限流的目的)。
问题一:访客来访是一个持续的过程,如果最初的“令牌”数目固定,“令牌桶”中的令牌会慢慢被消耗殆尽,这样正常的访客也将无法访问—-所以我们需要以一个恒定的速率来向“令牌桶”中添加一定数量的“令牌”, 这样就可以让访客持续的访问。
问题二:我们以一个恒定速率向“令牌桶”中添加“令牌”, 那么如果访客一直没来访他的“令牌桶”岂不会累积大量“令牌”么?—-所以,我们设定“令牌桶”中“令牌”的最大数量,“令牌桶”满了就不需要再去添加了。这解决了“令牌”累积的问题,也使它更像一个“桶”。
如此,“令牌桶算法”中的重要的参数有:1. 给“令牌桶”添加“令牌”的速率(如果访客以这个速率消耗令牌,将一直不会被限流); 2. “令牌桶”的容量(如果消耗令牌的速率大于添加令牌的速率,将消耗桶中的存货,如果消耗速率过大,令牌会被消耗殆尽,访客将被限流)。注意:一般情况下“令牌桶”最初的状态是满的。
作为优秀的内存数据库,redis 可以帮助我们在应用层次快速响应。本文不过多赘述 redis 的优劣,你可以用 redis 做很多事情,在网络流量整形方面,它是很好的实现方案, 下面我们来解析这样一个方案。
Show me the
说明:这是一段 Python 代码,这段代码来自 GitHub 用户 。为了使逻辑更清楚,我修改了代码的部分内容和注释,以下是修改后的代码,我们用这段代码来看令牌桶算法的 redis 实现。
import redis
from redis import WatchError
import time
# 向令牌桶中添加令牌的速率
RATE = 0.1
# 令牌桶的最大容量
DEFAULT = 100
# redis key 的过期时间
TIMEOUT = 60 * 60
r = redis.Redis()
def token_bucket(tokens, key):
pipe = r.pipeline()
pipe.watch('%s:available' % key)
pipe.watch('%s:ts' % key)
current_ts = time.time()
# 获取令牌桶中剩余令牌
old_tokens = pipe.get('%s:available' % key)
if old_tokens is None:
current_tokens = DEFAULT
old_ts = pipe.get('%s:ts' % key)
# 通过时间戳计算这段时间内应该添加多少令牌,如果桶满,令牌数取桶满数。
current_tokens = float(old_tokens) + min(
(current_ts - float(old_ts)) * RATE,
DEFAULT - float(old_tokens)
# 判断剩余令牌是否足够
if 0 &= tokens &= current_tokens:
current_tokens -= tokens
consumes = True
consumes = False
# 以下动作为更新 redis 中key的值,并跳出循环返回结果。
pipe.multi()
pipe.set('%s:available' % key, current_tokens)
pipe.expire('%s:available' % key, TIMEOUT)
pipe.set('%s:ts' % key, current_ts)
pipe.expire('%s:ts' % key, TIMEOUT)
pipe.execute()
except WatchError:
pipe.reset()
return consumes
if __name__ == "__main__":
tokens = 5
key = '192.168.1.1'
if token_bucket(tokens, key):
print 'haz tokens'
print 'cant haz tokens'
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
import redisfrom redis import WatchErrorimport time&# 向令牌桶中添加令牌的速率RATE = 0.1&&# 令牌桶的最大容量&&&&&& DEFAULT = 100 # redis key 的过期时间TIMEOUT = 60 * 60 &r = redis.Redis()&def token_bucket(tokens, key):&&&&&pipe = r.pipeline()&&&&while 1:&&&&&&&&try:&&&&&&&&&&&&pipe.watch('%s:available' % key) &&&&&&&&&&&&pipe.watch('%s:ts' % key)&&&&&&&&&&&&&&&&&current_ts = time.time()&&&&&&&&&&&&&# 获取令牌桶中剩余令牌&&&&&&&&&&&&old_tokens = pipe.get('%s:available' % key)&&&&&&&&&&&&if old_tokens is None:&&&&&&&&&&&&&&&&current_tokens = DEFAULT&&&&&&&&&&&&else:&&&&&&&&&&&&&&&&old_ts = pipe.get('%s:ts' % key)&&&&&&&&&&&&&&&&# 通过时间戳计算这段时间内应该添加多少令牌,如果桶满,令牌数取桶满数。&&&&&&&&&&&&&&&&current_tokens = float(old_tokens) + min(&&&&&&&&&&&&&&&&&&&&(current_ts - float(old_ts)) * RATE,&&&&&&&&&&&&&&&&&&&&DEFAULT - float(old_tokens)&&&&&&&&&&&&&&&&&&)&&&&&&&&&&&&# 判断剩余令牌是否足够&&&&&&&&&&&&if 0 &= tokens &= current_tokens: &&&&&&&&&&&&&&&&current_tokens -= tokens &&&&&&&&&&&&&&&&consumes = True &&&&&&&&&&&&else: &&&&&&&&&&&&&&&&consumes = False &&&&&&&&&&&&&# 以下动作为更新 redis 中key的值,并跳出循环返回结果。&&&&&&&&&&&&pipe.multi() &&&&&&&&&&&&pipe.set('%s:available' % key, current_tokens) &&&&&&&&&&&&pipe.expire('%s:available' % key, TIMEOUT) &&&&&&&&&&&&pipe.set('%s:ts' % key, current_ts) &&&&&&&&&&&&pipe.expire('%s:ts' % key, TIMEOUT) &&&&&&&&&&&&pipe.execute() &&&&&&&&&&&&break &&&&&&&&except WatchError: &&&&&&&&&&&&continue &&&&&&&&finally: &&&&&&&&&&&&pipe.reset() &&&&return consumes &if __name__ == "__main__": &&&&tokens = 5 &&&&key = '192.168.1.1' &&&&if token_bucket(tokens, key): &&&&&&&&print 'haz tokens' &&&&else: &&&&&&&&print 'cant haz tokens'
需要说的几点
1. 这段代码在网络流量整形策略中起到什么作用?
对访客的一次访问,我们通过以上代码可以来判断此次访问是否超过了我们的限制,通过返回的判断结果,我们将对此次访问选择正确的处理策略,比如你可以拒绝消耗完令牌的访客进行访问,从而控制他的访问速率,从而达到网络流量整形的目的。
redis 在其中如何工作?
对于每个独立的访客,redis 会为他建立两个 key,一个 key 保存了剩余令牌的数量,另外一个 key 保存了最近一次访问的时间戳。其中,最近一次访问时间戳在新访问到来时候用于计算时间间隔,从而计算在此时间间隔内应该向令牌桶中添加多少令牌,进而获得当前令牌桶的剩余令牌数。
redis pipe 起到什么作用?
我们看到代码中 while 循环,执行了 redis pipe 中的 watch 动作,这是对
的使用。 这使这里的算法能处理并发的来访。在 redis 中,事务执行是对 redis key 的一个加锁的操作,一个事务没有执行完,别的动作将无法操作这个 key ,代码中循环执行 watch 动作,就是去检查当前 key 是否有未执行完毕的事务,只有所有事务都执行的时候才可能进入执行体,完成令牌判断或者消耗。 —— 这样避免了并发的访问在 set redis key 时候的混乱。
代码中 RATE 和 DEFAULT 为主要参数,分别代表每秒钟消耗令牌的速率,和令牌桶的容量。通过调整这两个参数来控制你想要的访问速率。
这是一个实用的方式来完成网络流量整形,可以有效控制一些爆发式的流量访问,使访问更加平滑容易控制。
打赏支持我写出更多好文章,谢谢!
打赏支持我写出更多好文章,谢谢!
任选一种支付方式
关于作者:
可能感兴趣的话题
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线}

我要回帖

更多关于 netty 流量整形 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信