Configurazione dei router Cisco - Parte II - QoS -  

 

 

 

 


 

Copyright 2002-2010 – Gianrico Fichera –

 

Il materiale di questa libro non e’ sponsorizzato o sottoscritto da Cisco Systems, Inc. Cisco e’ un trademark di Cisco Systems, Inc. negli Stati Uniti e in altri stati. L’autore di questo libro non si assume nessuna responsabilita’ e non da nessuna garanzia riguardante l’accuratezza e la completezza delle informazioni presenti nonche’ da conseguenze sull’uso delle informazioni presenti in questa pagina.

Nessuna parte di questa pubblicazione puo' essere riprodotta o trasmessa, in qualsiasi forma o con qualsiasi mezzo, elettronico, meccanico, fotocopie, registrazione, senza il consenso dell'autore.

This material is not sponsored by, endorsed by, or affiliated with Cisco Systems, Inc., Cisco, Cisco Systems, and the Cisco Systems logo are trademarks or registered trade marks of Cisco Systems, Inc. or its affiliates. All other trademarks are trademarks of their respective owners.



 

Ultima revisione
Agosto 2010: impaginazione per formato ebook

 

QOS e gestione delle congestioni

Introduzione

 
 
Nei collegamenti di rete LAN e' noto che la tecnologia piu' utilizzata e' la Ethernet. Nei collegamenti WAN e' invece spesso utilizzato il protocollo ATM e il piu' vetusto Frame-Relay, piu' recentemente MPLS e ancora Ethernet, su fibra ottica. Al di sopra di questi protocolli si usa normalmente il protocollo IP.

  Ai giorni nostri, in un mondo oramai dominato dal protocollo TCP/IP e dall'Ethernet, con l'utilizzo di trasmissione simultanea di voce e dati si sono resi evidenti dei limiti di tale infrastruttura: la mancanza di una gestione efficiente della qualita' del servizio e dell'ingegneria del traffico. D'altra parte continuare a investire nella rete ATM e' costoso, specialmente per gestire quantita' di traffico quali quelle richieste da un mondo sempre piu' dominato da Internet (difficilmente si arrivera' a interfacce ATM con velocita' superiori a 622mbps). Tecnologie come la Ethernet invece permettono di utilizzare bande passanti dell'ordine di 1/10 Gbit/s con costi contenuti. Il protocollo Ethernet inoltre e' uscito dall'ambito della rete locale per essere utilizzato anche in reti WAN e Metropolitane. In queste reti si utilizza TCP/IP. Ed e' per questo che produttori come Cisco Systems hanno focalizzato l'attenzione su tecnologie come Ethernet e IP/MPLS.

  In Italia l'operatore monopolista possedeva inizialmente una rete dati X.25 , successivamente affiancata da una rete Frame-Relay e quindi dalla piu' recente rete ATM molto nota, oggigiorno, perche' rete di raccolta dei collegamenti XDSL (come l'ADSL di casa nostra).

   MPLS e' un protocollo di trasmissione che utilizza delle etichette (label) per differenziare i flussi di traffico. MPLS non trasporta solo  TCP/IP ma si adatta a qualsiasi protocollo. Nel caso di IP supporta tutte le specifiche di Qualita' di Servizio (QoS) sviluppate nel corso degli anni per TCP/IP e fornisce gli strumenti per gestire Ingegneria del Traffico (IT) e VPN.   E proprio la QoS e l'IT erano i vantaggi offerti dalla rete Frame-Relay e ATM, che permettevano di evitare congestioni, garantendo ai clienti la banda contrattualizzata. Venendo meno la principale limitazione del protocollo IP grazie a MPLS, i carrier hanno trovato una valida alternativa ad ATM e Frame-Relay per le loro reti geografiche.

La QoS

La Quality Of Service (QoS) permette di assegnare priorita' differenti a differenti flussi di traffico. Gestire le congestioni significa affrontare efficacemente i picchi di traffico. Come dice la stessa parola, "congestione" vuol dire eccesso di traffico rispetto alle possibilita' della rete. Per esempio, se abbiamo un collegamento a 2 megabit e si tenta di utilizzare una banda superiore si verifica una congestione.

Una corretta QoS consente di gestire efficacemente le congestioni, ovvero scegliere quale tipologia di traffico sacrificare e quale avvantaggiare. In linea di principio le applicazioni real-time, come VoIP oppure il VoD, devono avere priorita' maggiore rispetto le altre, quali web, email, ftp. Le applicazioni quali il peer-to-peer normalmente vanno penalizzate e devono essere servite per ultime in caso di congestione.

Ogni interfaccia di ogni router Cisco ha una unica coda legata al traffico in uscita che possiamo chiamare coda hardware oppure coda di basso livello. Questa ha lo scopo di assorbire i picchi di traffico conservandone i pacchetti. Tale coda e' gestita in modalita' FIFO, ovvero First In First Out. L'amministratore di rete puo' impostare la lunghezza di questa coda. Se la coda si riempie i pacchetti in eccesso vengono scartati. A monte di questa unica coda legata all'interfaccia hardware vi sono degli algoritmi software di gestione della QoS che utilizzano piu' code. Queste ultime ci permettono di gestire un tuning piu' preciso della QoS ed e' su queste che si interviene nella configurazione della propria politica di servizio.

    Due importanti concetti sono utilizzati nella gestione della QoS: traffic shaping e traffic policing.

Traffic shaping: Il traffic shaping utilizza una o piu' code per tenere i pacchetti in eccesso. Significa che, in caso di congestione, si cerca di conservare i pacchetti in coda fino alla sua saturazione. Controlla il traffico in uscita. I pacchetti si bufferizzano. Pertanto in ogni caso si ha un delay aggiuntivo del traffico in eccesso;

Traffic policing: Il traffic policing a differenza del traffic shaping rigetta il traffico in eccesso facendo il drop dei pacchetti. Per configurarlo normalmente si usa il comando "police". E' basato sui tre valori di average-rate, committed Burst (Bc), excess Burst (Be)

   Uno "shaper" e' un algoritmo che utilizza un buffer, o coda, mentre un "policier" e' un algoritmo che scarta i pacchetti in eccesso senza utilizzare una coda. Nel momento in cui una coda dello shaper e' piena i pacchetti quelli in eccesso possono essere scartati, e in tal caso si parla di "tail drop" oppure possono essere gestiti con algoritmi di "congestion avoidance" (vedi RED o WRED piu' avanti) che mirano a prevenire le situazioni di congestione facendo il drop selettivo e intelligente di pacchetti. Se si utilizza il "tail drop" in caso di congestione uno shaper si comporta come un policier.

   Per dimensionare un flusso di traffico sia uno shaper che un policier utilizzano un algoritmo chiamato token bucket. Vi sono a disposizione un certo numero di token nell'unita' di tempo, pari alla banda disponibile. Arrivano sempre nuovi token, con un flusso costante, dipendente quindi dal valore di traffico preimpostato. Questi token vengono associati ai bit o byte in transito. Se passano piu' dati dei token disponibili questi devono attendere in coda (in caso di shaping) o vengono eliminati (in caso di policing). Sostanzialmente si contano i bit o byte (a seconda di shaping o policing) di passaggio  per verificare lo sforamento nel limite di traffico prefissato. E' possibile gestire anche i burst di traffico. Si tratta di un numero di token aggiuntivi che sono messi a disposizione a intervalli regolari. Questo consente di inviare picchi di traffico ma poi costringe all'attesa per poter inviare un ulteriore picco.

Al traffic shaping o policing si aggiunge il concetto di classificatore. Questa fase consiste nel marcare i pacchetti in base al loro contenuto differenziandoli per profili di traffico. La classificazione dei pacchetti e' fondamentale per la loro successiva discriminazione in base alle priorita'.

Ci sono due modi di gestire la qualita' del servizio in rete. Il primo e' IntServ e il secondo Diffserv. Nel primo caso si utilizzano protocolli come RSVP, che hanno una loro segnalazione, e che fanno comunicare i router tra loro per riservare banda. Nel secondo caso non c'e' comunicazione tra i router ma ci sono degli standard comuni (vedi DSCP) che permettono a differenti router di trattare allo stesso modo uno stesso flusso di traffico.

   Consiglio di utilizzare un IOS versione 12.4 e un router Cisco almeno della famiglia 1800 per avere a disposizione tutti i comandi presenti in questi paragrafi. Seguono una serie di algoritmi per la gestione del traffic shaping.

     Seguono le descrizioni di alcuni algoritmi di queueing che vengono utilizzati nel caso di traffic shaping.
 

Priority Queuing (PQ)

   Il Priority Queuing e' un algoritmo di gestione delle code che utilizza piu' code con priorita' differenti. Le code a priorita' inferiore vengono servite solo se quelle a priorita' superiore sono vuote.

Weight Fair Queuing (WFQ)

   Il Weight Fair Queuing e' un algoritmo di gestione delle code che crea automaticamente un insieme di code nelle quali viene suddiviso il traffico a seconda della sua priorita'. Il processo di selezione delle priorita' e' automatico. Ad esempio i flussi di traffico che occupano meno banda hanno priorita' sui restanti. I flussi con precedenza segnalata nei pacchetti IP hanno priorita'. I flussi configurati con l'RSVP hanno la priorita'.

Class Based Weight Fair Queuing (CB-WFQ)

   Class Based Weight Fair Queuing e' un algoritmo di gestione delle code che consiste nel creare un insieme di code, associate ad applicazioni differenti, a cui vengono assegnate priorita' differenti. Nel CB-WFQ, la banda non e' mai "riservata". Se il canale e' libero, una classe puo' utilizzare anche la banda delle altre code. Richiede il CEF.

Low Latency Queuing (LLQ)

   Il Low Latency Queuing e' un'estensione del CB-WFQ. A differenza di quest'ultimo permette di utilizzare, per alcune classi di traffico, il priority queueing. Questo e' particolarmente utile per dare priorita' a classi di traffico come voce o video.

 NBAR

  NBAR e' una tecnologia che ci permette di classificare i pacchetti. Pertanto e' un classificatore in base a quanto detto nei paragrafi precedenti.

 I router normalmente lavorano al livello 3 della pila ISO/OSI. In altri termini dei pacchetti in transito riconoscono solo gli indirizzi, e non sono in grado di interpretare il contenuto dati dei pacchetti. Per riconoscere il tipo di servizio a cui e' eventualmente associato un pacchetto IP bisogna infatti analizzare la informazioni di livello 4, ovvero TCP, per leggere i valori delle porte e quindi il tipo di servizio. Alcuni servizi poi, come citrix, hanno porte variabili rendondene difficile l'identificazione.

   NBAR e' una tecnologia Cisco che permette di riconoscere differenti servizi, anche quelli con assegnazione dinamica delle porte TCP/UDP (vedi peer-to-peer) o quelli che transitano in VPN (riconoscendoli prima che i dati vengano criptati). Dopo che l'applicazione e' riconosciuta, si puo' applicare una politica di QoS. Questo e' fondamentale perche' la priorita' dei dati va assegnata in base al servizio ai quali questi sono associati. Cisco mette a disposizione dei file, gia' presenti all'interno di alcune versioni di IOS, di nome PDLM, che contengono le informazioni necessarie al router per riconoscere un servizio. Se un'applicazione non e' riconosciuta si possono aggiornare i file PDLM messi a disposizione da Cisco senza necessita' di reinstallare l'IOS o riavviare il router. Per utilizzare NBAR bisogna avere una versione di IOS che lo supporta. Affinche' NBAR funzioni dobbiamo utilizzare nel nostro router il CEF e NON con il fast-switching. Infine si utilizza insieme a CB-WFQ o LLQ.

    Nel sito della Cisco Systems, nella sezione "Download Software" e quindi su "Router Software", scegliete il vostro modello di router e cliccate su "PDLM software". Troverete le versioni di PDLM disponibili. Per verificare quelli installati nel vostro router utilizzate il comando "show ip nbar ...":

prova1800#show ip nbar version

NBAR software version: 6

1 base Mv: 2
2 ftp  Mv: 2
3 http Mv: 9
...
15 gnutella Mv: 4
16 kazaa2 Mv: 7
...
25 edonkey Mv: 5
26 winmx Mv: 3
27 bittorrent Mv: 4
28 directconnect Mv: 2
29 skype Mv: 1


{<No.>}<PDLM name> Mv: <PDLM Version>, {Nv: <NBAR Software Version>; <File name>}
{Iv: <PDLM Interdependency Name> - <PDLM Interdependency Version>}

     Figura 1 - NBAR: comando 'show ip nbar version'

Per vedere i protocolli supportati dal software installato nel router:

