Quality of service only does anything when there is congestion. That sentence is obvious, it is on every introductory slide, and it is the reason a very large number of carefully built policies accomplish nothing at all. A router with a gigabit interface feeding a fifty megabit circuit is never congested — the provider's equipment is — so the router queues nothing, prioritises nothing, and every class counter reads perfectly while users complain.
A hierarchy fixes that by creating the congestion point deliberately. A parent policy shapes traffic down to the rate the circuit can actually carry, which makes the router the place where the queue forms, and a child policy nested inside decides what happens in that queue. The child is the part everyone writes; the parent is the part that makes it matter.
This article covers why a flat policy is inert on a subrate circuit, how a hierarchy is actually assembled, what a percentage means at each level and why that changes between levels, how the shaper is tuned and why voice is what forces the tuning, and the hierarchies that are configured correctly and still do nothing. It is written for the lab rather than for the written exam, and sits alongside the rest of the CCIE Enterprise Infrastructure lab certification track.
Why Is a Flat Policy Inert on a Subrate Circuit?
What is the mechanism?
Classification, marking and policing act on every packet. Queuing acts only when packets have to wait, and packets only wait when the outgoing interface cannot send them immediately. A router with a fast interface feeding a slower circuit sends everything at once; the interface is never full, nothing queues, and the priority and bandwidth statements in the policy are never consulted. The discarding happens downstream, in equipment that knows nothing about the classification.
A Deeper Dive into Where the Queue Forms
What congestion actually means here
An interface is congested when it has more to send than it can transmit in the moment, so packets accumulate. That accumulation is the queue, and everything a queuing policy does is decide the order in which the accumulation is drained and what to discard when it grows too large.
No accumulation, no decisions. A policy attached to an interface that never accumulates anything has classification counters that increment and queuing behaviour that never runs. The counters are what mislead people: the classes are matching, the packets are being counted, and nothing is being prioritised.
The subrate case, which is most enterprise WAN
A router connects to a carrier with a gigabit Ethernet handover and buys fifty megabits of service. The physical interface is a gigabit interface and behaves like one. The carrier's equipment enforces the fifty megabits, by policing or by shaping, and it enforces it on everything equally.
So during a busy period the router transmits three hundred megabits, the carrier accepts fifty and discards the rest, and what it discards is whatever arrived when the bucket was empty. Voice packets and backup traffic are equally likely to be among them. The router's policy is irrelevant because the router never had a decision to make.
What the shaper changes
A parent policy that shapes to the purchased rate makes the router transmit no faster than the circuit carries. Now the router has more to send than it is permitted to send, an accumulation forms on the router, and a queue exists for the child policy to manage.
Nothing else about the design changes. The same traffic, the same circuit, the same carrier behaviour. The only difference is that the decision about what to discard has moved from equipment that classifies nothing to equipment that classifies everything.
Shape rather than police, and why
A policer discards or remarks traffic above the rate. A shaper delays it. For a rate limit applied to your own traffic before handing it to a circuit, delay is what you want: a packet that waits three milliseconds arrives, and a packet that is discarded has to be retransmitted.
Policing belongs where the intent is to enforce a limit on somebody else, or to cap a class that should not be allowed to grow regardless of available capacity. For the outer rate limit of a hierarchy it is the wrong tool, and using it produces a policy that discards traffic the circuit could have carried.
Shaping slightly below the purchased rate
The carrier's measurement and yours differ. They may count the Ethernet framing overhead you do not, or measure over a different interval, or enforce with a burst allowance that behaves differently from the shaper's. Shaping to exactly the purchased figure therefore produces occasional discards at the carrier despite the shaper.
Shaping a few percent below is the usual practice and it costs a few percent of a circuit to remove a class of problem that is otherwise very hard to diagnose — because the router shows no drops and the carrier does not show you its counters.
! The minimum hierarchy: a shaper that creates the queue,
! and a child policy that manages it.
R1(config)# policy-map WAN-PARENT
R1(config-pmap)# class class-default
R1(config-pmap-c)# shape average 48000000
R1(config-pmap-c)# service-policy WAN-CHILD
!
R1(config)# interface GigabitEthernet0/1
R1(config-if)# service-policy output WAN-PARENT
show policy-map interface under load shows a queue depth of zero and no drops on any class. Fix: add a parent policy shaping to just below the purchased rate, with the existing policy nested inside it as the child.| Situation | Where the queue forms | What decides the drops |
|---|---|---|
| Interface speed equals circuit speed | The router | Your policy |
| Fast interface, slower circuit, no shaper | The carrier | Nothing you control |
| Fast interface, slower circuit, shaped | The router | Your policy |
| Shaped to exactly the purchased rate | Mostly the router | Mostly yours, occasionally theirs |
How Is a Hierarchy Actually Built?
What are the levels?
Two at minimum: a parent that shapes and a child that queues. Three where traffic for several sites or several customers shares one circuit: a top-level shaper for the physical handover, a middle level shaping each logical connection to its own rate, and a child under each that queues by class. The nesting is always the same — a class in one level names a policy as its service policy — and the constraint is that shaping and queuing belong at different levels.
A Deeper Dive into Construction
The child, which is the familiar part
A policy with classes for each traffic type: strict priority for voice, guaranteed bandwidth for the classes that need it, and whatever remains for everything else. This is an ordinary queuing policy and it is written exactly as it would be for an interface whose speed matches the circuit.
The one thing that changes is what the percentages refer to, which is covered in the next section and is the most common source of arithmetic errors in a hierarchy.
! The child: an ordinary queuing policy
R1(config)# class-map match-any VOICE
R1(config-cmap)# match dscp ef
R1(config)# class-map match-any SIGNALLING
R1(config-cmap)# match dscp cs3 af31
R1(config)# class-map match-any BUSINESS
R1(config-cmap)# match dscp af21 af22 af23
R1(config)# class-map match-any BULK
R1(config-cmap)# match dscp af11 af12 af13
!
R1(config)# policy-map WAN-CHILD
R1(config-pmap)# class VOICE
R1(config-pmap-c)# priority percent 20
R1(config-pmap)# class SIGNALLING
R1(config-pmap-c)# bandwidth percent 5
R1(config-pmap)# class BUSINESS
R1(config-pmap-c)# bandwidth remaining percent 60
R1(config-pmap-c)# random-detect dscp-based
R1(config-pmap)# class BULK
R1(config-pmap-c)# bandwidth remaining percent 10
R1(config-pmap)# class class-default
R1(config-pmap-c)# bandwidth remaining percent 30
R1(config-pmap-c)# random-detect
The parent, which is short
One class — everything — with a shaper and a reference to the child. That is the whole parent in the two-level case. Its brevity is deceptive because it is the part that makes the child function at all.
The parent may also carry things that apply to all traffic regardless of class: a marking that the carrier expects on every packet, for instance. What it must not carry is queuing, because queuing belongs to the child.
Three levels, for several sites on one handover
A hub with one physical connection carrying traffic for many branches, each of which has its own smaller circuit at the far end, needs a rate limit per branch as well as one for the handover. The top level shapes the handover, each middle-level class matches one branch and shapes to that branch's rate, and each has its own child queuing policy.
The important property is that the middle-level rates may sum to more than the top-level rate. That is intentional — branches are not all busy at once — and the top-level shaper is what prevents the oversubscription from becoming a problem at the handover.
! Three levels: handover, per-branch, per-class
R1(config)# class-map match-all BRANCH-A
R1(config-cmap)# match vlan 101
R1(config)# class-map match-all BRANCH-B
R1(config-cmap)# match vlan 102
!
R1(config)# policy-map PER-BRANCH
R1(config-pmap)# class BRANCH-A
R1(config-pmap-c)# shape average 10000000
R1(config-pmap-c)# service-policy WAN-CHILD
R1(config-pmap)# class BRANCH-B
R1(config-pmap-c)# shape average 20000000
R1(config-pmap-c)# service-policy WAN-CHILD
!
R1(config)# policy-map HANDOVER
R1(config-pmap)# class class-default
R1(config-pmap-c)# shape average 100000000
R1(config-pmap-c)# service-policy PER-BRANCH
!
R1(config)# interface GigabitEthernet0/1
R1(config-if)# service-policy output HANDOVER
Where each construct is allowed
Strict priority exists only in the lowest level, because it is a queuing decision. Shaping exists at the levels above, because it creates the queue that the lowest level manages. Attempting to put priority in a parent, or to attach a child policy to a class that has no shaper, produces either a rejected configuration or a policy that behaves differently from the intention.
The rule that keeps this straight: every level except the bottom one exists to create a rate limit, and the bottom one exists to decide what happens inside that limit.
Per-subinterface policies
Where each logical connection is a subinterface, the policy can be attached there instead, which is often clearer than a middle level matching on tags. It introduces one risk: subinterface policies do not know about each other, so their shaped rates can sum to more than the physical interface can carry.
The answer is a policy on the physical interface as well, shaping the aggregate. Without it, a design where every subinterface is individually correct can oversubscribe the port, and the resulting discards happen outside any policy.
! Per-subinterface, with an aggregate limit on the port
R1(config)# policy-map BRANCH-A-PARENT
R1(config-pmap)# class class-default
R1(config-pmap-c)# shape average 10000000 100000 0
R1(config-pmap-c)# service-policy WAN-CHILD
!
R1(config)# interface GigabitEthernet0/1.101
R1(config-subif)# encapsulation dot1Q 101
R1(config-subif)# service-policy output BRANCH-A-PARENT
!
! Without this, the subinterfaces can together exceed the port
R1(config)# policy-map PORT-AGGREGATE
R1(config-pmap)# class class-default
R1(config-pmap-c)# shape average 100000000
!
R1(config)# interface GigabitEthernet0/1
R1(config-if)# service-policy output PORT-AGGREGATE
Reusing the child policy
One child policy referenced by several parents is normal and is how a consistent class treatment is applied across many branches. Because the child uses percentages, the same policy produces the correct absolute rates under parents with different shape rates.
That is the main argument for percentages over absolute rates in a child policy, and it is a strong one: a single child policy maintained once, applied to two hundred branches with different circuit sizes.
What Does a Percentage Mean at Each Level?
Percentage of what?
In a child policy under a shaper, a bandwidth or priority percentage is a percentage of the parent's shape rate, not of the physical interface. That is the whole answer and it is the single most common misunderstanding in a hierarchy, because the same statement on a flat policy means a percentage of the interface. A remaining-bandwidth percentage means something different again: a share of what is left after the priority classes have taken what they need.
A Deeper Dive into the Arithmetic
Guaranteed bandwidth against remaining bandwidth
A guarantee reserves an amount and the reservations must fit within the available rate. A remaining share divides whatever is left after the guarantees and the priority traffic, proportionally, and the shares are relative to each other rather than to any absolute figure.
Mixing the two in one policy is legal and confusing. A policy where some classes have guarantees and others have shares requires working out what remains before the shares mean anything, and the arithmetic changes whenever a guarantee changes. A policy using shares throughout is easier to reason about and adjusts itself when the shape rate changes.
Why shares are usually the better choice
Under a shaper, the rate available to the child is the shape rate, and every class should get a proportion of it. Shares express exactly that and always sum to a hundred by construction. Guarantees express an absolute reservation, which under a shaper is a percentage of a number that may be adjusted later.
Where a class genuinely needs a floor regardless of what else is configured — a management class, for instance — a guarantee is right. For the ordinary business classes, shares are simpler and survive a circuit upgrade without recalculation.
Priority, and what it takes first
A priority class is served before everything else. Its percentage is of the parent's shape rate and it is an upper bound rather than a reservation: the class may use up to that much, and during congestion it is policed to it so that it cannot starve the rest.
That policing only engages under congestion, which means a priority class can exceed its percentage on an uncongested circuit and be cut back the moment the circuit fills. That is the intended behaviour and it surprises people who expect the limit to apply always.
How much priority is too much
A conventional ceiling is a third of the rate, and the reasoning is sound: priority traffic is served ahead of everything, so a large priority allocation means that during congestion everything else shares a small remainder and behaves badly.
The number matters less than the principle, which is that a priority class sized for the worst case rather than for the actual call volume degrades every other class in exchange for headroom that is never used. Sizing it from measured concurrent calls, with a modest margin, is the right approach.
! Under a 48 Mbps shaper, these are the real numbers
! priority percent 20 -> up to 9.6 Mbps, served first
! bandwidth percent 5 -> 2.4 Mbps guaranteed
! remaining = 48 - 9.6 - 2.4 = 36 Mbps
! bandwidth remaining percent 60 -> 21.6 Mbps
! bandwidth remaining percent 10 -> 3.6 Mbps
! bandwidth remaining percent 30 -> 10.8 Mbps
!
! Confirm what the device computed, rather than the arithmetic
R1# show policy-map interface GigabitEthernet0/1 output | include Class-map|bandwidth|priority|rate
The sum that must not exceed the rate
Guarantees plus priority must fit inside the shape rate, and the device will usually refuse a policy where they do not. What it will not refuse is a policy that fits under the current shape rate and stops fitting when the shape rate is reduced — a circuit downgrade, or a shaper adjusted downward after a carrier change.
A policy written entirely in shares has no such failure, because shares are always relative. That is another argument for them and it is the one that matters during a change nobody connected to the QoS configuration.
Marking, which is not affected by any of this
Classification and marking act on every packet regardless of congestion, so they work identically in a flat policy and in a hierarchy. A hierarchy is needed for queuing and not for marking, and a policy that only marks does not need one.
That is worth knowing because it explains why a marking policy on a subrate circuit appears to work while the queuing policy next to it does not. The two halves of the same policy behave differently for a reason that has nothing to do with how they were written. Reading this once is not the same as being able to do it under time pressure, which is what repetition against realistic CCIE lab practice scenarios is for.
! Marking acts everywhere; queuing acts only under congestion
R1(config)# policy-map WAN-CHILD
R1(config-pmap)# class BULK
R1(config-pmap-c)# set dscp af11
R1(config-pmap-c)# bandwidth remaining percent 10
!
! The marking counter increments regardless of load
R1# show policy-map interface GigabitEthernet0/1 output | include QoS Set|dscp af11|packets marked
QoS Set
dscp af11
Marker statistics: Disabled
| Statement | Relative to | Behaviour | Survives a rate change |
|---|---|---|---|
shape average at the parent |
An absolute rate | Delays traffic above it | It is the rate |
priority percent |
The parent's shape rate | Served first, policed when congested | Yes |
bandwidth percent |
The parent's shape rate | Guaranteed minimum | Recalculated, may not fit |
bandwidth remaining percent |
What is left after priority | Proportional share | Yes, always |
set dscp |
Nothing | Acts on every packet | Unaffected |
How Is the Shaper Tuned, and Why Does Voice Care?
What is there to tune?
A shaper does not transmit smoothly; it releases a measured amount of traffic each interval and then stops until the next one. The interval is what matters for delay-sensitive traffic, because a packet that arrives just after the allowance is exhausted waits for the next interval. A long interval means a large amount released at once and a correspondingly long wait for whatever missed it — which is jitter, and voice is where it is noticed.
A Deeper Dive into Shaper Behaviour
How a shaper releases traffic
Over any second the shaper delivers the configured rate. It does so by permitting a fixed quantity per interval, where the quantity divided by the interval equals the rate. Two shapers configured for the same rate with different intervals deliver the same throughput and very different delay characteristics.
Setting the quantity therefore sets the interval, because the rate is fixed. A smaller quantity means more intervals per second, each releasing less, which is smoother. That is the entire tuning decision.
Why voice is the constraint
A voice stream sends a packet every twenty milliseconds and the receiver plays them out at that spacing, absorbing small variations in a buffer. A packet that arrives late enough is played out as a gap, or discarded.
If the shaper's interval is longer than the tolerance, a voice packet that misses one interval arrives a full interval late, every time it happens. An interval comfortably under ten milliseconds keeps that within what a playout buffer absorbs; an interval of several tens of milliseconds does not.
Setting it deliberately
The quantity is configurable alongside the rate. Choosing it so that the interval lands around five to ten milliseconds is a good general target, and the arithmetic is straightforward: quantity equals rate multiplied by the desired interval.
The cost of a smaller interval is more frequent shaper processing, which on modern platforms is not a concern at enterprise WAN rates. There is little reason to leave it at whatever the default produces.
! Rate 48 Mbps, target interval 10 ms
! quantity = 48,000,000 x 0.010 = 480,000 bits
R1(config)# policy-map WAN-PARENT
R1(config-pmap)# class class-default
R1(config-pmap-c)# shape average 48000000 480000 0
R1(config-pmap-c)# service-policy WAN-CHILD
!
! What the device is actually using
R1# show policy-map interface GigabitEthernet0/1 output | include shape|Bc|Be|Target
shape (average) cir 48000000, bc 480000, be 0
target shape rate 48000000
The excess allowance
A shaper can be permitted to carry unused allowance forward and release a larger burst later. That improves throughput for bulk traffic and directly undermines the smoothness the interval tuning was for, because a burst is exactly the thing that delays whatever follows it.
On a circuit carrying voice, setting the excess allowance to zero is the right choice. On a circuit carrying only bulk data it is a reasonable way to use capacity the carrier permits. Deciding it rather than inheriting it is the point.
Queue depth, which is the other delay source
Each class has a maximum queue length, and a long queue means a packet at the back waits a long time. For bulk traffic a long queue is good — it absorbs bursts instead of discarding them. For interactive traffic it is the opposite, and for a priority class it should be short because anything that has waited long is already too late to be useful.
Platforms express the limit in packets, in bytes or in time. Time is the most useful unit where it is available because it states the thing that actually matters. Where it is not, the conversion from packets to time depends on the rate, which means a queue limit correct for one circuit size is wrong for another.
! Short queues where delay matters, long where it does not
R1(config)# policy-map WAN-CHILD
R1(config-pmap)# class VOICE
R1(config-pmap-c)# priority percent 20
R1(config-pmap-c)# queue-limit 64 packets
R1(config-pmap)# class BULK
R1(config-pmap-c)# bandwidth remaining percent 10
R1(config-pmap-c)# queue-limit 512 packets
R1(config-pmap-c)# random-detect
!
! Depth and drops, per class, under load
R1# show policy-map interface GigabitEthernet0/1 output | include Class-map|queue limit|depth|drops
Discarding early for responsive traffic
Traffic that reacts to loss by slowing down behaves better when a few packets are discarded as the queue grows than when the queue fills completely and a large block is discarded at once. Randomised early discard does that and belongs on bulk and general classes.
It does not belong on voice, which does not react to loss by slowing down and simply sounds worse. A priority class should discard only when it genuinely must.
Which Hierarchies Do Nothing at All?
What should be suspected?
Four. A policy applied in the wrong direction, since queuing acts on traffic leaving an interface and a policy applied inbound will never queue anything. A shape rate above what the circuit actually carries, which leaves the congestion at the carrier. Subinterface policies with no aggregate limit, which oversubscribe the physical port. And a platform that silently does something different from the configuration, which is more common on switches than on routers.
A Deeper Dive into Inert Hierarchies
Applied inbound
Queuing is an output behaviour. There is no queue on ingress because the packet has already arrived. A policy with priority and bandwidth statements attached inbound will classify, mark and police, and will never queue, which makes it another version of the policy that appears to work and does nothing.
The check is one line of configuration and it is worth including in a verification list precisely because it is too obvious to look at.
A shape rate that is wrong
The circuit was upgraded and the shaper was not. Or the shape rate was taken from a commercial document that described a different unit. Or the carrier enforces something different from what was ordered. In every case the router shapes to a rate above what the circuit carries and the congestion stays at the carrier.
The symptom is identical to having no shaper at all: no drops on the router and unhappy users. The distinguishing check is whether the router's queue depth grows under load. If it never grows, the shape rate is above the real capacity regardless of what the configuration says.
! The check that distinguishes every inert hierarchy
R1# show policy-map interface GigabitEthernet0/1 output
Class-map: class-default (match-any)
Queueing
queue limit 416 packets
(queue depth/total drops/no-buffer drops) 0/0/0
(pkts output/bytes output) 18405212/22483920144
shape (average) cir 48000000, bc 480000, be 0
target shape rate 48000000
!
! Depth 0 and drops 0 under real load = the queue is not here.
! Compare the offered rate against the shape rate:
R1# show policy-map interface GigabitEthernet0/1 output | include offered rate|shape rate
Subinterfaces that sum to more than the port
Each subinterface has a policy shaping to its own rate and each is individually correct. Together they can offer more than the physical interface can transmit, and the excess is discarded by the interface with no policy involved.
A policy on the physical interface shaping the aggregate resolves it. This is the same three-level structure described earlier, arrived at from a different direction, and it is frequently missing in designs that grew one subinterface at a time.
Platform differences
Switches implement queuing in hardware with a fixed number of queues, and a policy naming more classes than there are queues is mapped onto what exists. The result is a configuration that is accepted and a behaviour that is not what it describes.
The number of hierarchy levels supported also varies, as does whether a shaper is available on a logical interface at all. Checking the specific platform's capability before designing a three-level policy avoids designing something that cannot be implemented on half the estate.
A verification sequence
Five checks in order. The policy is attached, outbound, on the right interface. The shape rate matches the circuit, minus a margin. The queue depth grows under load, which proves the congestion is here. Each class's drops are consistent with its intent — bulk dropping, voice not. And the offered rate per class is within what was planned.
The third of those is the one that matters most and the one least often performed, because it requires load. Generating it deliberately, once, during commissioning, establishes that the whole structure works and is far cheaper than discovering it does not during a busy period.
! Five checks, in order
R1# show running-config interface GigabitEthernet0/1 | include service-policy
R1# show policy-map interface GigabitEthernet0/1 output | include shape rate
R1# show policy-map interface GigabitEthernet0/1 output | include depth
R1# show policy-map interface GigabitEthernet0/1 output | include Class-map|drops
R1# show policy-map interface GigabitEthernet0/1 output | include offered rate
What to monitor
Drops per class, which is the direct evidence the policy is acting. Queue depth on the priority class, which should be small at all times and whose growth indicates either too much priority traffic or a shaper interval problem. And the offered rate against the shape rate, whose ratio tells you how close the circuit is to needing an upgrade.
The third is the one that turns the policy into planning information. A circuit consistently offering more than its shape rate is a capacity decision waiting to be made, and the data to make it is already being collected.
Blueprint framing
The CCIE Enterprise Infrastructure v1.1 blueprint covers quality of service within its services domain, including classification, marking, policing, shaping and queuing. Hierarchical policies appear as the mechanism for applying queuing on a subrate circuit, and the point most likely to be examined is why the parent shaper is required at all.
| Symptom | Cause | Check |
|---|---|---|
| Zero drops, unhappy users | No shaper, or shape rate too high | Queue depth under load |
| No queuing at all | Policy applied inbound | The service-policy direction |
| Port discards outside any policy | Subinterfaces sum above the port | Sum of shape rates |
| Classes share treatment | More classes than hardware queues | Platform queue count |
| Voice worse after deployment | Shaper interval too long | Quantity divided by rate |
| Policy rejected after a downgrade | Guarantees no longer fit | Use remaining shares instead |
Conclusion
Queuing acts only where a queue forms, and on the typical enterprise WAN the queue does not form on the router. A gigabit handover carrying a fifty megabit service means the router transmits freely and the carrier discards, without regard to any classification. The parent shaper exists for one reason: to move that discard decision onto equipment that knows the difference between a voice packet and a backup stream. It improves the circuit by nothing and improves what crosses it considerably.
Inside the hierarchy, the rule that settles most questions is that every level above the bottom creates a rate limit and the bottom level decides what happens inside it. Percentages in the child refer to the parent's shape rate rather than to the interface, which is what allows one child policy to be correct under two hundred parents with different circuit sizes — provided it is written in remaining-bandwidth shares, which adjust themselves, rather than in guarantees, which stop fitting when a circuit is downgraded.
The tuning that decides whether voice is better or worse afterwards is the shaper's release interval, because two shapers at the same rate with different intervals deliver identical throughput and very different jitter. And every failure here looks identical to success on a quiet circuit: no drops, clean counters, and a queue that never forms. A few minutes of deliberate load at commissioning, with the queue depth watched, is the only test that tells the two apart. More CCIE Enterprise Infrastructure material — labs, protocol breakdowns and study guides — is collected on the SPOTO CCIE site.
External Links
- RFC 2474 — Definition of the Differentiated Services Field
- RFC 2475 — An Architecture for Differentiated Services
- RFC 3246 — An Expedited Forwarding PHB
- RFC 2597 — Assured Forwarding PHB Group
- RFC 4594 — Configuration Guidelines for DiffServ Service Classes
- RFC 2698 — A Two Rate Three Color Marker
- Cisco Learning Network — CCIE Enterprise Infrastructure
Reference Notes
- RFC 2475 describes the differentiated services architecture, in which traffic conditioning at the network edge includes both shaping, which delays traffic, and policing, which discards or remarks it.
- RFC 2475 states that a shaper delays packets to bring a stream into conformance with a traffic profile, and that a shaper therefore requires buffering.
- RFC 3246 defines the expedited forwarding per-hop behaviour intended for traffic requiring low loss, low latency and low jitter, and notes that it must be rate limited to prevent starvation of other traffic.
- RFC 3246 observes that the aggregate arrival rate of expedited forwarding traffic must be less than the configured departure rate, which is the basis of the convention that priority allocation be bounded.
- RFC 2597 defines the assured forwarding per-hop behaviour group, providing several classes each with multiple drop precedences.
- RFC 2474 defines the differentiated services field and the codepoints used to mark packets for the behaviours above.
- RFC 4594 provides configuration guidelines for differentiated services classes, including recommended codepoints and queuing treatment for voice, signalling and bulk data.
- RFC 2698 defines a two rate three colour marker, whose committed and peak rates with their associated burst sizes correspond to the rate and burst parameters of a configured shaper.
- Cisco documentation describes hierarchical policy maps, in which a child policy is attached to a class in a parent policy using a nested service policy.
- Cisco documentation states that in a child policy nested under a shaped parent, bandwidth and priority percentages are calculated against the parent's shape rate rather than against the interface bandwidth.
- Cisco documentation describes the committed burst parameter of a shaper, which together with the configured rate determines the interval over which the shaper meters traffic.
- The CCIE Enterprise Infrastructure v1.1 unified exam topics include quality of service within the infrastructure services domain.