Avanti Indietro Indice

5. TC (traffic control)

Rispetto allo shaping realizzato con il modulo shaper.o il nuovo codice presente nei kernel 2.1, 2.2, 2.3 e 2.4 prevede nuove possibilità e un maggior controllo. E' sempre possibile stabilire la velocità di trasmissione dei dati in uscita da una interfaccia, però è anche possibile finalmente stabilire delle priorità tra i pacchetti, suddividere i pacchetti in base alla destinazione, al tipo, ai bit TOS (Type Of Service) su diverse bande con larghezza e priorità diverse.

Per implementare tutte queste nuove caratteristiche è stato necessario introdurre i seguenti elementi:

disciplina della coda

Le discipline delle code (qdisc) sono l'elemento fondamentale, ogni pacchetto proveniente da un'interfaccia viene accodato e in base alla qdisc prescelta sarà poi prelevato e inviato nella rete dall'interfaccia di output. Esistono diverse discipline delle code, quella di default è la FIFO (First IN, First OUT): il primo pacchetto arrivato e anche il primo ad uscire (best-effort). Questa disciplina è molto semplice, ne esistono comunque altre più complesse (RED, TBF, CBQ). Alcune come la CBQ consentono di creare delle classi ciascuna con proprie caratteristiche e funzionalità, altre come la SFQ sono in grado di offrire buone prestazioni in termini di consumo di memoria e CPU, ...

classi

Le classi permettono di definire delle "sotto-bande" e di stabilirne la bandwidth (es. 500KB), la priorità oltre ad altri parametri. Inoltre ogni classe può essere ulteriormente suddivisa in sotto-classi ognuna avente le proprie caratteristiche. Ad ogni classe in genere si associa infine una coda, che come già visto si occuperà di stabilire quali pacchetti inviare per prima, in quale ordine, quali eventualmente scartare. Se non si provvede a specificarla sarà utilizzata quella di default ossia FIFO.

filtri

I filtri detti anche classificatori sono utilizzati per "smistare" i pacchetti e indirizzarli verso le classi corrispondenti. Lo "smistamento" può avvenire per indirizzo sorgente o destinazione, in base ad uno dei campi del pacchetto (es. porta destinazione www, ftp-data, ...), in base a come il filtro dei pacchetti (firewall) lo ha marcato oppure in base alla tabella degli instradamenti.

policing

In situazioni di traffico eccessivo, congestione per evitare che certi limiti siano superati è necessario prendere delle decisioni, ad esempio scartare (DROP) alcuni pacchetti in modo selettivo o arbitrario, ciò per impedire il degrado delle prestazioni.

Attraverso queste componenti è possibile quindi implementare il QoS.

Ecco un esempio semplificato del percorso effettuato da un pacchetto nel caso si utilizzi una qdisc CBQ:

     ..                                                           ..
     ..                 +-------+                                 ..
     ||                >|TCP/UDP|>                                ||
     ||               / +-------+ \                               ||
     ||              /             \              +------+        ||
o -->ETH1 ---> Demultiplexing ---> FORWARDING --->|  TC  | ---> ETH0 --> o
     ||                                           +------+        ||
     ||                                           ^^^^^^^^        ||
     ||                                          /        \       ||
     +------------------------------------------/-------- -\-------+
                                               /            \
                ------------------------------/              \--------------
               /                                                            \
             +----------------------------- TC -------------------------------+
             |+-------------------------- QDISC ----------------------------+||
             ||                                                              ||
             ||                         +--------- CLASSE A -------+         ||
             ||        ------------     |    +--------------+      |         ||
Pacchetto o ->|-->+--> | Filtro A | --> = -> |o|o| Coda | | | ---> = ---+    ||
             ||   |    ------------     |    +--------------+      |    |    ||
             ||   |                     +--------------------------+    |    ||
             ||   |                                                     +--> = ---> o
             ||   |                     +--------- CLASSE B -------+    |    ||
             ||   |     ----------      |    +--------------+      |    |    ||
             ||   +--> | Filtro B | --> = -> |o| | Coda | | | ---> = ---+    ||
             ||        -----------      |    +--------------+      |         ||
             ||                         +--------------------------+         ||
             ||                                                              ||
             |+--------------------------------------------------------------+|
             +----------------------------------------------------------------+

