summaryrefslogtreecommitdiff
path: root/qos
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2015-10-25 21:00:20 +0100
committerHarald Welte <laforge@gnumonks.org>2015-10-25 21:00:20 +0100
commitfca59bea770346cf1c1f9b0e00cb48a61b44a8f3 (patch)
treea2011270df48d3501892ac1a56015c8be57e8a7d /qos
import of old now defunct presentation slides svn repo
Diffstat (limited to 'qos')
-rw-r--r--qos/abstract23
-rw-r--r--qos/ip-qos.mgp395
-rw-r--r--qos/qos-1.eps611
-rw-r--r--qos/qos-1.pngbin0 -> 8313 bytes
4 files changed, 1029 insertions, 0 deletions
diff --git a/qos/abstract b/qos/abstract
new file mode 100644
index 0000000..770c363
--- /dev/null
+++ b/qos/abstract
@@ -0,0 +1,23 @@
+Quality of Service in IP Networks
+
+IP networks were designed some 25 years ago. Networks based on TCP/IP are
+widely deployed, as organization-local Intranets as well as in the Internet
+itself. The usage patterns of those networks change. Especially new
+technologies like voice-over-IP as well as streaming multimedia applications
+have different requirements on the underlying network infrastructure than
+bulk data transfers like ftp/www or interactive traffic like telnet/ssh.
+
+Organizations usually run a mixture of different services on their Internet
+uplinks or on their organization-internal wide area networks. Bandwidth is
+usually a limited ressource, so everybody wants to divide bandwidth between
+different services according to his specific needs.
+
+Linux always had a very strong focus on network functionality and has
+sophisticated means for bandwidth control / QoS since Kernel 2.2.
+
+The presentation is organized in the following parts:
+ Basics of QoS in IP networks
+ How can Linux help with QoS
+ Sample scenarios of Linux-based QoS solutions
+ Overview about advanced conecpts (DiffServ, IntServ, RSVP, ...)
+
diff --git a/qos/ip-qos.mgp b/qos/ip-qos.mgp
new file mode 100644
index 0000000..3960927
--- /dev/null
+++ b/qos/ip-qos.mgp
@@ -0,0 +1,395 @@
+%include "cnc-style.mgp"
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+%nodefault
+%pcache 1 1 0 1
+%size 7, font "standard", fore "white", vgap 20, back "black"
+%bimage "fundo-cnc.png" 1024x768
+
+%center
+%size 7
+
+
+Quality of Service in IP Networks
+
+%center
+%size 4
+by
+
+Harald Welte <laforge@conectiva.com>
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+QoS in IP Networks
+Contents
+
+ Definition of QoS
+
+ Why QoS
+
+ IP Networks are not designed for QoS
+
+ How to do the impossible
+
+ What can Linux based systems help
+
+ Advanced Concepts (DiffServ, IntServ, RSVP, ...)
+
+ References / Further Reading
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+QoS in IP Networks
+Definiton of QoS
+
+ Provide Service Differentiation
+
+ Performance Assurance by
+
+ Bandwitdh guarantees
+ for streaming multimedia traffic
+ priorizing certain important applications
+
+ Latency guarantees
+ for voice over IP
+ for interactive character-oriented applications (ssh,telnet)
+
+ Packet-loss guarantees
+ for unreliable layer-4 protocols
+ to avoid retransmits
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+QoS in IP Networks
+Why QoS
+
+
+ Decide how and who available bandwidth is devided
+
+ Limit available bandwidth for certain users / applications
+
+ Guarantee bandwidth for certain users / applications
+
+ Divide bandwidth more equally between users / applications
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+QoS in IP Networks
+IP networks not designed for QoS
+
+
+Properties of IP-based networks:
+
+ offer a "best-effort" service
+
+ make NO guarantees about
+ bandwidth
+ latency
+ packet loss
+
+ provide a non-reliable packet transport
+
+Conclusion: IP networks are not suitable for QoS
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+QoS in IP Networks
+How to do the Impossible
+
+%size 4
+
+As IP Networks including Hardware (Routers, ...) are widely deployed, all QoS efforts have to layer on top of the existing technology.
+
+ There's no real solution to control latency
+ latency widely dependent on routing, which may be dynamic
+
+ There's no real solution to control packet loss
+ packet loss may occurr on any intermediate router
+
+ But we can control bandwidth usage!
+ The sender can limit bandwidth for outgoing streams
+ Intermediate routers BEFORE a bottleneck can control bandwidth usage
+
+%size 5
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+QoS in IP Networks
+What can Linux systems do?
+
+ Bandwidth limiting at the sender application
+ not many applications support it
+ server often out of control (on Internet, ...)
+ server doesn't know what's between him and the client
+
+ Bandwidth control on intermediate router before bottleneck
+ Ideal case because this is where packet loss would occurr
+ Sophisticated queue scheduling on the outgoing queue
+ Variety of different queue scheduling algorithms
+
+ Flow throttling at the Receiver
+ Worst case, because influence is limited
+ Theoretically possible for TCP, no implementation yet.
+ Ingress qdisc might help
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+QoS in IP Networks
+Bandwidth limiting at server
+
+ Some Internet Servers support bandwidth limiting
+
+ ProFTPd (builtin support)
+
+ Apache (using contributed mod_bandwidth)
+
+
+ Using those features it is easy to limit
+
+ maximum bandwidth used per connection
+
+ maximum bandwidth used per client (IP/network)
+
+ maximum bandwidth used by one virtual host (webserver/ftpserver)
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+QoS in IP Networks
+Router before bottleneck
+
+%size 4
+
+The router receives more packets on his incoming interface(s) than it can send out on the outgoing interface. It has to build a queue of packets (usually a FIFO one) and starts dropping packets as soon as the queue is full
+
+%image "qos-1.png" 0 100 30
+
+The idea is to change this queue, thus decide
+ which packets get enqueued in which order
+ how many packets get queued
+ which packets get dropped in case of a filling queue
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+QoS in IP Networks
+The Linux 2.2 / 2.4 Solution
+
+ Packet Scheduling algorithms in the Kernel
+ CBQ - Class Based Queue
+ RED - Random Early Drop
+ SFQ - Stochastic Fairness Queueing
+ TEQL - True Link Equalizer
+ TBF - Token Bucket Filter
+
+ tc command of iproute2 package for configuration
+ almost no documentation
+ very few examples on the internet
+
+ Packet Classification
+ tc builtin classes (route, u23, ...)
+ all iptables/netfilter matches by using fwmark
+
+Conclusion: Linux is the best suited general-purpose operating system for QoS, but almost nobody is using it because lack of knowledge.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+QoS in IP Networks
+Available queuing algorithms
+
+ CBQ - Class Based Queue
+ hierarchical bandwidth classes
+ used as basis in almost all cases
+ TBF - Token Bucket Filter
+ really accurate algorithm
+ uses a lot of CPU
+ not possible for high bandwidth links (>1MBit)
+ SFQ - Stochastic Fairness Queueing
+ less accurate algorithm
+ tries to distinguish between individual streams
+ does round robin between those streams
+ TEQL - True Link Equalizer
+ allows to 'bundle' interfaces
+ RED - Random Early Detect / Drop
+ simulates congested link by statistic packet dropping
+ uses almost no CPU
+ recommended for high-bandwidth backbones
+ others (WRR, TCINDEX, DSMARK, ..)
+ WRR not officially included in kernel, similar to CBQ
+ others mostly used for DiffServ
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+QoS in IP Networks
+The big picture
+
+Overview of the a packet's journey
+
+%size 3
+%font "typewriter"
+ Incoming Packets
+%size 3
+%font "typewriter"
+ |
+%size 3
+%font "typewriter"
+ V
+%size 3
+%font "typewriter"
+ Packet Classification classify
+%size 3
+%font "typewriter"
+ (ipchains/iptables) set nfmark
+%size 3
+%font "typewriter"
+ |
+%size 3
+%font "typewriter"
+ V
+%size 3
+%font "typewriter"
+ Routing decision
+%size 3
+%font "typewriter"
+ |
+%size 3
+%font "typewriter"
+ V
+%size 3
+%font "typewriter"
+ TC filter select classes based on nfmark
+%size 3
+%font "typewriter"
+ / | \
+%size 3
+%font "typewriter"
+ / | \
+%size 3
+%font "typewriter"
+ / | \
+%size 3
+%font "typewriter"
+Different Bandwidth classes bandwidth classes (CBQ)
+%size 3
+%font "typewriter"
+ \ | /
+%size 3
+%font "typewriter"
+ \ | /
+%size 3
+%font "typewriter"
+ \ | /
+%size 3
+%font "typewriter"
+ Enqueuing output queue discipline
+%size 3
+%font "typewriter"
+ |
+%size 3
+%font "typewriter"
+ V
+%size 3
+%font "typewriter"
+ Outgoing packets
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+QoS in IP Networks
+Example scenario usin CBQ
+
+%size 4
+Let's assume we have a link with 10 MBit maximum available bandwidth.
+We offer two major services to the outside world: Anonymous FTP and a Webserver offering important Information.
+
+FTP Bulk data transfers are using up almost all available bandwidth, thus slowing down accesses to our website :(
+
+We want to have FTP transfers use up to 8MBit and reserve 2MBit for WWW.
+
+Implementation uses CBQ for bandwidth divisions.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+QoS in IP Networks
+Example scenario
+
+%size 3
+ attach a CBQ to the device
+%size 3
+%font "typewriter"
+tc qdisc add dev eth0 root handle 10: cbq
+ bandwidth 10Mbit avpkt 1000
+
+%size 3
+%font "standard"
+ create CBQ classes
+%size 3
+%font "typewriter"
+tc class add dev eth0 parent 10:0 classid 10:1 cbq
+ bandwidth 10MBit rate 10MBit allot 1514
+ weight 1Mbit prio 8 maxburst 20 avpkt 1000
+
+tc class add dev eth0 parent 10:1 classid 10:100 cbq
+ bandwidth 10MBit rate 8MBit allot 1514
+ weight 800kbit prio 5 maxburst 20 avpkt 1000 bounded
+
+tc class add dev eth0 parent 10:1 classid 10:200 cbq
+ bandwidth 10MBit rate 2MBit allot 1514
+ weight 200kbit prio 5 maxburst 20 avpkt 1000 bounded
+
+%size 3
+%font "standard"
+ add filter rules
+%size 3
+%font "typewriter"
+tc filter add dev eth0 parent 10:1 protocol ip handle 6 fw classid 10:100
+
+iptables -t mangle -A PREROUTING -j MARK -p tcp --sport 20 --set-mark 6
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+QoS in IP Networks
+Further optimization
+
+%size 4
+Now we have achieved bandwidth division between two services.
+
+Within one service, however, one individual user with a high bandwith link can still use up most of our bandwidth, slowing down other user.
+
+We can improve this behaviour of changing the scheduling algorithm from it's default (fifo)
+
+%size 3
+%font "typewriter"
+tc qdisc add dev eth0 parent 10:100 sfq quantum 1514b perturb 15
+tc qdisc add dev eth0 parent 10:200 sfq quantum 1514b perturb 15
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%page
+QoS in IP Networks
+Further reading / Links
+
+ Bandwidth limiting on Servers
+ ProFTPd
+ http://www.proftpd.net/
+ Apache mod_bandwidth / mod_bwshare
+ ftp://ftp.cohprog.com/pub/apache/module/mod_bandwidth.c
+ http://www.topology.org/src/bwshare/
+
+ Queue scheduling
+ Advanced Routing HOWTO
+ http://www.ds9a.nl/2.4Routing/
+ Linux QoS HOWTO
+ http://www.ittc.ukans.edu/~rsarav/howto/
+ iproute2+tc
+
+ This presentation
+ Authors Homepage
+ http://www.gnumonks.org/
diff --git a/qos/qos-1.eps b/qos/qos-1.eps
new file mode 100644
index 0000000..21c5a00
--- /dev/null
+++ b/qos/qos-1.eps
@@ -0,0 +1,611 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: /laforge/home/laforge/incoming/qos-1
+%%Creator: Dia v0.86
+%%CreationDate: Mon Apr 2 16:14:45 2001
+%%For: a user
+%%Magnification: 1.0000
+%%Orientation: Portrait
+%%BoundingBox: 0 0 1356 288
+%%Pages: 1
+%%BeginSetup
+%%EndSetup
+%%EndComments
+[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E
+/F /G /H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W /X /Y
+/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c
+/d /e /f /g /h /i /j /k /l /m
+/n /o /p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright
+/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf
+/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde
+/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring
+/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave
+/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def
+/Times-Roman-latin1
+ /Times-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-Italic-latin1
+ /Times-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-Bold-latin1
+ /Times-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-BoldItalic-latin1
+ /Times-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-Book-latin1
+ /AvantGarde-Book findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-BookOblique-latin1
+ /AvantGarde-BookOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-Demi-latin1
+ /AvantGarde-Demi findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-DemiOblique-latin1
+ /AvantGarde-DemiOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-Light-latin1
+ /Bookman-Light findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-LightItalic-latin1
+ /Bookman-LightItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-Demi-latin1
+ /Bookman-Demi findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-DemiItalic-latin1
+ /Bookman-DemiItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-latin1
+ /Courier findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-Oblique-latin1
+ /Courier-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-Bold-latin1
+ /Courier-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-BoldOblique-latin1
+ /Courier-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-latin1
+ /Helvetica findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Oblique-latin1
+ /Helvetica-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Bold-latin1
+ /Helvetica-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-BoldOblique-latin1
+ /Helvetica-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-latin1
+ /Helvetica-Narrow findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-Oblique-latin1
+ /Helvetica-Narrow-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-Bold-latin1
+ /Helvetica-Narrow-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-BoldOblique-latin1
+ /Helvetica-Narrow-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Roman-latin1
+ /NewCenturySchoolbook-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Italic-latin1
+ /NewCenturySchoolbook-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Bold-latin1
+ /NewCenturySchoolbook-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-BoldItalic-latin1
+ /NewCenturySchoolbook-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Roman-latin1
+ /Palatino-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Italic-latin1
+ /Palatino-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Bold-latin1
+ /Palatino-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-BoldItalic-latin1
+ /Palatino-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Symbol-latin1
+ /Symbol findfont
+definefont pop
+/ZapfChancery-MediumItalic-latin1
+ /ZapfChancery-MediumItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/ZapfDingbats-latin1
+ /ZapfDingbats findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/cp {closepath} bind def
+/c {curveto} bind def
+/f {fill} bind def
+/a {arc} bind def
+/ef {eofill} bind def
+/ex {exch} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth pop} bind def
+/tr {translate} bind def
+
+/ellipsedict 8 dict def
+ellipsedict /mtrx matrix put
+/ellipse
+{ ellipsedict begin
+ /endangle exch def
+ /startangle exch def
+ /yrad exch def
+ /xrad exch def
+ /y exch def
+ /x exch def /savematrix mtrx currentmatrix def
+ x y tr xrad yrad sc
+ 0 0 1 startangle endangle arc
+ savematrix setmatrix
+ end
+} def
+
+/mergeprocs {
+dup length
+3 -1 roll
+dup
+length
+dup
+5 1 roll
+3 -1 roll
+add
+array cvx
+dup
+3 -1 roll
+0 exch
+putinterval
+dup
+4 2 roll
+putinterval
+} bind def
+28.346000 -28.346000 scale
+17.845207 437.856740 translate
+%%EndProlog
+
+
+1.000000 1.000000 1.000000 srgb
+n -13.077546 -447.950612 m -13.077546 -439.950612 l -7.985470 -439.950612 l -7.985470 -447.950612 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n -13.077546 -447.950612 m -13.077546 -439.950612 l -7.985470 -439.950612 l -7.985470 -447.950612 l cp s
+1.000000 1.000000 1.000000 srgb
+n -2.033689 -446.022040 m -2.033689 -441.959540 l 10.048900 -441.959540 l 10.048900 -446.022040 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n -2.033689 -446.022040 m -2.033689 -441.959540 l 10.048900 -441.959540 l 10.048900 -446.022040 l cp s
+1.000000 1.000000 1.000000 srgb
+n 16.050852 -447.942862 m 16.050852 -439.949112 l 25.116894 -439.949112 l 25.116894 -447.942862 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 16.050852 -447.942862 m 16.050852 -439.949112 l 25.116894 -439.949112 l 25.116894 -447.942862 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n -16.038172 -440.048589 m -13.070281 -440.011807 l s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n -15.997245 -447.906733 m -13.077546 -447.950612 l s
+0.100000 slw
+0 slc
+[] 0 sd
+1.000000 0.000000 0.000000 srgb
+n -13.560988 -443.913577 m -16.406523 -443.936733 l s
+0 slj
+1.000000 0.000000 0.000000 srgb
+n -14.362995 -443.670095 m -13.560988 -443.913577 l -14.358927 -444.170079 l f
+/Helvetica-Oblique-latin1 ff 0.600000 scf sf
+/Helvetica-Oblique-latin1 ff 0.600000 scf sf
+1.000000 0.000000 0.000000 srgb
+() dup sw 2 div -14.855953 ex sub -444.948149 m gs 1 -1 sc sh gr
+1.000000 1.000000 1.000000 srgb
+n -4.993883 -443.984335 1.990755 1.984000 0 360 ellipse f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0.000000 0.000000 0.000000 srgb
+n -4.993883 -443.984335 1.990755 1.984000 0 360 ellipse cp s
+1.000000 1.000000 1.000000 srgb
+n 13.037714 -443.959407 2.005400 2.000000 0 360 ellipse f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0.000000 0.000000 0.000000 srgb
+n 13.037714 -443.959407 2.005400 2.000000 0 360 ellipse cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n -7.985470 -443.950612 m -6.984638 -443.984335 l s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n -3.018922 -443.977661 m -2.033689 -443.990790 l s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 9.967044 -444.004735 m 11.032314 -443.959407 l s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 15.043114 -443.959407 m 16.016589 -443.977661 l s
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(Router) dup sw 2 div -4.832496 ex sub -443.824335 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(Router) dup sw 2 div 13.087201 ex sub -443.751407 m gs 1 -1 sc sh gr
+1.000000 1.000000 1.000000 srgb
+n -8.995481 -447.879407 m -8.995481 -440.039407 l -8.067481 -440.039407 l -8.067481 -447.879407 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n -8.995481 -447.879407 m -8.995481 -440.039407 l -8.067481 -440.039407 l -8.067481 -447.879407 l cp s
+1.000000 1.000000 1.000000 srgb
+n -9.998281 -447.883807 m -9.998281 -440.043807 l -9.070281 -440.043807 l -9.070281 -447.883807 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n -9.998281 -447.883807 m -9.998281 -440.043807 l -9.070281 -440.043807 l -9.070281 -447.883807 l cp s
+1.000000 1.000000 1.000000 srgb
+n -11.022281 -447.851807 m -11.022281 -440.011807 l -10.094281 -440.011807 l -10.094281 -447.851807 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n -11.022281 -447.851807 m -11.022281 -440.011807 l -10.094281 -440.011807 l -10.094281 -447.851807 l cp s
+1.000000 1.000000 1.000000 srgb
+n -12.046281 -447.851807 m -12.046281 -440.011807 l -11.118281 -440.011807 l -11.118281 -447.851807 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n -12.046281 -447.851807 m -12.046281 -440.011807 l -11.118281 -440.011807 l -11.118281 -447.851807 l cp s
+1.000000 1.000000 1.000000 srgb
+n -13.070281 -447.851807 m -13.070281 -440.011807 l -12.142281 -440.011807 l -12.142281 -447.851807 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n -13.070281 -447.851807 m -13.070281 -440.011807 l -12.142281 -440.011807 l -12.142281 -447.851807 l cp s
+1.000000 1.000000 1.000000 srgb
+n 18.115732 -447.883807 m 18.115732 -440.043807 l 19.043732 -440.043807 l 19.043732 -447.883807 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 18.115732 -447.883807 m 18.115732 -440.043807 l 19.043732 -440.043807 l 19.043732 -447.883807 l cp s
+1.000000 1.000000 1.000000 srgb
+n 21.123732 -447.851807 m 21.123732 -440.011807 l 22.051732 -440.011807 l 22.051732 -447.851807 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 21.123732 -447.851807 m 21.123732 -440.011807 l 22.051732 -440.011807 l 22.051732 -447.851807 l cp s
+1.000000 1.000000 1.000000 srgb
+n 24.195732 -447.883807 m 24.195732 -440.043807 l 25.123732 -440.043807 l 25.123732 -447.883807 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 24.195732 -447.883807 m 24.195732 -440.043807 l 25.123732 -440.043807 l 25.123732 -447.883807 l cp s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 25.116894 -439.949112 m 28.034661 -439.966733 l s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 25.116894 -447.942862 m 27.993733 -447.947661 l s
+0.100000 slw
+0 slc
+[] 0 sd
+1.000000 0.000000 0.000000 srgb
+n 29.115480 -443.994786 m 25.988269 -444.018589 l s
+0 slj
+1.000000 0.000000 0.000000 srgb
+n 28.313600 -443.750882 m 29.115480 -443.994786 l 28.317406 -444.250868 l f
+/Helvetica-Oblique-latin1 ff 0.600000 scf sf
+/Helvetica-Oblique-latin1 ff 0.600000 scf sf
+1.000000 0.000000 0.000000 srgb
+() dup sw 2 div 27.554158 ex sub -444.306679 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(receiver) dup sw 2 div 27.851695 ex sub -444.836756 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(sender) dup sw 2 div -16.290807 ex sub -444.767845 m gs 1 -1 sc sh gr
+1.000000 1.000000 1.000000 srgb
+n -1.950016 -445.936335 m -1.950016 -442.064335 l 1.044776 -442.064335 l 1.044776 -445.936335 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n -1.950016 -445.936335 m -1.950016 -442.064335 l 1.044776 -442.064335 l 1.044776 -445.936335 l cp s
+1.000000 1.000000 1.000000 srgb
+n 1.098648 -445.940735 m 1.098648 -442.068735 l 4.073436 -442.068735 l 4.073436 -445.940735 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 1.098648 -445.940735 m 1.098648 -442.068735 l 4.073436 -442.068735 l 4.073436 -445.940735 l cp s
+1.000000 1.000000 1.000000 srgb
+n 4.117184 -445.940735 m 4.117184 -442.068735 l 7.061168 -442.068735 l 7.061168 -445.940735 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 4.117184 -445.940735 m 4.117184 -442.068735 l 7.061168 -442.068735 l 7.061168 -445.940735 l cp s
+1.000000 1.000000 1.000000 srgb
+n 7.143023 -445.940735 m 7.143023 -442.068735 l 9.967044 -442.068735 l 9.967044 -445.940735 l f
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 7.143023 -445.940735 m 7.143023 -442.068735 l 9.967044 -442.068735 l 9.967044 -445.940735 l cp s
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(3) dup sw 2 div 24.644229 ex sub -446.919407 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(4) dup sw 2 div 21.892229 ex sub -446.983407 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(5) dup sw 2 div 18.564229 ex sub -447.079407 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(6) dup sw 2 div 8.485208 ex sub -443.856335 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(7) dup sw 2 div 5.522128 ex sub -443.856335 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(8) dup sw 2 div 2.544520 ex sub -443.888335 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(9) dup sw 2 div -0.305843 ex sub -443.895805 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(10) dup sw 2 div -8.541268 ex sub -447.111407 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(11) dup sw 2 div -9.501268 ex sub -447.111407 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(12) dup sw 2 div -10.557268 ex sub -447.111407 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(13) dup sw 2 div -11.581268 ex sub -447.111407 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(14) dup sw 2 div -12.605268 ex sub -447.111407 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(low bandwidth link) dup sw 2 div 7.664387 ex sub -438.064335 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(high bandwidth link) dup sw 2 div -10.882479 ex sub -438.023407 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 0.800000 scf sf
+0.000000 0.000000 0.000000 srgb
+(high bandwidth link) dup sw 2 div 21.653603 ex sub -438.052474 m gs 1 -1 sc sh gr
+showpage
diff --git a/qos/qos-1.png b/qos/qos-1.png
new file mode 100644
index 0000000..90393c9
--- /dev/null
+++ b/qos/qos-1.png
Binary files differ
personal git repositories of Harald Welte. Your mileage may vary