prova1800#show ip nbar port-map
port-map bgp udp 179
port-map bgp tcp 179
port-map bittorrent tcp 6881 6882 6883 6884 6885 6886 6887 6888 6889
port-map citrix udp 1604
port-map citrix tcp 1494
port-map cuseeme udp 7648 7649 24032
port-map cuseeme tcp 7648 7649

     Figura 2 - NBAR: comando 'show ip nbar port-map'

Configurazione di CB-WFQ con NBAR

 In questo esempio utilizziamo NBAR come classificatore e LLQ come algoritmo di queuing. Quindi facciamo traffic-shaping. Infine gestiamo la congestione con WRED. Il modo migliore di imparare rapidamente la configurazione della QoS su un router Cisco consiste partire subito con una configurazione funzionante. Nell'esempio che segue un router, provvisto di due interfacce Ethernet, una lato LAN e una lato WAN, esamina il traffico in transito assegnando delle priorita'. In circostanze normali l'interfaccia d'uscita ha velocita' molto inferiore a quella d'ingresso, perche' lato WAN c'e' un collegamento ad Internet con velocita' normalmente inferiore a quella di una interfaccia Ethernet. Ma la sostanza dell'esempio non cambia.

 

class-map match-any data
  match protocol http
  match protocol smtp
  match protocol ftp
  match protocol pop3
class-map match-any SIP
  match protocol sip
class-map match-any RTP
  match protocol rtp audio
  match protocol rtp payload-type "8"
  match protocol rtp payload-type "0"
  match protocol rtp payload-type "98"

  La prima operazione da effettuare consiste nel definire le classi del CB-WFQ. Dobbiamo raggruppare tutti i servizi su cui vogliamo fare QoS per classi di priorita'. Abbiamo la possibilita' di specificare esattamente i servizi. Qui definiamo tre classi con il comando "class-map". La prima coda raccogliera' il traffico con protocollo http, smtp, ftp e pop3.

 L'argomento "match-any" indica che basti che ci sia match con uno solo dei quattro protocolli per far entrare il traffico in questa coda. L'alternativa e' "match-all" nel qual caso dovevano contemporaneamente rispettate tutte le condizioni affinche' il pacchetto facesse parte di questo gruppo. Infine "data" e' il nome da noi assegnato a questa classe.

