Ecco qui un altro bel libro di
Christian Benvenuti, che ci permetterà di avere qualcosa da leggere per parecchio tempo! Il testo è in inglese e parla del sistema open source del Pinguino, e ancora una volta è la casa editrice
O'Reilly a pubblicare un'opera che, con più di mille pagine, ci permette di trovare risposta a molte domande, probabilmente anche a quelle che non ci siamo mai posto.
L'argomento principale è la
gestione del networking all'interno del
kernel di Linux, identificandone i punti chiave e i sottosistemi di cui è composto. L'edizione di cui parliamo, è la prima, ma promette già molto bene, e soprattutto copre anche le nuove versioni del
kernel appartenenti alla
serie 2.6, che rivoluziona in maniera sensibile molti degli aspetti classici del codice di rete.
Come ogni buon libro
O'Reilly che si rispetti, vengono trattate in maniera esaustiva e completa tutte le interazioni che avvengono all'interno del
kernel, e quindi vengono alternate fasi di
descrizione teorica del funzionamento di una rete a
stralci di codice, presi direttamente dai sorgenti di Linux. Vista l'importanza notevole che il codice di networking all'interno del
kernel Linux ha acquisito nel tempo, questo libro è stato pensato per trattare in maniera completa argomenti che fino ad ora comparivano solo in maniera marginale all'interno degli altri due voluminosi libri dello stesso filone, ovvero “
Understanding The Linux Kernel” e “
Linux Device Drivers”.
Quando si parla di networking, almeno in questo libro, non ci si limita ad un particolare livello della ben nota pila ISO/OSI, ma si passa dalla gestione e riconoscimento di un device hardware al momento dell'inizializzazione del driver, fino ad arrivare alla gestione dell'invio e della ricezione dei dati al livello di rete. Non aspettatevi, però, una descrizione dei livelli di trasporto o applicativi, per questo vi toccherà mettervi di buon impegno e aprire il file relativo, come spesso consiglia l'autore quale metodo di apprendimento più efficace.
Il libro si compone, prima che in capitoli, in parti: ogni parte presenta un sottosistema del codice di rete, dividendo gli argomenti in base all'aspetto del quale si occupano. La
parte I è un'introduzione al libro ed agli argomenti trattati, in modo da far avvicinare il lettore alla struttura del
kernel Linux, mentre nella
parte II si approfondisce la struttura del
kernel, scendendo nel dettaglio delle funzioni e dei meccanismi propri dell'argomento oggetto del libro, spiegando quali sono le operazioni che vengono compiute ogni qualvolta un nuovo dispositivo di rete deve essere rilevato e configurato dal sistema.
Con la
parte III si arriva a parlare dell'invio e della ricezione dei pacchetti tramite l'interazione con le schede di rete, sviluppando anche tutti gli argomenti correlati alla parte puramente dedicata al codice, che decide come questi pacchetti vengono trattati, individuando i meccanismi che sono necessari per poter svolgere le operazioni in maniera corretta e facendole convivere con il resto lavoro che il
kernel deve compiere in un sistema reale.
La
parte IV è dedicata esclusivamente al
bridging: argomento molto importante e complesso, è stato favorito rispetto a tutti gli altri dispositivi virtuali, probabilmente per la sua recente forte affermazione in campi molto interessanti ed in espansione come quelli dei dispositivi
embedded.
Le ultime tre parti trattano invece temi classici del networking, approfondendo come le reti siano implementate nel
kernel Linux e di quali siano le possibilità, che vengono offerte all'utente in fatto di configurabilità e personalizzazione: parliamo della
parte V del testo, relativa alla gestione del protocollo IPv4, della
parte VI – dedicata all’ARP e a tutte le relazioni di buon vicinato relative alle reti locali - ed infine la
parte VII, che si occupa di tutto ciò che concerne il routing, scendendo nei particolari che illustrano le caratteristiche avanzate di Linux e che lo identificano come un ottimo pretendente nel caso si debba optare per una soluzione open source a problematiche anche complesse di rete. A questo proposito, ritengo che il testo regali ottimi suggerimenti per capire dove finiscono i pacchetti quando non riusciamo più a trovarli.
La relativa brevità dei singoli capitoli contenuti in ognuna di queste parti riesce a presentare in maniera più chiara gli argomenti, e a snellire la lettura per chi, giustamente, la troverà un po' complessa: insomma, se uno non ce la fa più, può sempre arrivare facilmente alla fine del capitolo e riprendere in un altro momente, senza il rischio di tirare avanti altre due ore.
Una delle cose che sicuramente si fa più apprezzare nelle scelte che l'autore ha fatto per decidere quali argomenti trattare nel testo - e nonostante le oltre mille pagine, ci sono argomenti notevoli, che sono solamente trattati superficialmente se non addirittura saltati in maniera totale - è l'inserimento di aspetti che non riguardano il semplice networking di una macchina utilizzata in posizione periferica nella rete, ma anche di tutti i motivi che promuovo Linux uno dei sistemi più adatti a compiere il lavoro di un router di fascia alta, e che gli permettono di competere con colossi come Cisco, almeno come funzionalità presenti, giacché far girare Linux su un i386 non può essere lo stesso che utilizzare un router Cisco con hardware appositamente studiato ed ottimizzato per quel compito, ma bisogna pur tuttavia, considerare anche il prezzo.
Ad ogni modo, come già anticipato, per la
legge del contrappasso, a fronte di una grande qualità degli argomenti trattati, troviamo anche degli argomenti totalmente esclusi dal testo. Per evitare sgradite sorprese ai lettori, che decidono di fare questo investimento per poi scoprire nella prefazione all'opera che la loro tanto cercata funzione non viene neppure sfiorata, anticipo che manca la trattazione di IPv6, IPSec, IP Multicast, livello di trasporto (TCP, UDP, ecc.),
traffic control (
shaping),
netfilter, file system di rete, device virtuali (tranne il bridge), protocolli di livello 3 diversi da IP e ARP, virtual server, SNMP e il
frame diverter.
Per i più smanettoni, questo libro fornirà le risposte a tutte le domande che vi siete sempre fatti sui device di rete, spiegandovi in tutti i dettagli come viene fatta la scelta del routing per un determinato pacchetto, come vengono gestite le interfacce virtuali create da sottosistemi come il bridging, oltre a tutte quelle cose che io personalmente non riesco a far entrare tra le mie preferite - pur comprendendone l'importanza - come gli
interrupt e i
lock. E se vi sentite particolarmente stimolati, state attenti perchè questa lettura vi fornisce anche dettagli su tutti i passi necessari per creare una vostra personale implementazione degli aspetti che vi interessano, anche se in maniera non esaustiva, ma pur sempre uno scheletro su quali siano i passi da seguire e quali strumenti mette a vostra disposizione il
kernel per facilitarvi il lavoro.
Lo sapevate, ad esempio, che tutte le componenti del
kernel, che siano coinvolte in alcuni eventi di sistema, possono sfruttare la presenza delle
notification chains? Queste catene non sono altro che delle liste, alle quali i vari sottosistemi si registrano nel momento in cui ritengono di essere interessati ad un particolare evento, come l'attivazione di una interfaccia di rete: nel momento in cui il codice, che gestisce l'attivazione, riscontra l'evento, si fa carico di andare a vedere chi si era precedentemente registrato e di segnalarlo, in modo da consentire al sistema di agire di conseguenza. Tra le numerose
notification chains presenti nel
kernel quelle interessanti per il networking sono principalmente due: la
inetaddr_chain, che segnala quando viene impostato un indirizzo locale ad una delle interfacce di rete presenti (esiste anche l'equivalente
inet6addr_chain per gli indirizzi IPv6), e la
netdev_chain, utilizzata invece dal
kernel per l'inserimento e la rimozione delle interfacce, sia fisiche che virtuali.
Insomma, se avete letto “
TCP/IP Illustrated” e vi siete chiesti come sia una
moderna implementazione di uno stack di rete, non avete che da prendere al volo questa occasione, e – aggiungerei - disdire gli altri impegni per i prossimi due mesi.