In questo caso il pacchetto proveniente dalla rete entra attraverso l'interfaccia ETH1, quindi prosegue e viene sottoposto eventualmente a modifiche o controlli (es. filtraggio) quindi prima di essere inoltrato nella rete esterna attraverso l'interfaccia ETH0 è sottoposto al controllo del traffico. Il pacchetto in questa fase è passato ai filtri che stabiliscono a quale classe appartiene ed è quindi accodato nella coda corrispondente che deciderà infine quando, come e se inviarlo.

Vediamo un esempio più realistico:


              +---------------------------- QDISC ---------------------------+
              |                                                              |
              |                         +--------- CLASSE A -------+         |
              |        ------------     |    +----------------+    |         |
Pacchetto --> |-->+--> |Filtro WWW| --> = -> | TBF, rate=5Mbps|--> = ---+    |
              |   |    ------------     |    +----------------+    |    |    |
              |   |                     +--------------------------+    |    |
              |   |                                                     |    |
              |   |                     +--------- CLASSE B -------+    |    |
              |   |     ------------    |    +----------------+    |    |    |
              |   +--> |Filtro MAIL| -->= -> | FIFO,rate=2Mbps|--> = ---+----= -->
              |   |    -------------    |    +----------------+    |    |    |
              |   |                     +--------------------------+    |    |
              |   |                                                     |    |
              |   |                     +--------- CLASSE C -------+    |    |
              |   |     ------------    |    +----------------+    |    |    |
              |   +--> |  Default  | -->= -> | FIFO,rate=3Mbps|--> = ---+    |
              |        -------------    |    +----------------+    |         |
              |                         +--------------------------+         |
              +--------------------------------------------------------------+

In questo caso sono state create tre classi ognuna con una propria bandwidth (5, 2 e 3 Mbps) e qdisc (TBF, FIFO), i pacchetti sono poi suddivisi all'arrivo dai filtri. I pacchetti destinati alla porta www sono quindi accodati nella coda corrispondente alla classe A, i pacchetti destinati alla porta smtp (mail) alla classe B e infine tutti gli altri pacchetti (telnet, ftp, dns, ...) sono collocati nella coda della classe C.

In molti casi per rappresentare graficamente l'organizzazione delle classi si utilizza un grafo ad albero:

                                        ______
                                       /      \
                                      | QDISC  |
                                       \______/
                                        /    \                                     
                                       /      \
                                      /        \
                                ______          ______
                               /      \        /      \
                              |CLASSE A|      |CLASSE B|
                               \______/        \______/

E' necessario sottolineare che è possibile controllare solo il traffico in uscita ossia inviato, spedito da un'interfaccia. Il traffico in arrivo ad esempio il download di un file via ftp, supponiamo da Internet, non è controllabile. La velocità di trasferimento dei dati in questo caso dipende dal tipo di connessione (ISDN, ADSL), dal server, ...

Eventualmente è possibile comunque limitare il flusso dei pacchetti in arrivo in modo che siano rispettati certi limiti.

Inoltre si può utilizzare il controllo del traffico anche su più interfacce, nell'esempio seguente si utilizza un computer (PC0) con tre interfacce ethernet, su cui si imposta il controllo del traffico sulle interfacce eth2 ed eth1 per quanto riguarda il traffico diretto rispettivamente alla LAN e alla rete dei server.

                    eth2 con TC 
       +----+       |
       |PC1 |----+  |         eth0 
       +----+    |  |        /
       +----+    |   \+----+/
       |MAC2|----+----|PC0 |--O----------> INTERNET
       +----+    |    +----+
                 |    / |
                 .   /  |  +---+
                  eth1  +--|WWW|
                con TC  |  +---+
                        |  +---+
                        +--|FTP|
                        |  +---+
                        .

    [RETE LAN]      [RETE SERVER]

Una volta stabilite le qdisc e i filtri è possibile impostare uno script che attraverso il programma tc realizzi ciò che si desidera.

Per poter creare e gestire il traffico è necessario compilare il kernel selezionando le voci corrispondenti al QoS e installare il pacchetto iproute2 che contiene il programma tc (traffic controller) da utilizzare per le impostazioni.


Avanti Indietro Indice