La seconda classe definisce la segnalazione SIP. La terza classe fa match con i pachetti RTP di voce, con codec ben specifici (vedi i paragrafi successivi per una descrizione dettagliata di questi valori. Normalmente si possono creare al massimo 64 class-map.

policy-map VOIP 

  Con il comando "policy-map" utilizziamo le classi definite in precedenza ed associamo loro un valore di priorita' e il banda.

 class RTP
  priority 256

  Il comando "priority" introduce la PQ nella CB-WFQ. Pertanto ora abbiamo un low latency queueing (LLQ). Il traffico VoIP e' il tipo di traffico che necessita' priorita'.

Il comando completo qui e' "priority 256". Significa che 256kbps e' la banda garantita. Questa coda verra' servita prima delle altre. Se c'e' una richiesta di banda superiore a 256kbps in questa classe, il traffico in eccesso sara' tagliato in caso di congestione, per lasciare spazio al traffico con priorita' inferiore (quindi il comando "priority" fa policing e non shaping). Se il traffico in questa coda e' inferiore ai 256kbps, la banda rimanente e' a disposizione degli altri servizi. Le code di priorita' utilizzano l'algoritmo di token bucket.

class SIP
  priority 64

  Alla segnalazione del protocollo SIP riserviamo 64kbps

 class WEB
   bandwidth 384

  Alla classe WEB viene riservato un trattamento differente. Il comando "bandwidth" riserva 384kbps senza priorita'. Questo vuol dire che questa coda sara' servita dopo quelle con il comando "priority". Poiche' le code con il comando "priority" hanno la banda tagliata in caso di eccedenza, siamo sicuri che in caso di congestione ci sara' spazio per la classe WEB, a meno di non avere sbagliato i calcoli e riservato complessivamente piu' banda di quella realmente a disposizione.

In caso di congestione, mentre le code di priorita' si ritirano al valore di banda specificato, le code con "bandwidth" possono eccedere il limite. Sostanzialmente in questo esempio potremmo avere una congestione con 256kbps di RTP, 64kbps di SIP e 512kbps di WEB, in caso di banda totale 256+512+64.

   random-detect
   random-detect exponential-weighting-constant 10
   random-detect precedence 0 20 40 10

  Siamo sempre nella classe WEB. I comandi "random-detect" fanno parte dei comandi per gestire la "Congestion Avoidance". Si tratta di tecnologie che mirano a prevedere possibili congestioni e limitarle. Questa tecnologia si chiama "WRED".

Sostanzialmente quando il traffico sta per raggiungere la saturazione si scartano dei pacchetti IP casualmente. Questo determina un rallentamento della trasmissione a causa del meccanismo di trasmissione del protocollo TCP. Il protocollo TCP infatti aumenta la finestra di trasmissione a meno di non riscontrare la mancata conferma di ricezione dei pacchetti. Se sono specificate delle priorita' i pacchetti a priorita' minore sono scartati prima degli altri.

In generale usare un meccanismo di tail-drop su piu' stream TCP in congestione non e' ottimale nel caso di molti flussi TCP. Questo perche' i flussi tendono a diventare sincronizzati tra di loro rallentando e accelerando simultaneamente come risposta alle congestioni. Ma rallentare insieme significa sottoutilizzare il link per un periodo di tempo. Allora un meccanismo come RED fa il drop in modo random su tutti i flussi tcp presenti per abbassare il traffico evitando problemi di congestione globale.

class class-default
  fair-queue 512
  queue-limit 70 

  La classe "default" raccoglie tutto il traffico che non e' stato accoppiato ad una coda. In questo esempio, ad esempio, il traffico "telnet", o "peer-to-peer". Questo traffico utilizzera' il WFQ con 512 flussi di traffico, tramite il comando "fair-queue". Le code di default sono di 64 pacchetti.

Con il comando "queue-limit" possiamo variare la lunghezza della coda. In questo caso l'aumentiamo a 70. Quando la coda si riempio il router inizia una politica di dropping dei pacchetti che puo' essere WRED se configurata. Il router assegna un valore di default a questo parametro. Un aumento della lunghezza della coda significa una minore perdita di pacchetti ma un aumento del delay. Qui stiamo facendo "shaping". Il comando "queue-limit" non ha senso in interfacce dove si fa "policing", ovvero dove c'e' il comando "priority".

!
interface FastEthernet0/0
description --- LATO INTERNO ---
 ip address 192.168.30.200 255.255.255.0
 load-interval 30
 duplex auto
 speed auto
!
 

 

interface FastEthernet0/1
description --- LATO ESTERNO ---
 ip address 192.168.10.1 255.255.255.0
 ip nbar protocol-discovery                        
 load-interval 30
 duplex auto
 speed auto
 service-policy output VOIP

 Da notare qui i comandi "ip nbar protocol-discovery" che abilita' NBAR, e "service-policy output VOIP" che applica la policy di QoS configurata al traffico in uscita nell'interfaccia FastEthernet 0/1. Le policy di questo tipo vengono configurate sempre in uscita, dove sono presenti le code.
Infatti se provate a mettere la service-policy in input otterrete:

itesys(config-if)#service-policy input VOIP
CBWFQ : Can be enabled as an output feature only

Come vedremo in seguito in inbound possiamo fare solo policing.

Figura 3 : Esempio di confiugurazione CB-WFQ con NBAR

  I comandi "bandwidth" e "priority" possono essere utilizzati anche indicando la percentuale di banda richiesta piuttosto che il valore assoluto della stessa, come e' possibile vedere dal seguente esempio":

!
class-map match-any SIP
 match protocol sip
class-map match-any WEB
 match protocol http
 match protocol secure-http
class-map match-any RTP
 match protocol rtp audio
 match protocol rtp payload-type "8"
 match protocol rtp payload-type "0"
 match protocol rtp payload-type "98"
class-map match-any POSTA
 match protocol pop3
 match protocol smtp
!
!
policy-map VOIP
 class RTP
  priority percent 50
  
 class SIP
  priority percent 10
 class POSTA
  bandwidth remaining percent 20 
 class WEB
  bandwidth remaining percent 70 
 class class-default
  fair-queue     <-- qui rimane il 10%
!
!
!
interface FastEthernet0/0
 ip address 192.168.30.200 255.255.255.0
 load-interval 30
 duplex auto
 speed auto
!
interface FastEthernet0/1
 ip address 192.168.10.200 255.255.255.0
 ip nbar protocol-discovery
 load-interval 30
 duplex auto
 speed auto
 service-policy output VOIP
!
 

Figura 4 : Esempio di confiugurazione. Comandi 'priority' e 'bandwidth'

Con il comando 'show policy-map' e' possibile verificare che la configurazione inserita e' stata recepita correttamente dal router:

Router#sh policy-map interface fastEthernet 0/1
 FastEthernet0/1

  Service-policy output: VOIP

    Class-map: RTP (match-any)
      0 packets, 0 bytes
      30 second offered rate 0 bps, drop rate 0 bps
      Match: protocol rtp audio
        0 packets, 0 bytes
        30 second rate 0 bps
      Match: protocol rtp payload-type "8"
        0 packets, 0 bytes
        30 second rate 0 bps
      Match: protocol rtp payload-type "0"
        0 packets, 0 bytes
        30 second rate 0 bps
      Match: protocol rtp payload-type "98"
        0 packets, 0 bytes
        30 second rate 0 bps
      Queueing
        Strict Priority
        Output Queue: Conversation 264
        Bandwidth 50 (%)
        Bandwidth 50000 (kbps) Burst 1250000 (Bytes)
        (pkts matched/bytes matched) 0/0
        (total drops/bytes drops) 0/0

    Class-map: SIP (match-any)
      326 packets, 165724 bytes
      30 second offered rate 0 bps, drop rate 0 bps
      Match: protocol sip
        326 packets, 165724 bytes
        30 second rate 0 bps
      Queueing
        Strict Priority
        Output Queue: Conversation 264
        Bandwidth 10 (%)
        Bandwidth 10000 (kbps) Burst 250000 (Bytes)
        (pkts matched/bytes matched) 0/0
        (total drops/bytes drops) 0/0

    Class-map: POSTA (match-any)
      83 packets, 9417 bytes
      30 second offered rate 0 bps, drop rate 0 bps
      Match: protocol pop3
        83 packets, 9417 bytes
        30 second rate 0 bps
      Match: protocol smtp
        0 packets, 0 bytes
        30 second rate 0 bps
      Queueing
        Output Queue: Conversation 265
        Bandwidth remaining 20 (%)Max Threshold 64 (packets)
        (pkts matched/bytes matched) 0/0
        (depth/total drops/no-buffer drops) 0/0/0

    Class-map: WEB (match-any)
      2093 packets, 2255242 bytes
      30 second offered rate 245000 bps, drop rate 0 bps
      Match: protocol http
        2093 packets, 2255242 bytes
        30 second rate 245000 bps
      Match: protocol secure-http
        0 packets, 0 bytes
        30 second rate 0 bps
      Queueing
        Output Queue: Conversation 266
        Bandwidth remaining 80 (%)Max Threshold 64 (packets)
        (pkts matched/bytes matched) 0/0
        (depth/total drops/no-buffer drops) 0/0/0

    Class-map: class-default (match-any)
      333 packets, 26274 bytes
      30 second offered rate 1000 bps, drop rate 0 bps
      Match: any
      Queueing
        Flow Based Fair Queueing
        Maximum Number of Hashed Queues 256
        (total queued/total drops/no-buffer drops) 0/0/0
Router#

Router#show policy-map VOIP
  Policy Map VOIP
    Class RTP
      Strict Priority         
      Bandwidth 50 (%)
    Class SIP
      Strict Priority
      Bandwidth 10 (%)
    Class POSTA
      Bandwidth remaining 20 (%) Max Threshold 64 (packets)
    Class WEB
      Bandwidth remaining 80 (%) Max Threshold 64 (packets)
    Class class-default
      Flow based Fair Queueing
      Bandwidth 0 (kbps) Max Threshold 64 (packets)
Router#       

Figura 5 : Comando 'show policy-map'

 Con il comando "show interfaces" e' possibile vedere quale meccanismo di queueing e' attivo sulle interfacce.

Router#show int
FastEthernet0/0 is up, line protocol is up
  Hardware is Gt96k FE, address is 001b.5484.fb46 (bia 001b.5484.fb46)
  Internet address is 192.168.30.200/24
  MTU 1500 bytes, BW 100000 Kbit, DLY 100 usec,
     reliability 255/255, txload 1/255, rxload 1/255
   ...snip...
  Queueing strategy: fifo
   ...snip...
FastEthernet0/1 is up, line protocol is up
  Hardware is Gt96k FE, address is 001b.5484.fb47 (bia 001b.5484.fb47)
  Internet address is 192.168.10.1/24
  MTU 1500 bytes, BW 100000 Kbit, DLY 100 usec,
     reliability 255/255, txlo55, rxload 1/255
   ...snip...
  Queueing strategy: Class-based queueing
   ...snip...
 

Figura 4 : Comando 'show interfaces' e queueing strategy

Con il comando "show queuing" e' possibile vedere i dettagli della configurazione delle code.

Router#show queueing
Current fair queue configuration:

  Interface           Discard    Dynamic  Reserved    Link    Priority
                     threshold   queues    queues    queues    queues
  FastEthernet0/1     64          256       256        8          1

Figura 6 : Comando 'show queueing'

Per vedere se la configurazione e' stata correttamente applicata all'interfaccia FastEthernet0/1 si utilizza il comando "show policy-map". Le informazioni fornite sono numerose ed estremamente utili. Infatti possiamo vedere in real-time il flusso di traffico che ricade in ogni classe definita. Nell'esempio che segue vediamo che c'e' un traffico di 85000bps di pacchetti RTP.

Router# show policy-map interface fastEthernet 0/1
 FastEthernet0/1

  Service-policy output: VOIP

    Class-map: RTP (match-any)
      7528 packets, 1610992 bytes
      30 second offered rate 85000 bps, drop rate 0 bps
      Match: protocol rtp audio
        0 packets, 0 bytes
        30 second rate 0 bps
      Match: protocol rtp payload-type "8"
        7528 packets, 1610992 bytes
        30 second rate 85000 bps
      Match: protocol rtp payload-type "0"
        0 packets, 0 bytes
        30 second rate 0 bps
      Match: protocol rtp payload-type "98"
        0 packets, 0 bytes
        30 second rate 0 bps
      Queueing
        Strict Priority
        Output Queue: Conversation 264
        Bandwidth 256 (kbps) Burst 6400 (Bytes)
        (pkts matched/bytes matched) 1/214
        (total drops/bytes drops) 0/0

    Class-map: SIP (match-any)
      293 packets, 151353 bytes
      30 second offered rate 2000 bps, drop rate 0 bps
      Match: protocol sip
        293 packets, 151353 bytes
        30 second rate 2000 bps
      Queueing
        Strict Priority
        Output Queue: Conversation 264
        Bandwidth 64 (kbps) Burst 1600 (Bytes)
        (pkts matched/bytes matched) 0/0
        (total drops/bytes drops) 0/0

    Class-map: class-default (match-any)
      211 packets, 17758 bytes
      30 second offered rate 0 bps, drop rate 0 bps
      Match: any
Router#

Figura 7 : Comando 'show policy-map interface'

   E' importante sapere che la somma dei valori "bandwidth" e "priority" dev'essere <= al 75% della banda disponibile (si presume che il 25% sia traffico non classificato come protocolli di routing). Altrimenti utilizzare il comando "max-reserved-bandwidth" per cambiarne il valore (all'interno della configurazione delle interfacce fisiche dove si applicano le service-policy). Per vedere quanta banca allocabile vi rimane potete usare, in caso di un circuito frame-relay, il comando "show traffic-shape queue"

router#show traffic-shape queue
Traffic queued in shaping queue on Serial0/0/0.1 dlci 50
Queueing strategy: weighted fair
Queueing Stats: 0/600/70/43975 (size/max total/threshold/drops)
Conversations 0/19/512 (active/max active/max total)
Reserved Conversations 0/0 (allocated/max allocated)
Available Bandwidth 175 kilobits/sec

Figura 8: Comando 'show traffic-shape queue'

Con il comando "show queue" e' possibile vedere lo stato delle code, ad esempio della Ethernet, nel caso dell'esempio1:

1800#show queue fastEthernet 0/1                              <--- Interfaccia a 10mbps
Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
Queueing strategy: Class-based queueing
Output queue: 0/1000/70/0 (size/max total/threshold/drops)    <-- "max total" e' l'aggregato di tutte le code WFQ
Conversations 0/1/512 (active/max active/max total)           <--- Una coda con pacchetti e' una conversazione attiva
Reserved Conversations 1/1 (allocated/max allocated)          <--- Code CBWFQ che non sono catturati dal WFQ
Available Bandwidth 6732 kilobits/sec

Figura 9 : Comando 'show queue'

75% di 10000= 7500 - 768 = 6732  <--- la banda della class-default non viene conteggiata perche' non c'e' un comando "bandwidth"

Applicazioni di CB-WFQ e di NBAR per la VoIP

   Poiche' la QoS e' molto utilizzata per la VoIP sara' utile richiamare la struttura della maggior parte dei pacchetti VoIP. La voce viene trasmetta tramite pacchetti RTP che sono inseriti all'interno di un pacchetto UDP/IP.


Figura 10 : Formato pacchetto RTP

 
 Ecco nel dettaglio la descrizione del contenuto dei campi di un pacchetto RTP:
 

Figura 11 : Dettaglio pacchetto RTP

  Poiche' non e' nostro scopo spiegare nel dettaglio come viene trasmessa la VoIP ci limitiamo ad attenzionare il campo indicato in figura con PT, ovvero "payload type". Questo campo, di 7 bit, indica il tipo di enconding della voce presente nel payload. Questo ci permette di differenziale flussi di traffico con codec differenti. L'RTP payload di "8" e' il PCMA. La sorgente dei pacchetti voce potrebbe utilizzare un numero differente per il PCMA.

Riprendiamo la configurazione dell'esempio 1. Durante il transito del traffico possiamo verificare quanti pacchetti rtp sono stati trovati.
 

Router# show ip nbar protocol-discovery protocol rtp

 FastEthernet0/1
                            Input                     Output
                            -----                     ------
   Protocol                 Packet Count              Packet Count
                            Byte Count                Byte Count
                            30sec Bit Rate (bps)      30sec Bit Rate (bps)
                            30sec Max Bit Rate (bps)  30sec Max Bit Rate (bps)
   ------------------------ ------------------------  ------------------------
   rtp                      14236                     7120
                            1907624                   1523680
                            104000                    83000
                            104000                    83000
   unknown                  0                         0
                            0                         0
                            0                         0
                            0                         0
   Total                    14588                     7533
                            2118723                   1683739
                            106000                    83000
                            110000                    87000

Router#show ip nbar protocol-discovery protocol pop3

 FastEthernet0/1
                            Input                    Output
                            -----                    ------
   Protocol                 Packet Count             Packet Count
                            Byte Count               Byte Count
                            30sec Bit Rate (bps)     30sec Bit Rate (bps)
                            30sec Max Bit Rate (bps) 30sec Max Bit Rate (bps)
   ------------------------ ------------------------ ------------------------
   pop3                     93                       83
                            5868                     9417
                            0                        0
                            1000                     3000
   unknown                  104                      131
                            6330                     7494
                            0                        0
                            1000                     1000
   Total                    2105                     2758
                            635534                   2485914
                            5000                     55000
                            47000                    283000

Router#show ip nbar protocol-discovery protocol http

 FastEthernet0/1
                            Input                    Output
                            -----                    ------
   Protocol                 Packet Count             Packet Count
                            Byte Count               Byte Count
                            30sec Bit Rate (bps)     30sec Bit Rate (bps)
                            30sec Max Bit Rate (bps) 30sec Max Bit Rate (bps)
   ------------------------ ------------------------ ------------------------
   http                     1432                     2131
                            374414                   2296137
                            5000                     55000
                            38000                    275000
   unknown                  104                      131
                            6330                     7494
                            0                        0
                            1000                     1000
   Total                    2106                     2758
                            635596                   2485914
                            5000                     55000
                            47000                    283000

Figura 12 : Comando 'show ip nbar'

  Abbiamo detto che il payload usato potrebbe cambiare in base alla sorgente di traffico. Se per esempio la sorgente di traffico e' una centrale telefonica Asterisk e' possibile utilizzare il comando "rtp debug" ed effettuare una telefonata con un codec noto. Ecco cosa accade nel caso di una telefonata con G711 e un telefono Thompson:

Got  RTP packet from    192.168.10.100:41000 (type 08, seq 002633, ts 239760, len 000080)
Got  RTP packet from    192.168.10.100:41000 (type 08, seq 002634, ts 239840, len 000080)
Sent RTP packet to      192.168.10.100:41000 (type 08, seq 028291, ts 210880, len 000160)
Got  RTP packet from    192.168.10.100:41000 (type 08, seq 002635, ts 239920, len 000080)
Got  RTP packet from    192.168.10.100:41000 (type 08, seq 002636, ts 240000, len 000080)
Sent RTP packet to      192.168.10.100:41000 (type 08, seq 028292, ts 211040, len 000160)

Figura 13 : Debug: pacchetti RTP G711 provenienti da un telefono IP

Nella figura successiva si vede il risultato nel caso di codec G729. Il payload type e' "18".

Sent RTP packet to      192.168.10.100:41000 (type 18, seq 018307, ts 021920, len 000020)
Got  RTP packet from    192.168.10.100:41000 (type 18, seq 000282, ts 022600, len 000010)
Got  RTP packet from    192.168.10.100:41000 (type 18, seq 000283, ts 022680, len 000010)
Sent RTP packet to      192.168.10.100:41000 (type 18, seq 018308, ts 022080, len 000020)
Got  RTP packet from    192.168.10.100:41000 (type 18, seq 000284, ts 022760, len 000010)
Got  RTP packet from    192.168.10.100:41000 (type 18, seq 000285, ts 022840, len 000010)
Sent RTP packet to      192.168.10.100:41000 (type 18, seq 018309, ts 022240, len 000020)   

Figura 14 : Debug: pacchetti RTP G729 provenienti da un telefono IP 

Riconsideriamo il campo "payload-type". Questo valore indica esattamente il tipo di codifica dei dati e ci puo' far capire che tipo di codec c'e' all'interno, ad esempio G711 o G729. Alcuni valori sono standard ma molti dispositivi se ne discostano. Il comando generico per riconoscere traffico RTP audio e' "match protocol rtp audio". In tal caso si lascia al router la responsabilita' di determinare automaticamente il traffico RTP audio. Nel caso in cui si e' fuori standard si puo' specificare manualmente il payload-type. La sintassi completa del comando e' in figura.

match protocol rtp [audio | video | payload-type payload-string]

 Figura 15: Comando 'match protocol rtp'

Vengono mappate come 'audio' le porte RTP da 0 a 23. Vengono mappate come 'video' le porte RTP da 24 a 33. Altrimenti con 'payload-type' vengono definite dall'utente. Segue un esempio di utilizzo di NBAR per catturare il flusso RTP.

class-map match-all giartp
class-map match-any SIP
  description --- match con la segnalazione ---
 match access-group name SIP-LIST
class-map match-any RTP
  description --- match con il traffico voce RTP --
 match ip rtp 16000 1000
 match protocol rtp audio      <-- NBAR
policy-map VOIP
 description --- questa va bene se non si usa il nat ---
 class SIP
  priority 64
 class RTP
  priority 256
policy-map parent
 class class-default
  shape average 350000
  service-policy VOIP
!
interface FastEthernet0/0.2
 description --- cementrade ---
 encapsulation dot1Q 231
 ip address 192.168.20.9 255.255.255.248
 no snmp trap link-status
 service-policy output parent

 Figura 16: NBAR e QoS

 Prendendo come esempio i telefoni IP thomson, questi danno la possibilita' di definire il valore di RTP payload manualmente, come in figura. Notate che i valori configurabili vanno da 97 a 127. Cosi’ per usare l’NBAR cisco bisogna fare una riga personalizzata e non si puo’ usare “match ip rtp audio” per il quale vale 'Audio—Specifies matching for payload type values 0-23'

Figura 17: NBAR e QoS

Consideriamo la configurazione della figura che segue. Si tratta di un collegamento frame-relay dove vengono riservati 512kbps per il traffico RTP, che in questi esempi sara' VoIP.

no ip cef
!
class-map match-any SIP
  description --- match con la segnalazione ---
   match access-group name SIP-LIST
!
class-map match-any RTP
   description --- match con il traffico voce RTP --
   match access-group 151
!
policy-map parent
   class class-default
   shape average 1400000
   service-policy VOIP
!
policy-map VOIP
   description --- questa va bene se non si usa il nat ---
   class SIP
     priority 64
   class RTP
     priority 512
!
...
interface Serial0/0/0
   description --- TD 941837/44 ---
   bandwidth 2048
   ip nat outside
   encapsulation frame-relay IETF
   load-interval 30
   frame-relay traffic-shaping    <- GINO: SE METTO QUESTA NON FA METTERE LA (2) E VICEVERSA
!
interface Serial0/0/0.1 point-to-point
  description --- TD 941837/44 subinterface ---
  bandwidth 2048
  ip address 83.211.4.186 255.255.255.255
   ip nat outside
  frame-relay interface-dlci 20 IETF    <-- (2)
     class VOIP2
!
map-class frame-relay VOIP2
   frame-relay cir 1400000                 
   frame-relay bc 128000
   service-policy output parent
!
...
ip access-list extended SIP-LIST
     permit udp any any eq 5060
!
!Questo e' l'ip del gateway SIP (attenzione, qui .131 e' il registration proxy, ma rtp e' 133)
access-list 151 permit udp any host 192.168.10.133
!Questo e' nel caso dovesse cambiare l'ip del gateway sip  
access-list 151 permit udp any range 16384 16500 any 

Figura 18: Configurazione QoS di esempio

Con questo test vogliamo verificare la banda effettivamente utilizzata da un telefono IP, in questo caso un Cisco Linksys SPA, in una telefonata SIP con protocollo G729. Utilizzando un CB-WFQ possiamo isolare il traffico RTP. Effettuando una unica telefonata e' possibile ottenere il dato come in figura. Troviamo che una telefonata G729 occupa 19kbps effettivi di banda come mostra la figura successiva.
 

acme-roma-grat#sh policy-map interface serial 0/0/0.1
Serial0/0/0.1: DLCI 20 -

Service-policy output: parent

Class-map: class-default (match-any)
1050589 packets, 942463925 bytes
30 second offered rate 168000 bps, drop rate 0 bps
Match: any
Traffic Shaping
Target/Average Byte Sustain Excess Interval Increment
Rate Limit bits/int bits/int (ms) (bytes)
1400000/1400000 8750 35000 35000 25 4375

Adapt Queue Packets Bytes Packets Bytes Shaping
Active Depth Delayed Delayed Active
- 0 1049826 941433953 375193 381617645 no

Service-policy : VOIP

Class-map: SIP (match-any)
14418 packets, 5269237 bytes
30 second offered rate 3000 bps, drop rate 0 bps
Match: access-group name SIP-LIST
14418 packets, 5269237 bytes
30 second rate 3000 bps
Queueing
Strict Priority
Output Queue: Conversation 72
Bandwidth 64 (kbps) Burst 1600 (Bytes)
(pkts matched/bytes matched) 47/16675
(total drops/bytes drops) 0/0

Class-map: RTP (match-any)
60118 packets, 8339316 bytes
30 second offered rate 19000 bps, drop rate 0 bps
Match: access-group 151
60118 packets, 8339316 bytes
30 second rate 19000 bps       <--- banda occupata da un linksys in G729.
                                    Attenzione che qui non si vede il pacchetto
                                    IP/UDP che occupa molto spazio e dentro il
                                    quale ci sta RTP

Queueing
Strict Priority
Output Queue: Conversation 72
Bandwidth 512 (kbps) Burst 12800 (Bytes)
(pkts matched/bytes matched) 587/98508
(total drops/bytes drops) 0/0

Class-map: class-default (match-any)
976053 packets, 928854160 bytes
30 second offered rate 145000 bps, drop rate 0 bps
Match: any

Figura 19: Traffico VoIP per G729

 

 

LLQ per circuiti ATM e Frame-Relay

 
  In molti casi la QoS va applicata in circuiti WAN basati sul protocollo Frame-Relay o ATM. Basti pensare alle connettivita' ADSL, che sono basate su ATM. Secondo la documentazione Cisco, ma anche secondo il buon senso, una politica di QoS si puo' solo realizzare quanto sono noti chiaramente i parametri contrattuali di banda con l'operatore che ci vende un collegamento WAN. Se dobbiamo collegare due sedi di un ufficio, dobbiamo richiedere una banda garantita ben precisa per entrambe le sedi, e su quella banda garantita configurare una politica di QoS outbound per entrambe le sedi. Solo in questo modo la nostra configurazione funzionera' correttamente.

   Non e' possibile implementare politiche di QoS in collegamenti senza banda garantita perche', come e' ovvio che sia, il provider scarterebbe i pacchetti in eccesso in base alla banda disponibile durante la giornata, rendendo vano il tentativo del router di dare priorita' ad un certo tipo di traffico. Sarebbe perfettamente inutile fare passare per primi i pacchetti VoIP se poi e' il provider a scartarli!   In ogni caso la trattazione di questo documento e' rivolta a tutti quei casi dove non e' possibile, per motivi di budget, acquistare collegamenti a banda garantita "reale". Infatti non basta avere la banda garantita ad entrambi i capi di un collegamento WAN. E' importante avere la certezza che non vi siano tratte congestionate tra i due capi. Per far questo i due capi di un collegamento con QoS "dovrebbero avere collegamenti con banda garantita di uno stesso operatore". Questo problema non si pone se acquistiamo collegamenti ATM o frame-relay punto-punto. Se invece volessimo utilizzare due collegamenti ADSL verso Internet con banda garantita ma con due operatori differenti, non e' detto che un trasferimento dati da un capo all'altro abbia quella banda garantita.

    Insomma, se dobbiamo fare QoS tra due punti, dobbiamo effettuare un collegamento con banda garantita con un operatore che sia in grado di darci uno SLA (service level agreement) ben preciso. E' per chi vuole sfruttare collegamenti verso Internet invece che circuiti punto-punto, sappia che dovra' sacrificare la banda in eccesso rispetto quella garantita, specialmente se si vuole fare QoS per circuiti voce o video.
 

L'algoritmo di Token Bucket e il frame-relay

Nel caso di un circuito frame-relay si definiscono questi parametri:

- CIR ovvero banda massima media garantita;
- valore medio M di traffico consentito sull'interfaccia  (CIR - mediato su qualche secondo);
- valore di burst Bc ovvero CIR per unita' di tempo, che e' una frazione di secondo;
- intervallo di tempo t;
- valore di burst exceeded Be ovvero bit che si possono inviare oltre al Bc e quindi al CIR;

  Supponiamo allora di avere un tipico collegamento frame-relay a 2mbps. Avremo un CIR ovvero un valore medio di traffico (media su un certo numero di secondi) che il provider ci garantisce e che abbiamo contrattualizzato. I blocchi dati vengono inviati in modo da trasmetterne in 1 secondo non oltre il valore di CIR configurato. Ma quanto sono grandi questi blocchi di dati? Possono introdurre delay e jitter per la voip. Per configurarne la dimensione si usa il burst size (Bc)

Tc = Bc / CIR

Figura 19 : Algoritmo Token Bucket

dove Tc e' il segmento di tempo che indica il tempo per l'invio di uno dei blocchi di cui sopra.

Se il CIR e' 100kbps e il Bc e' di 1000 bit (ovvero 0,010 x CIR come consigliato da Cisco) avremo un valore di Tc di 0,01 ovvero 10ms. Ogni 10ms verranno inviati 1000 bit alla velocita' di clock di 2mhz cosi' da ottenere in un secondo il valore di CIR. Quindi Bc non ha niente a che fare con trasmissione al di sopra del CIR (nb. errore comune). Invece Be indica di quanto si puo' aumentare Bc con lo scopo di andare oltre il valore di CIR.
  
Il Token Bucket e' un meccanismo per gestire il traffico che attraversa una interfaccia.  Il token bucket e' utilizzato dai router Cisco quale parametro nella gestione della QoS. Ma come? Si crea un cestino (virtuale) di dimensione Bc bit chiamato token bucket. Nel cestino entrano CIR token al secondo. Ogni token e' dato ad un bit cosi', se non ci fossero problemi, il cestino dovrebbe restare sempre pieno e i dati sempre trasmessi. Se non ci sono token si blocca la trasmissione.

Poiche' pero' ci saranno applicazioni che vogliono mandare dati a velocita' maggiore del CIR (in quanto le applicazioni non sono consapevoli della banda disponibile) i token si esauriscono e la trasmissione dati viene bloccata finche' non se ne accumulano a sufficienza.

Il router cerchera' Bc token per ogni trasmissione in quanto invia Bc bit per ogni Tc.Se pertanto creiamo dei cestini di dimensione opportuna per alcuni flussi di traffico (alla fine associati a ACL) possiamo limitare la banda disponibile per questi servizi. Si tratta di creare N cestini con CIR_N per cestino. Normalmente la CIR_1+CIR_2+...+CIR_N <= CIR.


LLQ  Frame-Relay


    Quanto detto, nel caso di un circuito frame-relay vuol dire avere ben chiari i valori di minCIR e CIR garantiti dall'operatore sul circuito nel quale si lavora. "La somma dei valori di priority e bandwith che utilizziamo dovra' essere inferiore al valore di minCIR. Di default, minCIR e' la meta' del CIR. Insomma, dobbiamo considerare la banda realmente garantita.

    Ecco come procedere:

 

1

frame-relay traffic-shaping

Nell'interfaccia seriale relativa al circuito frame-relay (non nella sotto interfaccia) si deve abilitare il traffic shaping. Senza questo comando non funzionerebbero le map-class e l'LLQ. Quindi questo passo e' fondamentale.

2

interface Serial0/0/0
encapsulation frame-relay IETF
no fair-queue
frame-relay traffic-shaping
frame-relay lmi-type cisco
!
interface Serial0/0/0.1 point-to-point
description ---- HDSL ---
ip address 192.119.211.62 255.255.255.252
frame-relay interface-dlci 50 IETF
class VOIP2
!

Nella subinterface sara' presente il comando "class" che si associa al successivo comando "map-class" dove si specifica la banda totale disponibile nel circuito

3

map-class frame-relay VOIP2
  no frame-relay adaptive-shaping
  frame-relay cir 1300000
  frame-relay bc 12000
  frame-relay be 0
  frame-relay mincir 1200000
  service-policy input INPUT_VOIP
  service-policy output VOIP
 

In questo caso abbiamo un circuito con banda garantita di 1,2mbps. CIR e minCIR allora corrispondono. Il minCIR sarebbe di default il 50% del CIR quindi e' bene specificarlo perche' questo e' il valore di banda disponibile sull'interfaccia che il router utilizza nei calcoli di banda allocabile.

Con il comando "no frame-relay adaptive-shaping" disabilitiamo l'adaptive shaping che consiste in un automatismo con cui il router stabilisce la velocita' di trasmissione sul circuito in risposta alle notifiche di congestione di tipo BECN. Il punto e' che non bisogna superare la banda garantita. Non ci si puo' affidare al meccanismo del Frame-Relay di gestione della congestione, con i messaggi BECN, perche' la qualita' della VoIP ne risente.

Il valore di "be" dev'essere zero perche' altrimenti un pacchetto VoIP potrebbe essere inviato in un burst. Il CIR=Tc/Bc. Si possono mandare "Bc" frames in un periodo di "Tc" secondi. Se riduciamo Tc un pacchetto voce dovra' aspettar meno prima di essere inviato. Notiamo la presenza di un "service-policy input", in apparente contraddizione con quanto detto nei paragrafi precedenti. Analizzeremo questa riga in seguito quando si approfondira' il problema del traffico in ingresso.

Figura 20 : Esempio di configurazione LLQ su circuito Frame-Relay

  Per la service-policy vale quanto detto nei paragrafi precedenti. Ricordatevi la limitazione di default del 75% della banda allocabile e la verifica della banda non ancora allocata con "show traffic-shape queue".

LLQ  ATM

Osserviamo il seguente esempio:
 

1


interface ATM0/0.1 point-to-point
  ip route-cache
  pvc 10/100
   cbr 64   (oppure, ad esempio: vbr-nrt 512 512)
   encapsulation aal5snap
   protocol ppp Virtual-Template1
   tx-ring-limit 10
 

Nel pvc relativo al circuito utilizziamo il comando "cbr", o il "vbr-nrt" per indicare la banda garantita. Non e' possibile utilizzare UBR con CBWFQ. Il fatto che possa essere un PCR molto piu' altro, ad esempio 512kbps, non e' rilevante ai fini del QoS. Di fatto perdiamo la banda eccedente i 64kbps, che pero' non e' garantita. Ecco allora che ha senso fare QoS solo su circuiti con una buona banda garantita. Notate il comando "tx-ring-limit" commentato sotto. "vrb-nrt" vale per il traffico in uscita.

2


interface Virtual-Template1
bandwidth 64
max-reserved-bandwidth 99
service-policy output VOIP
...
 

Qui applichiamo la policy. Da notare il "max-reserved-bandwidth 99" che ci permette di allocare tutta la banda disponibile, che per default e' allocabile nelle policy al 75%.

Figura 21 : QoS e circuiti ATM

    Il comando "tx-ring-limit" permette di fare il tuning della coda di basso livello associata ad un'interfaccia. Normalmente non e' necessario modificare questo parametro. Questa e' una coda che funziona solo in modalita' FIFO in quanto la linea di trasmissione e' una e quindi una sara' la coda. Sostanzialmente definisce il numero di pacchetti che possono aspettare la trasmissione a livello 2. Diciamo che per migliorare la qualita' della voce non si deve utilizzare un valore alto per questo parametro. A livello 3 poi ci sono le code software gestibili con i comandi spiegati sino ad ora. Quando una ring in trasmissione si riempie, l'interfaccia ATM sposta i dati a layer-3. Si notifica al processore di layer-3 di non inviare piu' pacchetti al layer-2.Per vedere il settaggio del ring si usa il comando "show controller atm".

Se si configura un PVC senza specificare il PCR il circuito automaticamente diventa di tipo UBR. Questo PVC avra' un PCR automaticamente pari alla velocita' della linea. Nel momento in cui c'e' un traffico in uscita superiore a quello che puo' gestire il PVC (o che e' configurato con lo shape) il router attiva il queueing e i meccanismi di drop come WRED o altri (se configurati esplicitamente).

Per determinare se si sta superando la banda disponibile basta verificare il valore OutPktDrops come in figura:

core-2600#sh int atm0/0
ATM0/0 is up, line protocol is up
  Hardware is DSLSAR (with Alcatel ADSL Module)
  Description: --- TISCALI ---
  MTU 4470 bytes, sub MTU 4470, BW 640 Kbit, DLY 800 usec,
     reliability 255/255, txload 24/255, rxload 27/255
  Encapsulation ATM, loopback not set
  Encapsulation(s): AAL5  AAL2, PVC mode
  23 maximum active VCs, 256 VCs per VP, 1 current VCCs
  VC Auto Creation Disabled.
  VC idle disconnect time: 300 seconds
  Last input never, output 00:00:00, output hang never
  Last clearing of "show interface" counters 4d00h
  Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 25313
  Queueing strategy: Per VC Queueing
  30 second input rate 68000 bits/sec, 23 packets/sec
  30 second output rate 61000 bits/sec, 22 packets/sec
     7519768 packets input, 1868924255 bytes, 0 no buffer
     Received 0 broadcasts, 0 runts, 0 giants, 0 throttles
     0 input errors, 8 CRC, 0 frame, 0 overrun, 0 ignored, 0 abort
     8116856 packets output, 490785195 bytes, 0 underruns
     117 output errors, 0 collisions, 2 interface resets
     0 output buffer failures, 0 output buffers swapped out

Figura 22 : Output drops in interfacce ATM

 

...
TxQInfo for vcd 0
--------------------
tx_ring_limit=10, max_tsi_seq_num=4, max_tx_time=268200
Total number of packets = 0
Total number of packets transmitted = 0
Total number of packets dropped = 0
HP TxQInfo for vcd 0
--------------------
tx_ring_limit=30, max_tsi_seq_num=20, max_tx_time=268200
Total number of packets = 0
...

Figura 23 : Comando 'show controller atm'

   Il protocollo ATM fornisce numerose classi di servizio quali VBR, CBR, UBR. Questo perche' ATM e' un protocollo che nasce per fornire una robusta gestione della qualita' del servizio e dell'ingegneria del traffico. Quando acquistiamo un circuito ATM, che puo' essere ad esempio un circuito ADSL o SHDSL, il fornitore del servizio configura sul nostro circuito una qualita' del servizio fornendoci parametri come PCR (peek cell rate) che rappresenta il valore massimo ma non garantito sulla linea, e poi valori quali l'MCR che rappresenta il minimum cell rate (e quindi garantito). Il VBR a sua volta puo' essere VBR-nrt (data+voip) o il VBR-rt (se solo voip o video). Un CBR e' un circuito con un PCR=MCR. Ecco un riepilogo:     

  - PCR   picco che si puo' mantenere per MBS celle
  - SCR   banda media garantita
  - MCR  banda minima garantita

  VBR-nrt usa l'algoritmo di token-bucket. Il token bucket si riempie alla velocita' dell'SCR e non del PCR. E qui sta la differenza. Infatti se si trasmette alla velocita' del PCR si potra' farlo sino allo svuotamento del bucket. A questo punto saro' costretto a trasmettere alla velocita' indicata dall'SCR finche' il bucket non ritorna ad un valore tale da permettere un altro burst. Il parametro MBS determina la dimensione massima del pacchetto che si puo' spedire come burst. Ad esempio 32 celle ATM possono trasmettere un pacchetto di 1500byte in quanto 32*53byte=1696byte.

Per un circuito XDSL con trasmissione voce/dati e' ideale utilizzare vbr-nrt con il PCR=SCR>MCR

  Tutti questi parametri dovrebbero essere dati dal fornitore di servizio, ma non e' sempre semplice averli. Oltretutto molti collegamenti XDSL di fascia bassa sono configurati con UBR. In tal caso dovremmo chidere un servizio di qualita' superiore, oppure configurare il nostro router con un vbr-nrt specificando una banda garantita che siamo sicuri di avere, al di la' della configurazione lato provider.

  Nota su UBR: Con UBR gli switch ATM dell'operatore cestinano le celle quando i loro buffer si riempiono, perche' congestionati. Il servizio UBR di ATM non ha un meccanismo di notifica della congestione. Semplicemente implementa una politica "tail drop".

Ecco un esempio con una configurazione tipica di LLQ in uscita in una interfaccia ATM:

!
class-map match-all VOICE
 match access-group 100
!
policy-map MYPOLICY
 class VOICE
  priority 160
 class class-default
  bandwidth 320
!
...
interface ATM0/0.1 point-to-point
 ip address 192.168.2.2 255.255.255.0
 pvc 0/101
  protocol ip 192.168.2.1 broadcast
  vbr-nrt 640 640     <--- e' per l'outbound
  tx-ring-limit 3
  service-policy output MYPOLICY
!
...
access-list 100 permit udp any any precedence critical
!

Figura 24 : LLQ in interfaccia ATM

 

SECONDA PARTE

QUALITA' DEL SERVIZIO IN INPUT

  I comandi service-policy sono stati inseriti in "output" sulle interfacce e non in "input". Questo perche' possiamo fare shaping solo in uscita. Infatti per il traffico in uscita il punto di congestione e' il CPE (ad esempio il router ADSL o HDSL) in quanto il traffico proviene da una rete ad alta velocita' come una Ethernet. Nel caso del traffico in ingresso il punto di congestione e' esterno al router e si trova presso il provider ISP fornitore di connettivita'. In ingresso possiamo fare policing. La tecnologia che si utilizza e' il CAR,  tramite il comando "car" o tramite il comando "police" all'interno di una classe di servizio.

Il comando police

Con il comando "police" e' possibile aggiungere il traffic-policy in ingresso nelle configurazioni dei paragrafi precedenti. I comandi "priority" e "bandwidth" non possono essere utilizzati in ingresso. Il comando "police" puo' essere utilizzato in ingresso. Esaminiamolo con attenzione:

police cir percent percentage [burst-in-ms] [bc conform-burst-in-msec ms] [be peak-burst-in-msec ms] [pir percent percent]
police bps [burst-normal] [burst-max] conform-action action exceed-action action [violate-action  action]

Figura 25 : Comando 'police'

I parametri "bc" e "be" hanno lo scopo di scartare i pacchetti gradualmente, un po' come fa WRED, per evitare che i pacchetti vengano scartati per "tail drop". I valori sono in millisecondi. I valori Bc e Be sono stati spiegati nel paragrafo dell'algoritmo tocken-bucket.

CAR

  CAR ci permette di limitare il traffico che attraversa una interfaccia (si puo' agganciare ad una qualsiasi access-list). CAR fa policy e non shaping. Un secondo uso di CAR e' quello di classificare i pacchetti in base alla loro tipologia (ad esempio cambiandone la priorita' usando ToS e delegando la limitazione di banda ad altra policy). CAR e' spesso configurato nei router di confine di una rete, punto ideale per gestire la banda disponibile esternamente. CAR usa il token bucket per determinare quanta banda si sta utilizzando. Il CAR usa i concetti di burst e extended burst. Questi operano in modo simile a quanto gia' spiegato per il frame-relay.

CAR QUINDI NON FA RESERVATION DI BANDA MA CONTROLLA SOLO CHE NON SUPERA UNA CERTA SOGLIA <--- VERIFICARE

Cisco consiglia la scelta di questi valori con questa formula:

normal burst = configured rate * (1 byte)/(8 bits) * 1.5 seconds
extended burst = 2 * normal burst

Figura 26 : CAR e 'burst'

CAR e' aggressivo, fa drop dei pacchetti in eccesso e il protocollo TCP e' costretto a ritrasmetterli e a ridurre la finestra di trasmissione.
Ecco la sintassi del comando: 

rate-limit {input | output} [access-group [rate-limit] acl-index] bps burst-normal burst-max conform-action action exceed-action action

Figura 27 : Comando 'rate-limit'

la spiegazione dei parametri sara' fatta con un esempio pratico nei prossimi paragrafi.

Configurazione con CAR

 Supponiamo che in input si voglia limitare la banda per i servizi http a 100kbps. Cio' vuol dire che vogliamo che l'accesso http non occupi mai piu' di 100kbps. La banda restante sara' a disposizione degli altri servizi. Se non c'e' traffico http tutta la banda sara' a disposizione di altri servizi.

  La configurazione del CAR non e' richiede solo il semplice valore di 100kbps. Infatti un flusso TCP non puo' essere vincolato ad una larghezza di banda perfettamente pari ad un valore in quanto la dimensione dei pacchetti e variabile e la dimensione della finestra e' variabile. Quando una connessione supera i 100kbps e si fa un packet drop allora il sender, tramite l'algoritmo di back-off, diminuisce la finestra e invia nuovamente il pacchetto. Poi provera' nuovamente ad allargare la finestra. Percio' un flusso TCP puo' oscillare attorno ad un valore ma non mantenerlo costantemente. Attenzione che cio' e' vero per il TCP e non per l'UDP. Da queste considerazioni nascono tre parametri.

  Il valore di 100kbps lo definiamo quindi come 'average rate' ovvero e' un valore medio a lungo termine di flusso.
 

!
ip cef
!
interface FastEthernet0/1
description ------ OUTBOUND ----
ip address 192.168.30.241 255.255.255.0
rate-limit input access-group 100 1000000 120000 240000 conform-action continue exceed-action drop
service-policy output VOIP
!

Figura 28 : Esempio di configurazione CAR

  Consideriamo un semplice caso di un router con due interfacce Ethernet (100mbps) attraversate da intenso traffico. Vediamo cosa succede applicando il policing. I test a seguire sono stati realizzati con l'aiuto del software opensource "iperf".

Ecco il nostro schema di rete:

192.168.30.230 (server) --- OUTBOUND --- ROUTER CISCO serie 1800 ios 12.4 --- INBOUND --- 192.168.10.241 (client)

Figura 29 : LAB per test CAR

La figura mostra cosa accade nel caso di un traffico intenso senza restrizioni di policing applicate:

-----------------------------------------------------------
client --> server
------------------------------------------------------------
[ 5] local 192.168.30.230 port 5001 connected with 192.168.10.241 port 2892
[ 5] 0.0-10.0 sec 112 MBytes 94.0 Mbits/sec
------------------------------------------------------------
server--> client
------------------------------------------------------------
[ 5] local 192.168.30.230 port 55473 connected with 192.168.10.241 port 5001
[ 5] 0.0-10.0 sec 111 MBytes 93.1 Mbits/sec

Figura 30 : LAB: test iniziale con CAR non attivo

Test 1: Flusso TCP di circa 100kbps in ingresso dalla rete esterna

  Applichiamo il rate-limit sul traffico in input dell'interfaccia fasteth0/1 (per input si intende, come l'intuito suggerisce, il traffico proveniente dal cavo collegato all'interfaccia fasteth0/1).

average = 100000
Bc = 100000/8*1.5 = 18750
Be = Bc * 2 = 37500

Figura 31 : LAB test1 rate-limit - calcolo banda

Utilizzando una notazione propria del Frame-relay diciamo che "average" e' il CIR, che e' 100000 bytes. Il burst e' Bc. Il valore di Tc = Bc/CIR = 18750/100000=0,187 sec= 187ms. Vuol dire che il policer permettera che ogni 187ms possono transitare 18750 bytes. In un secondo avremo circa 6 Tc. Un valore piu' basso di Bc implica la presenza di un numero di intervalli di tempo maggiore per mandare il traffico e diminuisce la latenza. Questo e' buono per traffico come il VoIP. D'altro canto un burst troppo piccolo dara' una banda inferiore al valore specificato.
 
L'extended burst puo' essere disattivato (posto pari al normal burst) quando e piu' alto del normal burst. Indica di quanti byte puo' essere superato il normal burst. Nel traffico che ricade nell'extended burst la policy di drop dei pacchetti e' simile a quella del RED. Il flusso di traffico che cade nella fascia dell'extended bust piu' volte viene penalizzato maggiormente.  E' necessario il CEF per usare il CAR.

Il test e' stato effettuato su un periodo di 10 secondi di trasmissione.

interface FastEthernet0/0
description ---- INSIDE ----
ip address 192.168.10.254 255.255.255.0
!
interface FastEthernet0/1
description ------ OUTBOUND ----
ip address 192.168.30.241 255.255.255.0
rate-limit input access-group 10 96000 18750 37500 conform-action continue exceed-action drop
!
access-list 10 permit 192.168.30.230

Figura 32 : LAB test1 rate-limit - configurazione

Dalla configurazione si evince che il traffico che ha come mittente l'indirizzo IP 192.168.30.230 e' soggetto a rate-limit in input. In presenza di NAT il rate-limit viene fatto dopo (nel caso di traffico in uscita viene fatto sull'ip pubblico)

1a prova
------------------------------------------------------------
traffico dal client verso il server (non rate-limit in quanto outbound su fasteth0/1)
------------------------------------------------------------
[ 4] local 192.168.30.230 port 5001 connected with 192.168.10.241 port 2881
[ 4] 0.0-10.1 sec 11.3 MBytes 9.33 Mbits/sec
------------------------------------------------------------
traffico dal server verso il client (con rate-limit in quanto input su fasteth0/1)
------------------------------------------------------------
[ 4] local 192.168.30.230 port 50883 connected with 192.168.10.241 port 5001
[ 4] 0.0-11.4 sec 128 KBytes 92.3 Kbits/sec

Figura 33 : LAB - prova 1 -

2a prova
[ 5] local 192.168.30.230 port 5001 connected with 192.168.10.241 port 2882
[ 5] 0.0-10.3 sec 11.0 MBytes 8.99 Mbits/sec
[ 5] local 192.168.30.230 port 50884 connected with 192.168.10.241 port 5001
[ 5] 0.0-11.0 sec 168 KBytes 125 Kbits/sec

Figura 34 : LAB - prova 2 -

3aprova
[ 4] local 192.168.30.230 port 5001 connected with 192.168.10.241 port 2885
[ 4] 0.0-10.2 sec 12.4 MBytes 10.2 Mbits/sec
[ 4] local 192.168.30.230 port 37016 connected with 192.168.10.241 port 5001
[ 4] 0.0-10.9 sec 160 KBytes 120 Kbits/sec

Figura 35 : LAB - prova 3 -

Notiamo che limitare la banda in ingresso puo' limitare anche la banda in uscita quanto piu' il traffico e' simmetrico. Se volete variare la "windows size" utilizzate il parametro "-w" di iperf.
 

Test 2. Flusso TCP di circa 100kbps in ingresso e uscita dalla rete esterna

 

[ 4] local 192.168.30.230 port 5001 connected with 192.168.10.241 port 2898
[ 4] 0.0-11.1 sec 136 KBytes 100 Kbits/sec

[ 4] local 192.168.30.230 port 41936 connected with 192.168.10.241 port 5001
[ 4] 0.0-11.3 sec 144 KBytes 105 Kbits/sec

Figura 36 : LAB - test2 - Assegnazione traffico

interface FastEthernet0/1
description ------ OUTBOUND ----
ip address 192.168.30.241 255.255.255.0
rate-limit input access-group 10 96000 18750 37500 conform-action continue exceed-action drop
rate-limit output access-group 100 96000 18750 37500 conform-action continue exceed-action drop

access-list 10 permit 192.168.30.230
access-list 100 permit ip any host 192.168.30.230
 

Figura 37 : LAB test2 - configurazione

Conclusioni test CAR

  Per il traffico UDP iperf non e' in grado di calcolare la larghezza di banda di un link. E' in grado di inviare un flusso CBR di pacchetti UDP e verificare il numero di datagrammi inviati e ricevuti. Inoltre indica il valore di jitter ovvero il tempo necessario per riassemblare piu' pacchetti IP per ricostruire un singolo datagramma UDP (quando richiede piu' di un pacchetto). Con UDP non esiste un meccanismo di backoff come per TCP cosi' nel CAR l'uso di Be non serve a nulla. In questo caso CAR tagliera' i pacchetti in eccesso e alla destinazione arriveranno dati incompleti (o voce a tratti se state usando la voip).

E' interessante usare il test UDP per vedere i packet-loss che non si vedono con il test sul TCP. Quindi per il test di un collegamento va usato insieme al test sul TCP.

Per quanto riguarda la VoIP il CAR e' utile per il traffico in ingresso. Infatti in caso di collegamenti di apparati verso Internet (XDSL, CDN, etc.) se volete avere banda riservata in ingresso per la voip non potete fare molto di piu' che mettere un "rate-limit" per limitare il traffico non VoIP.

Questo vi obbliga a rinunciare in modo permanente alla banda in ingresso riservata per il voip, anche quando non c'e' traffico voip. Pero' bisogna lavorare sulla banda garantita. Infatti la banda in ingresso spesso non e' garantita dal provider, quindi bisogna usare esperienza e buon senso. Non potete usare altre tecniche di shaping/policy in ingresso in quanto, in casi come collegamenti verso Internet, e' l'ISP che decide la policy per voi a monte in base a quanto contrattualizzato.

Qualita' del servizio in ingresso per collegamenti a banda variabile

  Come abbiamo potuto osservare una qualita' del servizio per traffico in ingresso da un collegamento WAN che non siamo in grado di amministrare da entrambi i capi (caso tipico collegamento ADSL verso un ISP) e' fattibile solo se si lavora nella fascia di banda garantita a disposizione. Se infatti si chiede piu' banda di quella disponibile sara' il carrier a tagliare il traffico scartando senza criterio pacchetti IP.

   Ci domandiamo fino a che punto possiamo spingerci per sfruttare al massimo ogni singolo bit di banda a disposizione. Devo dire che, al momento in cui scrivo, non si puo' far molto con i router Cisco. Questa in realta' non e' una limitazione della piattaforma ma piuttosto il contrario: sono router ben fatti e non ci sono applicazioni che non funzionerebbero con la necessaria affidabilita'.

   In realta' con gli script TCL e EEM anche con Cisco possiamo immaginare una soluzione personalizzata. Infatti una class map e' in grado di fare il detect della VoIP e uno script TCL puo' vedere tramite MIB tale parametro. Quindi con EEM si puo' riconfigurare la class map finche' c'e' traffico voip. Attualmente il MIB dovrebbe essere aggiornata ogni 10 secondi quindi la voce potrebbe non essere rilevata all'istante.

   In alternativa si puo' utilizzare un server Linux con snort, che e' in grado di fare lo sniffing del traffico e rilevare il Voip (ad esempio dalle porte UDP utilizzate con RTP), quindi SEC, un correlatore di eventi che e' in grado di eseguire script in corrispondenza di una serie di eventi letti in un file di log, e infine uno script in Perl in grado di fare telnet (con il package Net::Telnet) in un router per cambiare la configurazione.  Su Internet si trova della documentazione, ad esempio cercando "APPLICATION AWARE TRIGGERED QUALITY OF SERVICE (AATQoS)"  
 

DSCP

Il protocollo IP prevede un byte per ogni pacchetto chiamato Type Of Service (ToS). Di questo byte vengono utilizzati 3 bit che prendono il nome di "IP precedence" e che consentono di etichettare i pacchetti in base alla precedenza che devono avere in rete. Ovviamente affinche' il tutto funzioni tutti i router della rete devono considerare il contenuto di tale byte e trattare il traffico di conseguenza. Nei router Cisco esiste il comando "ip precedence" proprio per gestire questo valore.

Questo modo di interpretare il byte di precedenza IP e' indicato nell'RFC-791.

In tempi piu' recenti e' stato introdotto un nuovo standard e un nuovo modo di interpretare il contenuto del byte ToS. Il nuovo standard si chiama DiffServ ed utilizza 6 degli 8 bit a disposizione.

Secondo questo nuovo formato il campo ToS viene anche chiamato DSCP (Differentiated Services Code Point).

 Con DiffServ intendiamo l'abbreviazione di "Differentiated Services".

Consideriamo quindi il byte DiffServ. I primi sei bit sono DSCP e sono indicati con DS0-DS5. I due restanti bit sono indicati con 'IP ECN' e non sono utilizzati. DS3,DS4,DS5 indicano la priorita' ed hanno la stessa posizione dei campi "ip precedence" del ToS. Questo permette una parziale compatibilita' con quei router che interpretano il ToS byte secondo RFC-791.

I valori DSCP nella forma xxx000, con x pari a 0 o 1 permettono di conservare la compatibilita' con IP precedence.
Ecco i valori di questi tre bit:
 

Valore Descrizione
7

Questo traffico ha priorita' massima. Deve essere traffico di controllo per la rete, come i keepalive.

6

Traffico ad alta priorita', ad esempio le informazioni dei protocolli di routing come RIP, EIGRP etc.

5

Classe EF - traffico ad alta priorita', ad esempio VoIP

4

Class 4 -AF-

3 Class 3 -AF-
2 Class 2 -AF-
1 Class 1 -AF-
0 Best effort

Figura 38 : Valori DSCP

Una volta fissati gli ultimi 3 bit, vengono utilizzati DS1-DS2 per indicare la probabilita' per il drop dei pacchetti.  Con 'behavior aggregate' (BA) intendiamo un gruppo di pacchetti con lo stesso valore di DSCP in uno stesso flusso. Con PHB si intende il trattamento assegnato ad un BA. Ci sono quattro standard RFC per quattro tipi di PHB. DS0 vale sempre zero. Ci sono tre valori di preferenza, "low", "medium" e "high" rispettivamente associati a "01","10","11". Con "AFXY" indichiamo la classe X e il drop Y. Ad esempio AF21 e' la classe 2 e il drop low.
Il valore "5" Express Forwarding indica una priorita' particolare da utilizzare per creare una specie di circuito privato tra due punti, ad alta priorita'. Il valore DSCP e' 46. L'RFC-2597 definisce il PHB per le classi di tipo AF.

Il comando "ip precedence" e' considerato obsoleto e va invece usato "ip qos dscp".

I valori XXXXX0 sono predefiniti. I valori XXXX11 e XXXX01 sono utilizzabili localmente per configurazioni personalizzate.

 L'uso del DSCP puo' anche essere limitato ad un singolo router, se utilizzato per fare QoS insieme a LLQ e CAR. E' quest'ultimo utilizzo che interessa in questa argomentazione. Il comando "rate-limit" ha un parametro di "set-dscp-transit" che permette di cambiare il valore del campo nei pacchetti IP che, ad esempio, sono conformi o eccedono la banda configurata.

rate-limit output access-group 120 28000 21500 22000 conform-action set-dscp-transmit 10 exceed-action set-dscp-transmit 20

Figura 39 : rate-limit e dscp

Anche la configurazione del WRED permette di considerare il dscp con il comando "random-detect dscp"

informedicanew(config-cmap)#match ip dscp ?
<0-63> Differentiated services codepoint value
af11 Match packets with AF11 dscp (001010)
af12 Match packets with AF12 dscp (001100)
af13 Match packets with AF13 dscp (001110)
af21 Match packets with AF21 dscp (010010)
af22 Match packets with AF22 dscp (010100)
af23 Match packets with AF23 dscp (010110)
af31 Match packets with AF31 dscp (011010)
af32 Match packets with AF32 dscp (011100)
af33 Match packets with AF33 dscp (011110)
af41 Match packets with AF41 dscp (100010)
af42 Match packets with AF42 dscp (100100)
af43 Match packets with AF43 dscp (100110)
cs1 Match packets with CS1(precedence 1) dscp (001000)
cs2 Match packets with CS2(precedence 2) dscp (010000)
cs3 Match packets with CS3(precedence 3) dscp (011000)
cs4 Match packets with CS4(precedence 4) dscp (100000)
cs5 Match packets with CS5(precedence 5) dscp (101000)
cs6 Match packets with CS6(precedence 6) dscp (110000)
cs7 Match packets with CS7(precedence 7) dscp (111000)
default Match packets with default dscp (000000)
ef Match packets with EF dscp (101110)

Figura 40 : comando 'match ip dscp'

 Nell'esempio che segue vediamo una classificazione dei pacchetti in ingresso in una interfaccia Ethernet. In base alla classificazione otterranno delle priorita' differenti nell'interfaccia in uscita. In rosso sono indicati i comandi del classificatore. In blu i comandi dello shaper.

class-map match-any prioritavoip
  match ip dscp ef
!

class-map match-any voip-tag
  match access-group name etichetta

!
policy-map prioritavoip
class prioritavoip
  bandwidth 8500
class class-default
  fair-queue
  queue-limit 5
!
policy-map trafficovoip
class voip-tag
 set ip dscp ef
class class-default
 set ip dscp default

!
interface FastEthernet0/0
 no ip address
 service-policy output prioritavoip
!
interface FastEthernet0/0.7
 encapsulation dot1Q 7
 ip address 192.168.1.1 255.255.255.0
!
interface FastEthernet0/1
 description Hub to Office
 ip address 192.168.7.9 255.255.255.0
 service-policy input trafficovoip
!
ip access-list extended etichetta
permit ip host 192.168.7.19 host 192.168.1.19
!

Figura 41 : classificatore con DSCP

DSCP+POLICING + SHAPING

Tecnica QoS: Come usare il NAT e riconoscere i pacchetti voce che cambiano porte attraverso il nat

 Si flaggano con una policy prima del NAT e si controlla il flag dopo
 

Inside-to-OutsideOutside-to-Inside
  • If IPSec then check input access list
  • decryption - for CET (Cisco Encryption Technology) or IPSec
  • check input access list
  • check input rate limits
  • input accounting
  • policy routing
  • routing
  • redirect to web cache
  • NAT inside to outside
  • crypto (check map and mark for encryption)
  • check output access list
  • inspect (Context-based Access Control (CBAC))
  • TCP intercept
  • encryption
  • Queueing
  • If IPSec then check input access list
  • decryption - for CET or IPSec
  • check input access list
  • check input rate limits
  • input accounting
  • NAT outside to inside
  • policy routing
  • routing
  • redirect to web cache
  • crypto (check map and mark for encryption)
  • check output access list
  • inspect CBAC
  • TCP intercept
  • encryption
  • Queueing

Figura 42 : ordine di elaborazione pacchetti in ingresso e uscita

NAT Configuration and Output

 ? DA VERIFICARE ESATTEZZA
!-----------------------------------------------
! 1- Catturiamo tutto il traffico voce
!-----------------------------------------------
class-map match-any CATTURAVOCE
  match protocol rtp audio
!-----------------------------------------------
! 1a- Catturiamo tutto il traffico di segnalazione
!-----------------------------------------------
class-map match-any CATTURAVOCESEGNALAZIONE
  match protocol rtcp
!-----------------------------------------------
! 1b- Marchiamo il traffico in arrivo dalla LAN
!-----------------------------------------------
policy-map MARCADALAN
  class CATTURAVOCE
      set ip dscp ef
  class CATTURAVOCESEGNALAZIONE
      set ip dscp cs3
!-----------------------------------------------
! 1c- Marchiamo il traffico in arrivo dalla LAN
!-----------------------------------------------
interface Ethernet0
 ip address 192.168.10.1 255.255.255.0
 ip nat inside
 service-policy input MARCADALAN
 hold-queue 100 out
!-----------------------------------------------
! 2- Catturiamo tutto il traffico voce
!-----------------------------------------------
class-map match-any CATTURAVOCE
  match ip dscp ef
!-----------------------------------------------
! 2a- Catturiamo tutto il traffico di segnalazione
!-----------------------------------------------
class-map match-any CATTURAVOCESEGNALAZIONE
  match ip dscp cs3
!-----------------------------------------------
! 2b- Marchiamo il traffico in arrivo dalla LAN
!-----------------------------------------------
policy-map PRENDI_MARCATI
  class CATTURAVOCE
      match ip dscp ef
      priority 128
 
class CATTURAVOCESEGNALAZIONE
      match ip dscp cs3
      priority 64
!----------------------------------------------
! 2c- Marchiamo il traffico in arrivo dalla LAN
!----------------------------------------------
interface ATM0
 service-policy output PRENDI_MARCATI
 pvc 8/35
  encapsulation aal5mux ppp dialer
  dialer pool-member 1interface Dialer0
 bandwidth 400
 ip address negotiated
 ip nat outside
 encapsulation ppp
 dialer pool 1
 dialer-group 1
 ppp chap hostname a062901@sum.itesys.it
 ppp chap password 0 abc1004
!
access-list 102 permit udp host 16.0.0.4 host 15.0.0.5
access-list 103 permit udp host 16.0.0.4 host 13.0.0.5
ip cef
class-map match-all traffic-INTRA
 match access-group 102
class-map match-all traffic-INTER
 match access-group 103
class-map match-all traffic-dscp1
 match ip dscp 1
! 24 = 0 0 0 1   1  0 0 0   ds3=ds4=1 priorita' 4
class-map match-any traffic-prec3
 match ip dscp 24
 match ip dscp 25
 match ip dscp 26
 match ip dscp 27
policy-map ADSL-out
 class traffic-INTRA
  bandwidth percent 8
 class traffic-dscp1
  set ip dscp 5
 class traffic-prec3
  set ip precedence 2
 class traffic-INTER
  bandwidth percent 8
 class class-default
  fair-queue
!
interface ATM0/0
 no ip address
 no atm ilmi-keepalive
!
interface ATM0/0.1 point-to-point
 description COLLEGAMENTO
 mtu 576
 ip address 1.0.0.1 255.0.0.0
 pvc 99/99
  protocol ip 2.0.0.2 broadcast
  vbr-nrt 142 142 1
  encapsulation aal5snap
  service-policy out ADSL-out
!
dial-peer voice 201 voip
 destination-pattern 95434534
 session target ipv4:192.168.30.10
 ip qos dscp cs4 media             <-- cs indica la precedenza (qui precedenza 4) ovvero dscp 100000, per i pacchetti voce
 ip qos dscp cs5 signaling         <-- qui applica ai pacchetti di segnalazione 101000

Figura 43 : ATM+NAT+DSCP+QoS

Traffic shaping per interfaccia

 Con il comando "match input-interface" e' possibile classificare il traffico in base all'interfaccia di provenienza. Normalmente non e' possibile utilizzare le subinterfaces per il match. Segue un esempio di configurazione:

class-map match-any bob
   match input-interface FastEthernet2/0   

!
class-map match-any tom
   match input-interface FastEthernet2/1
!
policy-map mypolicy
    class bob
       bandwidth 40000
       queue-limit 20
    class tom
       bandwidth 80000
    class class-default
       fair-queue
!
interface ATM2/0.10 point-to-point
     ...    
     pvc 8/130
      service-policy output mypolicy
      vbr-nrt ...
!

Figura 44 : traffic-shaping e comando 'match input-interface'

 Nel caso si voglia fare una policy per subinterfaces, ad esempio se abbiamo diversi utenti collegati a diverse subinterface ethernet 802.1q, e' possibile fare delle policy in input sulle subinterfaces, marchiando il traffico col DSCP, e poi applicare la policy in uscita in base al valore DSCP del traffico (vedi anche il paragrafo sul DSCP).

Gruppi di classi

   E' possibile unire differenti class-map in gruppi. Disponibile dalla 12.1(5)T. Ecco un esempio:

class-map match-all udine
  description traffico da Udine
  match input-interface FastEthernet1/0
class-map match-all ftp1
  description traffico totale
  match class-map udine
  match class-map catania

Figura 45 : comando 'class-map match-all'

Match del traffico VoIP IAX

  In questo esempio intercettiamo tutto il traffico IAX in uscita in una interfaccia ATM. Si tratta di un trunk da due centrali telefoniche SIP basate su Asterisk:

interface ATM0/1/0.1 point-to-point
...
service-policy output VOIP
!
class-map match-all match-iax
match access-group 144
!
policy-map VOIP
    class match-iax
...
!
access-list 144 permit udp any eq 4569 any eq 4569

Figura 46 : traffico VoIP con protocollo IAX

Alcuni comandi utili per il monitoraggio:

Tecno48#show atm pvc interface atm0/1/0
VCD / Peak Avg/Min Burst
Interface Name      VPI    VCI   Type    Encaps   SC      Kbps    Kbps Cells Sts
0/1/0.1      1       8     35     PVC    SNAP    VBR      640     640    1    UP
 
Tecno48#show policy-map VOIP
Policy Map VOIP
Class match-iax
Strict Priority
Bandwidth 200 (kbps) Burst 5000 (Bytes)
...
 
Tecno48#show queue atm0/1/0.1
Interface ATM0/1/0.1 VC 8/35
Queueing strategy: weighted fair     <-- conseguenza del comando service-policy
Output queue: 0/512/70/0 (size/max total/threshold/drops)
Conversations 0/3/512 (active/max active/max total)
Reserved Conversations 1/1 (allocated/max allocated)
Available Bandwidth 24 kilobits/sec <--- il vbr e' a 640kbps-25%=480kbps
                                       meno quelli allocati nella policy


Tecno48#sh policy-map interface atm0/1/0.1
ATM0/1/0.1: VC 8/35 -

Service-policy output: VOIP

Class-map: match-iax (match-all)
129131 packets, 16731372 bytes
30 second offered rate 25000 bps, drop rate 0 bps  <--- una chiamata iax gsm
Match: access-group 144
Queueing
Strict Priority
Output Queue: Conversation 520
Bandwidth 200 (kbps) Burst 5000 (Bytes)
(pkts matched/bytes matched) 129131/16731372
(total drops/bytes drops) 0/0
...

Class-map: class-default (match-any)
59199 packets, 5202287 bytes
30 second offered rate 2000 bps, drop rate 0 bps
Match: any
Queueing
Flow Based Fair Queueing
Maximum Number of Hashed Queues 512
(total queued/total drops/no-buffer drops) 0/0/0

Figura 47 : comandi 'show policy-map', 'show queue', 'show atm'


CONFIGURAZIONE FINALE:
QOS IN INPUT/OUTPUT: FRAME-RELAY CON BANDA GARANTITA DI 1200/1300 KBPS. BLOCCO ANCHE DEL PEER-TO-PEER

  In questo esempio si configura la QoS sia in input che in output. Si noti in particolare la configurazione della policy in input. La rete garantisce un CIR di 1,2megabit. Ma in ingresso non si puo' dare priorita' ad un tipo di traffico piuttosto che ad un'altro come in uscita. Siamo costretti ad allocare 500kbps per il traffico in RTP a priori. Ovvero, in assenza di traffico RTP la banda restera' allocata. Pertanto per il traffico restante saranno sempre disponibili al massimo 700kbps. Infatti l'unico modo per evitare la congestione in ingresso e' il non raggiungimento del CIR. Se ci fosse un traffico Internet in ingresso di 1megabit e improvvisamente ci fosse un traffico RTP tale da superare il CIR, la rete scarterebbe delle frame voip a monte del nostro router. In un collegamento punto-punto il problema non si pone, infatti faremmo uno shaping in output da entrambi e capi del collegamento. Qui si presume che vi sia un collegamento di banda Internet verso un ISP.

Nota: fino alla data di stesura di questa nota, Dicembre 2009, non sembra proposta da Cisco alcuna soluzione al problema delle connessioni peer-to-peer criptate con protocolli basati su RC4 quali MSE/PE o PHE. Il supporto a parte dei nuovi client peer-to-peer della criptazione che offusca il traffico limita la capacita' di NBAR di individuare questo traffico. Al momento in cui scrivo la capacita' di NBAR di bloccare il peer-to-peer sembra alquanto limitata e sembrano necessari apparati di altri produttori come il NetEnforcer della Alliot. La Alliot per prima nell'Agosto del 2006 ha annunciato la possibilita' per i propri prodotti di fare il detect della criptazione dei prodotti.
I peer-to-peer non si possono bloccare senza layer 7 inspection (content inspection) in quanto usano porte variabili. Inoltre, se non trovano altra via, fanno tunneling attraverso la porta 80 o usano i proxy.

!
class-map match-all data
  match protocol http
  match protocol smtp
  match protocol ftp
  match protocol pop3
class-map match-any PEERTOPEER
  match protocol kazaa2
  match protocol edonkey
  match protocol gnutella
  match protocol bittorrent
  match protocol fasttrack
class-map match-any SIP
  match protocol sip
class-map match-any RTP
  match protocol rtp audio
!
!
policy-map VOIP
class RTP
  priority 500
class SIP
  priority 125
class data
  bandwidth 400
  random-detect
  random-detect exponential-weighting-constant 10
  random-detect precedence 0 20 40 10
class PEERTOPEER
  drop
class class-default
  fair-queue 512
  queue-limit 70
policy-map INPUT_VOIP
  class RTP
    police 500000      <-- in input e' possibile solo il policing
  class PEERTOPEER
    drop
class class-default
   police 700000
!
!
...
!
interface Serial0/0/0
  no ip address
  ip nat outside
  ip virtual-reassembly
  encapsulation frame-relay IETF
  load-interval 30
  no fair-queue
  frame-relay traffic-shaping
  frame-relay lmi-type cisco
!
interface Serial0/0/0.1 point-to-point
  description ---- HDSL ---
  ip address 192.119.211.62 255.255.255.252
  ip verify unicast reverse-path
  ip nat outside
  ip virtual-reassembly
  frame-relay interface-dlci 50 IETF
  class VOIP2
  crypto map SDM_CMAP_1
!
...
!
!
map-class frame-relay VOIP2
  frame-relay cir 1200000
  frame-relay bc 12000
  frame-relay be 0
  frame-relay mincir 1200000
  service-policy input INPUT_VOIP
  service-policy output VOIP

Figura 48 : configurazione di esempio di QoS su frame-relay

 Custom Queueing (legacy)

   Il Custom Queue e' un meccanismo di gestione di quality of service basato su una gestione round robin di un insieme di code. E' possibile creare fino a 17 code d'uscita per interfaccia. La coda numero zero e' riservata dal sistema per la gestione di pacchetti ad alta priorita' quali ad esempio di segnalazione o keepalive.

  Le code vengono servite a rotazione. Ogni coda pero' viene servita in modo differente. Le code a priorita' maggiore avranno un maggior numero di pacchetti mandati in uscita sull'interfaccia associata. Pertanto da ogni coda si preleverenno un numero differente di pacchetti. Questo consente di suddividere la banda disponibile tra le diverse code in modo predefinito. Piu' precisamente ad ogni coda sara' associata una percentuale della larghezza di banda disponibile. Da questo dato sara' possibile risalire all'esatto valore di banda, che dipende dalla banda garantita dalla rete associata alle interfacce del router.

  La configurazione consiste nel creare le code, con il comando "queue-list" e poi associarle alle interfacce, con il comando "custom-queue-list":

interface serial 0
  custom-queue-list 1

Figura 49 :custom queueing - esempio di configurazione

  Consideriamo il caso in cui configuriamo tre code da associare rispettivamente al traffico telnet, al dns e al traffico rimanente. Configuriamo un prelievo di 1500 byte da una coda e 3000 byte dalle altre. Cio' determina come conseguenza una suddivisione della banda disponibile con percentuali del 20%, 30%, 30%

queue-list 1 protocol ip 2 tcp 23

pacchetti telnet alla coda 2

queue-list 1 protocol ip 3 udp 53 

dns alla coda 3

queue-list 1 queue 2 byte-count 1500

1500 e' il valore di default cosi' questa riga non appare nello "show run". 20% traffico

queue-list 1 queue 3 byte-count 3000

40% del traffico

queue-list 1 default 4

tutti gli altri coda 2

queue-list 1 queue 4 byte-count 3000

 

Figura 50: comandi per la configurazione del custom queueing

 Il motivo per cui con un byte-count di 1500 abbiamo un 20% di traffico riservato e' che il totale di byte-count dell'esempio e' 1500+3000+3000=7500 e il 20% di 7500 risulta 1500.

  In questo secondo esempio vogliamo garantire banda al traffico identificato dall'access-list 111 lasciando il restante alla coda di default:

queue-list 1 protocol ip 5 list 111
queue-list 1 queue 3 byte-count 3000
queue-list 1 default 3

Figura 51: comandi per la configurazione del custom queueing

 In assenza di congestione se una coda richiede piu' banda di quella assegnata potra' disporne. Questa e' una conseguenza dell'algoritmo round-robin che salta le code vuote.

  Potete notare che non e' possibile applicare il custom-queuing in alcuni tipi d'interfacce. Ad esempio se abbiamo un collegamento ADSL con ATM e proviamo ad applicare custom-queuing in ATM o dialer (se presente) potrebbe non essere possibile.

Con il comando "show interfaces" e' possibile vedere la gestione del queueing sulle interfacce:

FastEthernet0/1 is up, line protocol is up
Hardware is Gt96k FE, address is 0013.c4a4.4fe5 (bia 0013.c4a4.4fe5)
Internet address is 192.168.15.110/24
MTU 1500 bytes, BW 100000 Kbit, DLY 100 usec,
reliability 255/255, txload 2/255, rxload 1/255
Encapsulation ARPA, loopback not set
Keepalive set (10 sec)
Full-duplex, 100Mb/s, 100BaseTX/FX
ARP type: ARPA, ARP Timeout 04:00:00
Last input 00:00:00, output 00:00:00, output hang never
Last clearing of "show interface" counters 00:07:04
Input queue: 5/75/0/0 (size/max/drops/flushes); Total output drops: 0
Queueing strategy: custom-list 1
Output queues: (queue #: size/max/drops)
0: 0/20/0 1: 0/20/0 2: 0/20/0 3: 0/20/0 4: 0/20/0
5: 0/20/0 6: 0/20/0 7: 0/20/0 8: 0/20/0 9: 0/20/0
10: 0/20/0 11: 0/20/0 12: 0/20/0 13: 0/20/0 14: 0/20/0
15: 0/20/0 16: 0/20/0

1 minute input rate 305000 bits/sec, 99 packets/sec
1 minute output rate 793000 bits/sec, 108 packets/sec
57504 packets input, 32415206 bytes
Received 21 broadcasts, 0 runts, 0 giants, 0 throttles
0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
0 watchdog
0 input packets with dribble condition detected
56332 packets output, 48085601 bytes, 0 underruns
0 output errors, 0 collisions, 0 interface resets
0 babbles, 0 late collision, 0 deferred
0 lost carrier, 0 no carrier
0 output buffer failures, 0 output buffers swapped

Figura 52: custom queueing e comando 'show interfaces'

Con il comando "show queueing custom" e' possile vedere la configurazione dettagliata delle code:

ITESYS-1800#show queueing custom
Current custom queue configuration:

List Queue Args
1     3       default
1     5       protocol ip list 111
1     3       byte-count 3000

Figura 53: comando 'show queueing custom'

  Approfondimenti La banda che viene associata ad una coda e' data dalla seguente formula: (BYTEsullaCODA/BYTEsututteleCODE) * BANDAdellINTERFACCIA - Se il "byte count" e' superato ma un pacchetto e' in trasmissione questo verra' inviato per intero. Pertanto, specialmente con configurazioni di "byte count" piccole in relazione alla dimensione dei pacchetti in transito, dipendenti dal tipo di servizio utilizzato, la suddivisione di banda potrebbe essere anche molto differente rispetto quella preventivata

- La "window size" del protocollo TCP puo' alterare la distribuzione della banda. Infatti la sorgente non invia nuovi pacchetti finche' non riceve un acknowledge. Pertanto se il "byte count" e' inferiore alla dimensione della finestra puo' accadere che, al secondo giro, si trovino in coda meno pacchetti di quelli che si potrebbero inviare, in quanto la sorgente non ne ha inviati di nuovi non avendo ancora ricevuto l'acknowledge. Il byte-count di default e' 1500byte, che e' un buon compromesso. Appendice: ATMIl PCR (Pesk Cell Rate) e' la massima quantita' di celle che si possono trasmettere. Una cella ATM e' 53 byte (424 bit).


L'SCR (Sustained Cell Rate) indica il massimo valore medio al quale si possono inviare le celle. L'SCR e' minore del PCR MBS (Maximum Burst Size) e' il massimo numero di celle che possono essere inviate al PCR. Quando si raggiunge il MBS il traffico scende al di sotto dell'SCR finche' il tasso medio di invio delle celle raggiunge l'SCR. Sostanzialmente alla velocita' PCR si possono mandare al piu' MBS celle.

 

Troubleshooting

In alcune versioni di IOS non si puo' applicare direttamente una policy in una subinterface. Ve ne accorgete perche' quando ci provate vi appare il messaggio di errore: "CBWFQ : Not supported on subinterfaces". In tali casi dovete usare una policy parent, come in figura:

! class-map match-any SIP 
description --- match con la segnalazione ---
match access-group name SIP-LIST
class-map match-any RTP
description --- match con il traffico voce RTP --
match access-group 151
!
!
policy-map VOIP
description --- questa va bene se non si usa il nat ---
class SIP
priority 64
class RTP
priority 512
!
policy-map parent
  class class-default
  shape average 1400000
  service-policy VOIP

!
...
!
map-class frame-relay VOIP2
...
service-policy output parent
...

Figura 54: errore 'CBWFQ : Not supported on subinterfaces'

2. Come verificare la velocita' del proprio ADSL

cisco#show dsl interface atm 0
ATM0
Alcatel 20190 chipset information
ATU-R (DS) ATU-C (US)
Modem Status: Showtime (DMTDSL_SHOWTIME)
DSL Mode: ITU G.992.1 (G.DMT) Annex A
ITU STD NUM: 0x01 0x1
Vendor ID: 'STMI' 'GSPN'
Vendor Specific: 0x0000 0x0008
Vendor Country: 0x0F 0xFF
Chip ID: C196 (0)
DFE BOM: DFE3.0 Annex A (1)
Capacity Used: 45% 100%
Noise Margin: 27.0 dB 7.0 dB
Output Power: 18.5 dBm 12.0 dBm
Attenuation: 25.0 dB 15.0 dB
Defect Status: None None
Last Fail Code: None
Watchdog Counter: 0x8A
Watchdog Resets: 0
Selftest Result: 0x00
Subfunction: 0x00
Interrupts: 20646 (0 spurious)
PHY Access Err: 0
Activations: 4
LED Status: ON
LED On Time: 100
LED Off Time: 100
Init FW: init_AMR-3.0.014_no_bist.bin
Operation FW: AMR-3.0.014.bin
FW Source: embedded
FW Version: 3.0.14

                 Interleave   Fast Interleave    Fast
Speed (kbps):      4096          0     832         0       <--- ecco la configurazione del DSLAM
Cells:             612278308     0     355083463   0
Reed-Solomon EC:     24          0     2749        0
CRC Errors:           0          0     22          0
Header Errors:        0          0     10          0
Total BER: 0E-0 0E-0
Leakage Average BER: 0E-0 0E-0
ATU-R (DS) ATU-C (US)
Bitswap: enabled enabled
Bitswap success: 0 0
Bitswap failure: 0 0

LOM Monitoring : Disabled
...snip...

DSL: Training log buffer capability is not enabled
 

Figura 55: comando 'show queueing custom'

router# show controller atm
...snip...
VC QoS Summary
--------------
Active          Configured           Scheduled
Connections
VCD VPI VCI   COS  PCR SCR/MCR      COS   PCR   SCR/MCR
--- -------- ----- --- ------       ----  ---  --------
1    8   35   UBR   0   n/a         UBR   832   n/a

...snip...

Figura 56: comando 'show queueing custom'

 

Copyright 2005-2010 Gianrico Fichera

Nessuna parte di questa pubblicazione puo' essere riprodotta o trasmessa, in qualsiasi forma o con qualsiasi mezzo, elettronico, meccanico, fotocopie, registrazione, senza il consenso dell'autore.Il materiale di questa pagina non e’ sponsorizzato o sottoscritto da Cisco Systems, Inc. Ciscoâ e’ un trademark di Cisco Systems, Inc. negli Stati Uniti e in altri stati. L’autore di questa pagina non si assume nessuna responsabilita’ e non da nessuna garanzia riguardante l’accuratezza  e  la completezza delle informazioni presenti nonche’ da conseguenze sull’uso delle informazioni presenti in questa pagina.
Il sito web ufficiale della Cisco e’ http://www.cisco.com. Nel caso si volesse utilizzare il contenuto di questa pagina nella forma in cui e’ presentato rivolgersi all’autore scrivendo a gianrico.fichera itesys.it.

This material is not sponsored by, endorsed by, or affiliated with Cisco Systems, Inc., Cisco, Cisco Systems, and the Cisco Systems logo are trademarks or registered trade marks of Cisco Systems, Inc. or its affiliates. All other trademarks are trademarks of their respective owners.