From fca59bea770346cf1c1f9b0e00cb48a61b44a8f3 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 25 Oct 2015 21:00:20 +0100 Subject: import of old now defunct presentation slides svn repo --- qos/abstract | 23 +++ qos/ip-qos.mgp | 395 +++++++++++++++++++++++++++++++++++++ qos/qos-1.eps | 611 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ qos/qos-1.png | Bin 0 -> 8313 bytes 4 files changed, 1029 insertions(+) create mode 100644 qos/abstract create mode 100644 qos/ip-qos.mgp create mode 100644 qos/qos-1.eps create mode 100644 qos/qos-1.png (limited to 'qos') 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 + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%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 Binary files /dev/null and b/qos/qos-1.png differ -- cgit v1.2.3