session 1 QOS Queue
Queue,队列技术。在
出接口使用丢弃机制,主要解决数据包的延迟和抖动问题。
早期的队列技术有:
1、FIFO
目前出接口默认的用于高速以太网接口的队列机制,先进先出first in first out
2、PQ
多队列轮询,使用ACL将流量分为4个队列,出接口传输的时候根据队列编号1-4,转发优先级按照队列号从高到低。(淘汰)
缺点:
1、不能使用类区分流量。
2、四个队列不能同时传输数据,只能等待优先级最高的队列所有的数据包传输完成后才能让后面的队列传输,哪怕该队列中只有1个包等待转发,无法最大化利用出接口带宽。
3、Round Rabin
也叫作CQ,PQ的升级版。CQ优于PQ的地方时可以自定义队列的优先级。(淘汰)
4、WRR(weigth Round Robin)
加权重轮询算法,将不同的队列加上不同的权重,权重越高出接口转发的优先级越高。(淘汰)
缺点:
1、不是基于类的流量区分
2、当传输大数据包时无法合理的利用所分配的带宽
5、DRR (Difference Round Robin)
差额加权轮询,是WRR的升级版。(淘汰)
5、WFQ
weigth
Fair Queue
加权公平队列(加权是指带宽的分配比重,带宽越大转发的几率越大而不是优先转发,公平是相对于优先转发而言,指每个流的数据包传输是公平的,不会有莫一种数据优先被转发出接口队列,也就是说不能够优先传输某种流量)。是一种基于flow流的fifo转发机制。对于不同的流中的数据包(flow用源、目的ip、端口、协议号来确定计算的参数),在接入层的网络中,通常使用IP优先级和五元组配合进行流分类;在汇聚层网络中通常使用DSCP值和五元组配合进行流分类,具有相同特性的报文属于同一个流,使用Hash算法映射到不同的队列中,在网络发生拥塞时丢弃ipp低的和体积大的数据包,防止某一种flow的数据独占整个链路(的带宽)。WFQ最大可以在每个接口支持到4096个队列,为了提供各个流之间的公平调度,WFQ给每个流分配的带宽是相同的。例如有四个流,其IP precedence分别为1、2、3、4,那么每个流占用的带宽分别为2/14、3/14、4/14、5/14。
WFQ是低速WAN网络使用的默认的转发机制,就和以太网默认的FIFO一样。在串口上修改默认转发机制的命令:R1(config-if)#no fair-queue 修改成为了fifo了
R1(config-if)#hold-queue 1000 out 修改WFQ软件队列的容量,在out方向,show interface s0/0可以看到
R1(config-if)#hold-queue 75 in 修改WFQ软件队列的容量,在in方向
以上这些队列技术都已经不适合现在的网络了,都不是真正的基于class类的匹配机制了。后面会记录目前应用广泛和实用的QOS机制技术。
session 2 硬件接口转发原理
在硬件接口中,数据包的转发是通过入接口接收到数据包,然后由cup处理查找路由表(现在是直接看cef表,不用cpu处理),找到出接口后开始转发。
所有的接口都是有软件队列(Software Queue)和硬件队列(Hardware Queue)组成的,数据包经过接口的时候如果发生拥塞现象(拥塞会触发软件队列调度功能),那么这个数据包会被放入软件队列,由软件队列进行调度分配再到硬件队列中,然后由硬件队列进行发送出接口。然而在硬件队列中只有一种转发机制,就是FIFO先进先出,而软件队列的调度行为就是执行QOS的过程,拥有所有的QOS转发机制。我们说的拥塞就是指接口的数据包被存储在软件队列中等待调度转发的过程,因为如果不发生拥塞的情况下数据包是不会经过软件队列的,而是直接进入接口的硬件队列进行转发。打个比方就相当于水池子,当水管的水直接通过下水管流入下水道时就是没有拥塞的情况,而当水池子中有水在等待进入下水道的时候就是出现了拥塞的情况,而接口硬件就好比这个下水道口,水池子就是软件队列,下水道的管子就是硬件队列。在没有发生拥塞的情况下水是通过下水管直接流出下水井中,而不是蓄积在水池中慢慢的流入,软件队列的调度就是决定哪些水能够优先的通过下水管到达下水井。
上图中只是发生拥塞情况下的接口处理数据包的情况,其实接口的硬件队列和软件队列是并行的,而不是图上的串行的,只有在发生拥塞(硬件队列满了)的情况下才会启用软件队列功能进行调度。而软件调度只是针对于软件队列中的数据包(相当于一个软件队列的缓存),超出软件队列容量的数据包的处理方法是dorp。软件队列类似于一种功能,是相对于于硬件队列而言的。
在接口中查看软件队列:
4507R#show interfaces g5/47
GigabitEthernet5/47 is up, line protocol is up (connected)
Hardware is Gigabit Ethernet Port, address is 0021.a061.0e5e (bia 0021.a061.0e5e)
Description: lan-to-wan out_port
MTU 1500 bytes, BW 1000000 Kbit, DLY 10 usec,
reliability 255/255, txload 1/255, rxload 2/255
Encapsulation ARPA, loopback not set
Keepalive set (10 sec)
Full-duplex, 1000Mb/s, link type is auto, media type is 10/100/1000-TX
input flow-control is on, output flow-control is on
ARP type: ARPA, ARP Timeout 04:00:00
Last input never, output never, output hang never
Last clearing of "show interface" counters never
Input queue: 0/2000/0/0 (size/max/drops/flushes); Total output drops: 0 丢弃了0个包
这是接口的入(软件)队列的相关值
Input queue: 当前队列中所有数据包的大小/队列最大容纳的数据包数量/队列丢弃的数据包数量/队列中缓冲的数据包的数量(延迟转发的)
Queueing strategy: fifo 软件队列默认使用的转发机制FIFO
Output queue: 0/40 (size/max)
接口的出(软件)队列的相关值
Output queue:
当前队列中所有数据包的大小
/
队列最大容纳的数据包数量(超出40数量的就会丢弃了,默认的软件队列的容量)
5 minute input rate 10993000 bits/sec, 1556 packets/sec
5 minute output rate 3428000 bits/sec, 1937 packets/sec
6569966323 packets input, 6203226051499 bytes, 0 no buffer
Received 31648417 broadcasts (0 multicast)
0 runts, 0 giants, 0 throttles
0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
0 input packets with dribble condition detected
6546689515 packets output, 2538965902964 bytes, 0 underruns
0 output errors, 0 collisions, 0 interface resets
0 babbles, 0 late collision, 0 deferred
0 lost carrier, 0 no carrier
0 output buffer failures, 0 output buffers swapped out
硬件的,传输环(队列容纳量,是容纳数据包的缓存量)可以通过命令来修改:
R(config)#interface f0/0
R(config-if)#tx-ring-limit 32768(最大值)
但是一般建议使用默认值,因为会加重设备负载。由于设备负载加重查找变慢和修改之前的速率基本一样。打个比方,就相当于公交工具一样,车厢就是硬件队列容纳深度,乘客就是数据包,2个车门就是入接口和出接口。并不是说车厢越大转发的速率就越快,因为车门是恒定的每次只能下一个乘客。接口带宽是恒定的,每秒只能串行化固定的数据包量(吞吐量),所以修改硬件队列的深度是无法达到提高转发速率的,只是可以让软件队列触发变得更低了(硬件队列满了才会触发软件队列功能进行数据包的调动!)。