[原创]dummynet的pipe限速误区一则_VMware, Unix及操作系统讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  VMware, Unix及操作系统讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3522 | 回复: 0   主题: [原创]dummynet的pipe限速误区一则        下一篇 
wulcan
版主
等级:中校
经验:1795
发帖:124
精华:0
注册:2014-3-19
状态:离线
发送短消息息给wulcan 加好友    发送短消息息给wulcan 发消息
发表于: IP:您无权察看 2015-1-26 8:13:28 | [全部帖] [楼主帖] 楼主

    dummynet的限速功能是非常强悍的,早期pf限速都使用dummynet,但是有很多新手老是抱怨出问题,特别是使用pipe以后,网速变的特别慢,即使是FreeBSD的官方论坛,每隔几页就会有个抱怨pipe的帖子。
  其实不是dummynet不好用,而是方法不对。
  大多数新手把限速设置为下面的语句:

ipfw pipe 10 config bw 300Kbit/s
ipfw add pipe 10 ip from any to any out via em0


  想籍此规则达到出口300K的目的,但一旦加上此规则后,会发现网速明显变慢,甚至连30k的速度都达不到。

  是什么原因呢?

  顾名思义,pipe就相当于一个水管,上面的语句定义了一个300Kbit/s的水管,水再多也就按照这个水管慢慢跑。

  但是还有个问题,就是多少个IP用这一个水管?或者换一种说法:是一个IP一根水管,还是所有的IP一个水管?再深入一点的问题:哪个参数决定了多少个IP共用一个水管?

  其实在ipfw的man中,明确提到了这个参数,就是mask,但是说的不是太明确。

Packets sent to a given pipe    or queue by an ipfw rule can be further classified into    multiple flows,    each of    which is then sent to a different dynamic pipe or queue.  A flow identifier is constructed by masking the IP addresses, ports and protocol types as specified with the mask options in the configuration of the pipe or queue.  For each different flow identifier, a new pipe or queue is created with the same parameters as the original object, and matching packets are sent to it.


  这段文字的意思是:ipfw送到pipe或queue的数据包,会被分成多个流,然后再把这些流送到不同的动态pipe或queue。一个流的标识是由mask参数所masking的IP、端口或协议类型所组成的。为每一个同的流而创建新的pipe或queue。

   这个说明稍微有点模糊,基本上表达了它的意思。但是没有说明一个流的标识符到底是怎么样masking的,经常编程的人一般都能明白,但大多数人可就没有那么幸运了。

  其实masking就是求“AND”的过程,比如IP,把进来的IP和mask相“与”,结果就是流的标识符。
  比如mask设置为0x000000ff,数据包的IP是192.168.0.11,两者求“与”,结果就是11,那么就会为这个11号流创建一个水管。
  另外一个包是192.168.0.12,那么就会为12号流创建另一个水管。

  那么另外一种情况:有个数据包的IP是192.168.1.11,标识符是多少呢?
  192.168.1.11 & 0x000000ff,结果也是11,标识符同样是11,那么它就会和192.168.0.11共用同一个水管,也就是两个IP会共用300Kbit/s的带宽!

  那么再看一种极端的情况,其实也就是上面例子的情况,如果mask为0x00000000,会发生什么样的事情呢?
  0x0和任何数相与,结果都相等,为0,这就意味着,所以的IP都“共享”300kbit/s的带宽!

  另一个极端就要想每个IP独享一个300Kbit/s的水管,那么就设置为0xffffffff好了,每个IP一个水管,互不干涉。

  回到上面的例子,mask的默认值是多少?经过试验(还没找到源代码),默认应该是0x0,也就是所有IP的所有流量,都会走一个300Kbit/s的小水管,不慢才怪呢!

  另外还要注意几个地方:
    1)mask是可以分方向的,分为dst-ip mask,src-ip mask,还有dst-port mask,src-port mask,在写规则的时候,最好一弄清方向。
    2)目前,flow的标识符是8位的,源代码中用了&0xff,所以显示的最高数值也就是255,但是会出现多个相同的值,比如在大的网络中,会出现多个11,不影响效果,但是不好区分到底是哪一个网段的11,修改办法可以参照我另外的帖子。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论