解读官方原话:RouterOS可以读取和改变DSCP值,但并不意味支持DSCP。
仔细看过此文,你将明白以下几个问题:
DSCP是什么?
优先级与DSCP的关系?
哪些涉及DSCP的用法是没有必要的?
RouterOS的DSCP到底有什么用?
为什么改变DSCP这么占CPU资源?
先看看DSCP是什么?DSCP,全称就不说了,自已查吧。DSCP是IP头中的一个字段,共6位,路由器可根据到来的IP报文的DSCP值来了解这个报的处理优先级。但是,这需要路由器支持DSCP到处理优先级的解析转换。
这里出现了另一个术语“处理优先级”,处理优先级一般分8个级别,从0到7。例如IP-voice数据包一般为6或7级,IP-VIDEO数据包一般为4或5级别,需要尽力处理的一般数据包为0或3级,其它不重要数据为1或2级。 一般数据包都是0级,即需要“尽力而为”处理的数据包。
DSCP是6位,所以有64种数值,而处理优先级有8级。路由器一般把DSCP解析转换为处理优先级时,只看DSCP的低三位。所以:DSCP值为0、8、16、24、32、40、48、56时,对应的处理优先级为0。DSCP值为1、9、17、25、33、41、49、57时,对应的处理优先级为1,以此类推,DSCP值为7、15、23、31、39、47、55、63时,对应的处理优先级为7。
而MikroTik RouterOS虽然可读取或改变DSCP值,但默认并不能解析转这些DSCP值为处理优先级。当然你可根据DSCP值来手动设置这个IP包的处理优先级,也可以根据DSCP值来为这个IP包打上mark。就是因为RouterOS可以根据DSCP值来手动设置优先级或打MARK,于是出现了以下很多荒唐的用法。
第一种荒唐的用法是:先根据目的端口改变DSCP值,再根据新DSCP值打MARK,在队列树根据新MARK来处理数据包。猛一看,很先进,实际呢,我直接根据目的端口打MARK不就得了,为什么要从DSCP上绕个弯子呢。改变DSCP值和读取新DSCP这些占用CPU资源的过程是没有必要的。
第二种荒唐的用法是:先根据目的端口改变DSCP值,再根据新DSCP值设置处理优先级(routeros330支持的:ip firewall mangle add dscp=x action="set priority" new-priority=y)。乍一瞧,很牛比,实际呢,我直接根据目的端口设置优先级不就得了,为什么非要跟DSCP过不去呢。
现在有人要问了,即然前面都说DSCP没用还占资源,那RouterOS中的DSCP到底还有什么用?
先看下面的一段话,关键是最后一句话。
MikroTik RouterOS works with the full ToS byte.
It does not take account of reserverd bits in this byte (because they have been redefined many times and this approach provides more flexibility).
It means that it is possible to work with DiffServ marks (DSCP) and ECN codepoints ,which [...]