...

A Francesco che in fondo non ha mai smesso di credere in me

by user

on
Category: Documents
72

views

Report

Comments

Transcript

A Francesco che in fondo non ha mai smesso di credere in me
A Francesco
che in fondo non ha mai smesso di credere in me
Introduzione
Attualmente il panorama delle comunicazioni e’ in continua evoluzione.
La presenza di reti wireless e’ in aumento sul territorio e la tecnologia VoIP
vede sempre piu’ applicazioni sia dal punto di vista lavorativo che personale.
La possibilita’ di un utilizzo combinato di queste due tecnologie e’ resa
complicata dalla presenza di due fattori concorrenti. L’elevata perdita di
pacchetti insita nelle reti Wi-Fi1 e l’utilizzo di un protocollo inaffidabile2
come UDP3 da parte del VoIP.
Il nostro scenario ipotetico vede un dispositivo mobile come un PDA
(Personal Digital Assistant, computer palmare) connesso ad un Access Point
wireless fisso, e la possibilita’ di spostamento nello spazio senza perdita di
connettivita’ a patto di copertura del percorso.
Questa comunicazione avviene attraveso lo scambio di informazioni. Il dispositivo mobile invia all’AP i dati di interesse, e a sua volta l’AP comunica
l’avvenuta ricezione (Acknowledgement).
Il problema nasce dal fatto che il device wireless utilizzato per la trasmissione non comunica all’applicazione l’avvenuta ricezione degli acknowledgement.
Il nostro studio si pone come obiettivo la valutazione della possibilita’ di
riportare in userspace le informazioni sulla avvenuta ricezione da parte del
1
Wi-Fi, abbreviazione di Wireless Fidelity. Termine che indica dispositivi che possono
collegarsi a reti locali senza fili (WLAN) basate sulle specifiche IEEE 802.11
2
Un protocollo per la trasmissione di dati si dice inaffidabile se non gestisce il
riordinamento dei pacchetti ne’ la ritrasmissione di quelli persi.
3
User Datagram Protocol (UDP) e’ uno dei principali protocolli utilizzati in Internet.
i
ii
INTRODUZIONE
prime hop (Access Point nel nostro caso) di un frame 802.11 per garantire
un controllo di flusso. Questo avverra’ grazie alla gestione interattiva dello
stream di dati UDP mediante un meccanismo cross-layer che raccolga ed
elabori le informazioni necessarie.
Questa tesi e’ stata sviluppata in coppia con Giulio Grassi, collega laureando in Informatica. Data la complessita’ dell’argomento, le modifiche allo
stack di rete presente nel kernel di linux sono state apportate utilizzando
una sorta di extreme programming4 . Per quanto riguarda i dettagli relativi
all’interazione tra stack di rete e driver, le modifiche sono state seguite dalla
sottoscritta. La parte riguardante l’interazione con le applicazioni e’ stata
seguita dal collega Giulio Grassi.
Di seguito una panoramica del documento.
Primo capitolo : viene fatta una panoramica della realta’ in cui si agisce,
soffermandosi sulla tecnologia wireless, sui vari protocolli di comunicazione che costituiscono la gerarchia ISO OSI e sui tipi di crittografia
piu’ comuni al momento, WEP e WPA.
Secondo capitolo : si trova un’esposizione dei nostri obiettivi e le possibili
strade per la risoluzione dei problemi riscontrati, vi e’ inoltre un’analisi
dei dispositivi utilizzati per fare prove empiriche e test.
Terzo capitolo : e’ presente la trattazione dei problemi riscontrati ben
dettagliati e delle modifiche da attuare.
Quarto capitolo : si ha la spiegazione in dettaglio del meccanismo realizzato.
Quinto capitolo : vengono portati a sostegno del nostro lavoro una serie
di test effetuati per valutare meglio il meccanismo realizzato indicando
inoltre i limiti.
4
L’Extreme Programming e’ una metodologia agile e un approccio all’ingegneria del
software. Tra gli aspetti caratteristici vi sono la programmazione a piu’ mani e la verifica
continua del programma durante lo sviluppo per mezzo di programmi di test.
INTRODUZIONE
Sesto capitolo : si trovano una serie di possibili sviluppi futuri.
iii
Indice
Introduzione
i
1 Scenario
1
1.1
Contesto della ricerca . . . . . . . . . . . . . . . . . . . . . . .
2
1.2
Tecnologia Wireless 802.11 . . . . . . . . . . . . . . . . . . . .
4
1.3
Dispositivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
1.3.1
Access Point . . . . . . . . . . . . . . . . . . . . . . . .
6
1.3.2
Schede di rete wireless . . . . . . . . . . . . . . . . . .
7
1.4
1.5
Layer e protocolli . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4.1
Stack di rete . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4.2
Livello Data Link (livello 2 del modello OSI) . . . . . . 11
1.4.3
Livello Network (livello 3 del modello OSI) . . . . . . . 15
1.4.4
Livello Trasporto (livello 4 del modello OSI) . . . . . . 19
1.4.5
Livello Applicazione (livello 7 del modello OSI) . . . . 21
Crittografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.5.1
WEP - Wired Equivalent Privacy . . . . . . . . . . . . 27
1.5.2
WPA e WPA2 - WiFi Protected Access . . . . . . . . . 29
2 Obiettivi e sperimentazione
2.1
2.2
31
Obiettivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.1.1
Ack dal prime hop e interattivita’ . . . . . . . . . . . . 31
2.1.2
Crittografia . . . . . . . . . . . . . . . . . . . . . . . . 33
Sperimentazione . . . . . . . . . . . . . . . . . . . . . . . . . . 34
v
vi
INDICE
3 Parte tecnica
3.1
Intel PRO/Wireless 3945ABG . . . . . . . . . . . . . . . . . . 39
3.1.1
3.2
Analisi driver iwl3945 . . . . . . . . . . . . . . . . . . . 39
Internet Protocol . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.2.1
UDP over IPv6 . . . . . . . . . . . . . . . . . . . . . . 53
3.2.2
UDP over IPv4 . . . . . . . . . . . . . . . . . . . . . . 54
4 Realizzazione-Implementazione
4.1
55
Funzionamento dell’applicazione . . . . . . . . . . . . . . . . . 55
4.1.1
Spiegazione generale . . . . . . . . . . . . . . . . . . . 55
4.1.2
Approfondimento: lato trasmissione . . . . . . . . . . . 56
4.1.3
Approfondimento: lato ricezione . . . . . . . . . . . . . 61
4.1.4
Utilizzo applicazione . . . . . . . . . . . . . . . . . . . 63
5 Valutazione
5.1
37
67
Metriche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.1.1
Parametri . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.2
Scenario sperimentale . . . . . . . . . . . . . . . . . . . . . . . 68
5.3
Prove e risultati . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.3.1
5.4
Esecuzione test . . . . . . . . . . . . . . . . . . . . . . 69
Discussione risultati . . . . . . . . . . . . . . . . . . . . . . . . 76
5.4.1
Prove . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.4.2
Affidabilita’ . . . . . . . . . . . . . . . . . . . . . . . . 77
5.4.3
Ritardi . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
6 Sviluppi Futuri
81
6.1
IPv6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
6.2
DCCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
6.3
Monitor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
6.4
IEEE 802.11r . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
6.5
Kernel Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7 Conclusioni
85
Elenco delle figure
1.1
Hot Spot Fon a Bologna (maps.fon.com) . . . . . . . . . . . .
2
1.2
Meccanismo di interazione . . . . . . . . . . . . . . . . . . . .
3
1.3
Nodo nascosto . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4
Frame 802.11 . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5
Struttura ACK Frame . . . . . . . . . . . . . . . . . . . . . . 15
1.6
Header del pacchetto IP . . . . . . . . . . . . . . . . . . . . . 17
1.7
Header del pacchetto UDP . . . . . . . . . . . . . . . . . . . . 21
2.1
Modifiche cross-layer . . . . . . . . . . . . . . . . . . . . . . . 33
3.1
Panoramica meccanismo cross-layer . . . . . . . . . . . . . . . 38
3.2
Struttura IPv6 Header . . . . . . . . . . . . . . . . . . . . . . 53
5.1
Riassunto Generale . . . . . . . . . . . . . . . . . . . . . . . . 74
5.2
WEP multisessione . . . . . . . . . . . . . . . . . . . . . . . . 75
5.3
WPA multisessione . . . . . . . . . . . . . . . . . . . . . . . . 75
5.4
Andamento ritardi singola prova . . . . . . . . . . . . . . . . . 76
vii
Elenco delle tabelle
1.1
Codice protocolli Transport Level . . . . . . . . . . . . . . . . 18
3.1
Comandi iwl . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.1
Ritardi medi risposte applicazione . . . . . . . . . . . . . . . . 73
ix
Capitolo 1
Scenario
Oggi, in Italia e nel mondo, girando per le citta’ e’ possibile avere accesso
a reti wireless protette e non. Grazie a questo e mediante alcuni accorgimenti
e’ possibile rimanere sempre connessi alla rete.
Una rete LAN wireless (WLAN - wireless local area network) consiste in
una rete formata da due o piu’ computer o dispositivi connessi senza l’utilizzo
di cavi. Essa utilizza tecnologie di trasmissione mediante onde radio come
quella a espansione di spettro oppure la OFDM1 . La tecnologia permette
comunicazioni in un area limitata, consentendo mobilita’ all’interno di essa
senza perdere l’accesso alla rete.
In un contesto privato, le reti senza fili hanno avuto un massivo utilizzo
grazie alla facilita’ di installazione e alla crescente diffusione di portatili e
palmari. Alcuni tipi di esercizi come coffee-shop o centri commerciali hanno
iniziato ad offrire questo tipo di servizio ai clienti. Nelle citta’ sono nati progetti per piccole reti pubbliche, per esempio quelle di biblioteche e universita’,
oppure grandi reti civiche che coprono le vie del centro2 .
1
Orthogonal Frequency-Division Multiplexing (OFDM), tra le tecnologie per la tele-
comunicazione, e’ un tipo di modulazione di tipo multi-portante che utilizza un numero
elevato di sottoportanti ortogonali tra di loro.
2
A Bologna per esempio troviamo la Rete Civica Iperbole (www.comune.bologna.it)
1
2
1. Scenario
1.1
Contesto della ricerca
Lo studio riguarda la mobilita’ mediante connettivita’ wireless in un ambiente vasto (per esempio una citta’). Per fare questo e’ necessario avere una
copertura globale dell’area, anche attraverso varie reti differenti, e accesso a
tutti gli hot spot presenti lungo il percorso.
Figura 1.1: Hot Spot Fon a Bologna (maps.fon.com)
Precisamente la ricerca risponde all’esigenza di avere un’interazione effettiva con il flusso dei dati in un contesto UDP. Il protocollo UDP e’ di tipo
senza connessione e non permette di avere informazioni riguardanti la sorte
dei pacchetti inviati. L’utilizzo di questo protocollo viene imposto dal tipo
di servizio che si vuole sfruttare; nel nostro caso la scelta del protocollo VoIP
ha reso necessario affrontare il problema.
Grazie ad una maggiore padronanza del sistema, lo studio e’ stato svolto
in ambiente Linux, e data la sua durata vi e’ stato il passaggio dalla versione
del kernel 2.6.23.x alla 2.6.25.x. La disponibilita’ dei sorgenti di kernel e
driver hanno reso la scelta alquanto immediata.
1.1 Contesto della ricerca
Data la facile reperibilita’ e la grande diffusione delle porte USB in quasi
tutti i dispositivi mobili, la preferenza e’ andata alle schede WNIC3 USB.
Il nostro scopo e’ fornire il maggior numero di informazioni possibili
riguardanti la sorte dei pacchetti trasmessi. Per poterlo fare lavoreremo all’interno dello stack di rete implementando un servizio cross-layer utilizzabile
in userspace.
Figura 1.2: Meccanismo di interazione
Per capire quali sono i servizi presenti e le problematiche da affrontare e
risolvere, di seguito si trovano le spiegazioni dei dispositivi e dei protocolli
utilizzabili.
3
Wireless Network Interface Controller
3
4
1. Scenario
1.2
Tecnologia Wireless 802.11
Standard Lo IEEE802.11 [3, 4] o Wi-Fi definisce uno standard per le reti
WLAN sviluppato dal gruppo 11 dell’IEEE 802. Qua’ viene definito il livello
fisico e MAC del modello ISO-OSI4 e specificata sia l’interfaccia tra client e
access point che quella tra piu’ client.
All’interno della famiglia, i protocolli dedicati alla trasmissione delle informazioni sono a, b e g. Gli altri standard, cioe’ c, d, e, f, h, ecc. riguardano
estensioni dei servizi base e miglioramenti di servizi gia’ disponibili. Il primo
protocollo largamente diffuso e’ stato il b; in seguito si sono diffusi il protocollo a e soprattutto il protocollo g. La sicurezza e’ stata inclusa in uno
standard a parte, l’802.11i.
L’802.11b e 802.11g utilizzano lo spettro di frequenze (banda ISM5 ) relativo ai 2,4 GHz. E’ importante tenere in considerazione che trovandosi ad
operare su bande con frequenze gia’ utilizzate da altri apparecchi, i dispositivi
b e g possono essere influenzati da telefoni cordless, ripetitori audio/video per
distribuire programmi televisivi satellitari oppure altri apparecchi all’interno
di un appartamento che utilizzino la banda di frequenze sopacitata.
L’802.11a utilizza la banda ISM dei 5,8 GHz.
Sicurezza Per quanto riguarda la sicurezza, le versioni originali dei protocolli 802.11 erano basati sulla crittografia WEP (Wired Equivalent Privacy). Nel 2001 un gruppo dell’universita’ di Berkeley presento’ uno studio
nel quale descriveva le falle di sicurezza del protocollo 802.11. Il gruppo si
4
Open Systems Interconnection Basic Reference Model (OSI Reference Model) e’ una
descrizione a livelli di astrazione dei protocolli e dell’implementazione delle comunicazioni
in una rete di computer.
5
Banda ISM (Industrial, Scientific and Medical) e’ il nome assegnato dall’Unione Internazionale delle Telecomunicazioni (ITU) ad un insieme di porzioni dello spettro elettromagnetico riservate alle applicazioni radio non commerciali, per uso industriale, scientifico
e medico.
1.2 Tecnologia Wireless 802.11
concentro’ sull’algoritmo di cifratura utilizzato dal WEP (RC46 ), che nell’implementazione scelta per lo standard 802.11 era molto debole e facilmente
forzabile. Per ovviare al problema l’IEEE si mise al lavoro per progettare
un’evoluzione dello standard. Contemporaneamente anche la Wi-Fi Alliance
cerco’ una soluzione al problema. Per questo nel 2003 Wi-Fi Alliance annuncio’ la nascita del WPA e nel giugno del 2004 l’IEEE rilascio’ le specifiche
dell’IEEE 802.11i. Il nuovo standard rendeva le reti wireless molto sicure e
la Wi-Fi Alliance lo adotto’ subito sotto il nome di WPA2. Il WPA2 abbandona l’RC4 come algoritmo di codifica per passare al piu’ sicuro Advanced
Encryption Standard.
Le varie opzioni di sicurezza disponibili comportano livelli di complessita’
crescente per la configurazione e l’adeguamento dei firmware e dei driver di
AP e schede di rete wireless.
In ambito privato sono di solito disponibili minori competenze, per cui
capita di trovare reti wireless non crittate o che al massimo utilizzino la
WEP. Queste reti sono insicure e possono essere forzate con semplicita’,
permettendo l’intercettazione del traffico wireless e l’accesso abusivo alla rete.
Vantaggi Molte reti riescono a fornire la cifratura dei dati e il roaming
potendosi spostare dalla copertura di un access point ad un altro senza una
caduta della connessione internet al di fuori del raggio di azione che delimita
un hot-spot.
Diversamente dal cellulare, l’esistenza di uno standard certificato garantisce l’interoperabilita’ fra apparecchio e rete anche all’estero.
Senza i costi della cablatura (essendo tecnologia wireless) si ha una rapida
e facile installazione (ed espansione successiva) della rete.
La presenza di parecchi produttori ha creato una notevole concorrenza
abbassando di molto i prezzi iniziali di questa tecnologia.
6
RC4 o Rivest Cipher 4 e’ un algoritmo di cifratura progettato da Ron Rivest della
RSA Security nell’anno 1987.
5
6
1. Scenario
Svantaggi Il tempo di latenza delle schede wireless e’ superiore a quelle
basate su cavo con una latenza massima nell’ordine di 1-3 ms (da notare che
le connessioni GPRS/UMTS hanno latenze nell’ordine di 200-400ms).
Uno svantaggio delle connessioni Wi-Fi 802.11a/g si trova nella stabilita’
del servizio che per via dei disturbi sul segnale talvolta puo’ essere discontinuo. Infatti questo puo’ essere disturbato da forni a microonde, telefoni
cordless (ecc.) nelle vicinanze che quando sono in funzione disturbano la
frequenza operativa di 2,4-2,5 GHz.
Da non trascurare il fatto che secondo alcuni recenti studi, scienziati affermati dichiarano che le radiazioni Wi-Fi sono nocive al nostro organismo[5,
6, 7, 8].
1.3
1.3.1
Dispositivi
Access Point
Un Access Point e’ un dispositivo che permette all’utente mobile di collegarsi ad una rete wireless. Questo, collegato fisicamente ad una rete cablata
(oppure via radio ad un altro access point), riceve ed invia un segnale radio
al client, permettendo cosi’ la connessione. Un AP puo’ avere varie modalita’
di funzionamento.
Root Mode E’ la modalita’ classica di funzionamento dell’AP, ovvero
quando esso e’ collegato alla rete cablata e funziona da punto di accesso
per i nodi mobili wireless (Laptop, Cellulari, Palmari, ecc.)
Bridge Mode Consiste nalla creazione di un link wireless tra due (pointto-point) o piu’ (point-to-multipoint) access point. Tipicamente quando un
access point funziona in bridge mode non svolge la funzione di root, anche se alcuni costruttori permettono questa possibilita’ di funzionamento in
contemporanea.
1.3 Dispositivi
Repeater Mode Consente di aumentare il raggio di copertura di una rete
wireless. Questo riduce drasticamente il troughput.
1.3.2
Schede di rete wireless
Un controller di rete wireless (WNIC - Wireless network interface controller) e’ una scheda di rete che permette ad un computer di utilizzare una
infrastruttura di rete non cablata. Questa lavora ai primi due livelli del modello ISO-OSI. Il dispositivo utilizza un’antenna e la comunicazione avviene
attraverso le microonde.
Funzionamento Esistono due essenziali modalita’ di funzionamento, conosciute come infrastruttura e ad-hoc.
Nel modello a infrastruttura e’ necessaria la presenza di un AP. Questo
gestira’ tutto il trasferimento dei dati e si comportera’ da hub centrale. In
questa modalita’ tutti i client devono essere connessi all’AP con lo stesso
SSID (service set identifier). In caso di cifratura devono essere a conoscenza
della chiave oppure di un mezzo per l’autenticazione.
In una rete ad-hoc non e’ necessario un AP poiche’ ogni dispositivo puo’
interfacciarsi direttamente con gli altri nodi della rete. Anche in questo caso
tutti i client devono essere impostati con lo stesso SSID sullo stesso canale.
Le schede di rete utilizzano le specifiche IEEE 802.11. Vecchi dispositivi utilizzano standard antiquati, quelli recenti permettono sia l’utilizzo di
standard attuali che la retrocompatibilita’.
E’ importante notare che il range del dispositivo varia in base all’ambiente circostante (ostacoli presenti nell’area) e alla qualita’ dell’antenna. Le
fonti ambientali che influiscono sul funzionamento sono soprattutto quelle
elettriche (frigoriferi, contatori, ecc.) oppure veri e propri ostacoli strutturali
(muri, gabbie metalliche, ecc.)
La velocita’ massima di trasferimento si puo’ ottenere solo se realmente
vicini alla fonte della trasmissione. I dispositivi negoziano dinamicamente la
velocita’ di trasmissione per minimizzare la perdita di pacchetti (e quindi i
7
8
1. Scenario
tentativi di ritrasmissione).
In un desktop computer una WNIC e’ solitamente connessa mediante il
bus PCI, ma esistono alternative come USB, PC Card e soluzioni integrate
come Mini PCI e PCI Express Mini.
Dispositivi USB
L’Universal Serial Bus e’ uno standard di comunicazione seriale che consente di collegare diverse periferiche ad un computer. Progettato per consentire a piu’ periferiche di essere connesse usando una sola interfaccia standardizzata ed un solo tipo di connettore, permette l’hot plug7 .
I device USB WNIC sono di facile reperibilita’ e semplici da utilizzare.
Spesso le loro caratteristiche non li inseriscono al top della categoria, ma
hanno vantaggi non trascurabili. Primo fra tutti, mediante una prolunga
USB e’ possibile spostare il device per ottenere una ricezione migliore. In
effetti in un ambiente chiuso la ricezione varia anche solo spostandosi di un
metro8 .
Dispositivi PCMCIA
Si definisce PCMCIA9 la porta o il dispositivo nato per l’espansione delle
funzionalita’ dei computer portatili. Lo standard delle PC Card nasce nel
1991 dalla fusione dei due standard JEIDA10 4.1 e PCMCIA 2.0.
Originariamente le PC Card furono pensate come slot di espansione per
la memoria dei portatili, successivamente nello stesso formato vennero creati
7
Si dice hot plug un’interfaccia che permette il collegamento e/o lo scollegamento di
un dispositivo anche a sistema avviato
8
Mobili, porte e pareti modificano la diffusione delle onde elettromagnetiche. In una
casa la ricezione peggiora anche solo spostandosi di qualche metro, questo dovuto anche
alla qualita’ dei dispositivi utilizzati per uso personale
9
Personal Computer Memory Card International Association, associazione che
sviluppo’ il primo dispositivo.
10
Le JEIDA sono memory card giapponesi precedentemente diffuse a quelle PCMCIA
1.3 Dispositivi
svariati dispositivi come schede di rete, modem e hard disk. E’ da notare che
la funzionalita’ originaria e’ andata in disuso.
Esistono tre formati di PC Card e vari accessori per l’estensione di esse.
Tutti i tipi hanno la stessa dimensione e numero di pin (68), la differenza
sta nello spessore, rispettivamente 3.3mm, 5.0mm, e 10.5mm11 . Mediante la
variazione di spessore e’ possibile ottenere device PCMCIA conteneti componenti di grosse dimensioni, e grazie alle estensioni le card possono sporgere
dal connettore, permettendo per esempio ad un antenna wireless di essere
esposta.
Dispositivi Mini PCI e PCI Express Mini
Mini PCI e’ un bus standard che permette di connettere dispositivi periferici al computer. E’ un’evoluzione del PCI bus (Peripheral Component
Interconnect) progettato per computer portatili e altri dispositivi di piccole
dimensioni.
PCI Express Mini Card e’ l’evoluzione dell’ interfaccia PCI Express
usando il bus Mini PCI. Sviluppata da PCI-SIG12 , l’interfaccia supporta
connettivita’ PCI Express, USB 2.0 e Firewire. Ogni device puo’ scegliere
l’interfaccia che ritiene piu’ appropriata al suo scopo.
I device WLAN con queste connessioni sono quelli integrati nei laptop.
11
12
Da notare la possibilita’ di utilizzare card sottili in slot spessi.
Il PCI-SIG o Peripheral Component Interconnect Special Interest Group e’ un gruppo
responsabile delle specifiche degli standard dei bus Peripheral Component Interconnect
(PCI), PCI-X, and PCI Express (PCIe).
9
10
1. Scenario
1.4
Layer e protocolli
1.4.1
Stack di rete
Perche’ una infrastruttura di rete possa funzionare in modo corretto ed
efficacie, e’ necessaria una strutturazione dettagliata del software che la deve
gestire. Per ridurne la complessita’, quasi tutte le reti sono gestite da una
struttura gerarchica di livelli (ognuno creato sulla base del livello sottostante)
che astraggono e risolvono i problemi presenti. Numero, nome e caratteristiche dei livelli varia da rete a rete, comunque sia, ogni livello utilizza i servizi
forniti dal layer sottostante per offrire ulteriori servizi al layer superiore[1, 2].
Questo principio e’ comunemente utilizzato nell’informatica e si basa sulla
possibilita’ di trattare ogni layer come una black box, potendolo utilizzare
semplicemente conoscendone l’interfaccia e il formato dell’informazione in
uscita dopo l’elaborazione.
Tra due postazioni la comunicazione avviene per livelli, cioe’ un dato livello nella macchina A comunichera’ con il livello corrispondente nella macchina
B. Le regole e le convenzioni utilizzate in questa comunicazione vengono definite come il protocollo del layer. La violazione di questi protocolli rende la
comunicazione difficile se non impossibile.
In mezzo ad ogni coppia di livelli adiacenti e’ presente un’interfaccia.
Vengono definite le operazioni e i servizi forniti dal livello sottostante a quello
superiore. Oltre a minimizzare la quantita’ di informazioni necessarie per la
comunicazione, rende possibile la modifica integrale dell’implementazione di
un livello (mantenendo ovviamente intatta l’interfaccia) senza farlo sapere ai
livelli adiacenti.
La specifica di questa infrastruttura deve contenere tutte le informazioni
che permettano la creazione di essa dal punto di vista sia hardware che
software.
Da notare che implementazione e specifiche di due macchine differenti
possono essere diverse, l’unica cosa importante sta nel fatto che il sistema
funzioni correttamente e che vi sia un linguaggio comune che permetta la
1.4 Layer e protocolli
comunicazione. Per esempio tra due architetture con specifiche e implementazioni differenti che sanno interpretare e utilizzare il protocollo IP la
comunicazione avviene senza problemi.
Stack di rete e linux Seguendo i suggerimenti degli stessi developer del
kernel13 e dei driver presi in considerazione si e’ deciso di procedere utilizzando come riferimento lo stack di rete mac80211 recentemente inserito nel
kernel stabile, in quanto il codice si presenta meglio strutturato e organizzato.
Inoltre e’ lo stack di rete del kernel stabile e vi sara’ una migrazione dei vari
driver che ancora si appoggiano al vecchio stack softmac e generic ieee80211.
Nel modello ISO OSI la rete e’ strutturata in 7 livelli di astrazione. I
livelli a cui siamo maggiormente interessati dal punto di vista delle modifiche
da effettuare sono quello MAC, IP e Trasporto, la raccolta delle informazioni
avviene muovendosi tra essi.
1.4.2
Livello Data Link (livello 2 del modello OSI)
Il livello Data Link si pone il problema della connessione diretta di due
apparecchi. Si hanno quindi due sistemi connessi mediante un canale di
comunicazione che si comporta come un cavo, per esempio un cavo coassiale, una linea telefonica, oppure una connessione punto-punto mediante
microonde.
Necessariamente il canale deve comportarsi come un cavo nel quale ogni
sequenza di bit inviati viene ricevuta esattamente in quell’ordine. Il problema
non e’ triviale data la possibilita’ di errori dovuti alla tecnologia. Un altro
aspetto non trascurabile consiste nella presenza di ritardi di propagazione
del segnale e nel fatto che la velocita’ di trasmissione e’ finita. Questi limiti
influenzano notevolmente il funzionamento dei protocolli.
13
Nella documentazione reperibile scritta da loro specificano il punto di vista ufficiale
11
12
1. Scenario
Mac 802.11
Il protocollo MAC (Media Access Control) e’ un sottolivello del Data Link
Layer. Permette l’indirizzamento univoco e l’accesso ad un canale condiviso. Questo sottolivello funge da interfaccia tra il sottolivello LLC (Logical
Link Control, rientra anchesso nel DL Layer) e il livello fisico (primo layer
del modello OSI). Inoltre emula un canale di comunicazione full-duplex in
una rete ad accesso multiplo rendendo possibile comunicazioni in unicast,
multicast e broadcast.
In una comunicazione point-to-point full-duplex il livello MAC non e’
necessario, ma viene quasi sempre incluso in questi protocolli per questioni
di compatibilita’.
Indirizzamento Gli indirizzi gestiti da questo layer vengono chiamati indirizzi fisici o indirizzi MAC. Un identificativo MAC e’ un numero di serie
univoco associato alla scheda di rete, rendendo possibile la consegna dei pacchetti ad un nodo all’interno della sottorete14 . Un esempio di rete fisica e’
una LAN Ethernet, magari con connesso un AP e i relativi client, infatti quest’ultima condivide con la rete cablata la stessa gerarchia di indirizzi
MAC a 48 bit.
Meccanismo di accesso al canale Il meccanismo fornito da questo sottolivello e’ anche conosciuto come multiple access protocol e rende possibile a
piu’ nodi di collegarsi e condividere lo stesso mezzo fisico. Questo protocollo
scova o previene le collisioni dei pacchetti in transito mediante un meccanismo di contesa del canale oppure attraverso l’allocazione di risorse riservate
per la creazione di un canale logico. Questo meccanismo di controllo si fonda
sul multiplexing a livello fisico.
Il protocollo piu’ diffuso nelle reti wired e’ chiamato CSMA/CD (Carrier
14
Per sottorete si intende un rete fisica composta da una o piu’ reti interconnesse me-
diante ripetitori, hub, bridge e switche, ma non IP router. Un IP router puo’ connettere
piu’ sottoreti differenti
1.4 Layer e protocolli
sense multiple access con collision detection). Viene utilizzato all’interno
dello stesso dominio di collisione, per esempio una sottorete gestita da un
hub o un bus Ethernet. Una rete solitamente e’ formata da vari domini di
collisione interconnessi mediante bridges e switches.
Parlando delle reti wireless troviamo il CSMA/CA (Carrier sense multiple
access con collision avoidance). Parlando di CSMA, quando un nodo mobile
desidera trasmettere per prima cosa deve ascoltare il canale per un tempo
prestabilito per verificare che non vi siano attivita’. Se lo si trova in stato
idle allora si ha il permesso di trasmettere, in caso contrario si deve posticipare l’invio dei dati. Nello specifico con il CSMA/CA (LocalTalk) una volta
che il canale e’ libero, la station che vuole trasmettere invia un segnale che
specifica alle altre stazioni di non trasmettere e solo successivamente inizia
l’invio dei dati.
La prevenzione delle collisioni migliora le performance del CSMA. In caso di canale occuppato il tempo di attesa prima del test successivo viene
randomizzato, e questo riduce notevolmente la probabilita’ di collisioni. La
necessita’ della prevenzione delle collisioni nasce dal fatto che in una rete
wireless non si riesce ad ascoltare il canale durante la trasmissione dei propri
dati, questo rende impossibile scovare le collisioni una volta avvenute. Un
ulteriore problema e’ quello del client nascosto.
Il client A e il client B non si vedono tra loro, ma tentano di comunicare
con lo stesso Access Point. A trasmette all’AP e B non sentendo il canale
occuppato decide di fare lo stesso.
Un metodo per incrementare le prestazioni e’ stato trovando aumentando
lo scambio di messaggi prima della trasmissione vera e propria. Il meccanismo e’ chiamato IEEE 802.11 RTS/CTS e funziona nel seguente modo. A
prima della tramissione invia all’AP un pacchetto di tipo RTS (Request to
send), se l’AP puo’ rivere invia come risposta un CTS (Clear to send) e cosi’
iniziera’ la trasmissione di A. In questo modo B non sa che A esiste, ma sa
che l’AP sta ricevendo dati da qualcuno perche’ giunto in possesso del CTS
per qualcun’altro.
13
14
1. Scenario
Figura 1.3: Nodo nascosto
La dimensione dei pacchetti RTS/CTS varia da 0 a 2347 ottetti. Normalmente, se i dati da inviare hanno dimensione minore di 2347 l’invio del frame
RTS non avviene e il pacchetto dati e’ spedito immediatamente. Se questa
dimensione viene superata, allora il meccanismo RTS/CTS viene utilizzato.
Frame 802.11 Lo standard 802.11 definisce tre differenti tipi di frame:
dati (DATA), controllo (CTRL), manutenzione (MGMT). Ognuno di essi e’
formato da svariati campi utilizzati dal sublayer per svolgere le sue funzioni.
Figura 1.4: Frame 802.11
1.4 Layer e protocolli
15
Il primo campo da valutare nello studio e’ il Frame Control, composto
da 11 sottocampi. Contiene informazioni riguardanti il protocollo, il tipo
(uno dei tre precedentemente citati), il sottotipo del frame (nel caso sia di
controllo, per esempio un ACK), se vi e’ frammentazione e altro ancora.
Un altra informazione sensibile riguarda la crittografia e cioe’ specifica se il
payload e’ crittato oppure no.
Per completezza riportiamo la struttura di un ACK frame.
Figura 1.5: Struttura ACK Frame
Come si puo’ notare, non e’ presente nessun campo che permetta di ricondurre l’acknowledgement ricevuto col relativo pacchetto trasmesso. Per
questo tenere traccia dell’effetiva trasmissione dei pacchetti non risulta affatto essere un compito banale.
1.4.3
Livello Network (livello 3 del modello OSI)
Nel trasferimento dei pacchetti dalla sorgente alla destinazione, questo
livello si preoccupa di tutti i dettagli relativi al percorso.
La consegna
deve avvenire indipendentemente dalla struttura della rete e dal numero di
sottoreti presenti.
E’ da notare che questo e’ l’ultimo livello in cui si ha a che fare con
una trasmissione end-to-end. Per questo e’ necessario che il layer conosca la
topologia di reti e sottoreti per potere scegliere il giusto percorso attraverso di
esse, soprattutto nel caso sorgente e destinazione si trovino in reti differenti.
Sempre nel terzo livello viene controllato il flusso delle comunicazioni per
evitare la creazione di code negli snodi nevralgici della rete.
16
1. Scenario
Protocollo IPv4
Il protocollo IPv4 e’ descritto nell’IETF RFC 791[9] pubblicato per la
prima volta nel settembre 1981.
E’ un protocollo data-oriented e viene usato nelle reti di tipo packet
switched. E’ di tipo best-effort, infatti non garantisce la consegna dei pacchetti a destinazione. Non controlla la correttezza dei dati e possono verificarsi ricezione di pacchetti duplicati oppure non in ordine di spedizione.
Spazio degli indirizzi Gli indirizzi IPv4 sono a 32 bit, per questo vi
sono solo 4.294.967.296 indirizzi possibili. Da tenere presente che alcuni
di essi sono di tipo riservato, per esempio circa 18 milioni sono destinati
alle reti private e circa 16 milioni sono indirizzi broadcast. Nonstante il
numero apparentemente elevato, questo spazio di indirizzamento col passare
del tempo si e’ dimostrato insufficiente. Il NAT (Network address translation)
ha permesso di allontanare l’inevitabile. La soluzione evvettiva al problema
la si trova nello sviluppo del protocollo IPv6.
Il formato umanamente leggibile di un indirizzo IPv4 consiste in una
quadrupla di numeri separati da un punto (92.168.10.1).
NAT Un metodo semplice per permettere a tutti i computer di una sottorete di dialogare con tutta la rete pur non possedendo un ip fisso visibile
dall’esterno e’ proposto dal NAT (Network address translation). Il metodo consiste nell’avere un solo gateway con ip fisso accessibile dall’esterno che
presta il suo indirizzo per le comunicazioni di tutte le macchine della sottorete
traducendo e tenendo traccia dei pacchetti in transito per poter recapitare
le risposte ai legittimi destinatari. In questo modo si migliora la sicurezza perche’ le macchine interne alla rete non sono direttamente accessibili
dall’esterno, e si migliora l’utilizzo dello spazio di indirizzamento possibile,
grazie al fatto che un’intera rete privata utilizza un solo IP.
1.4 Layer e protocolli
ARP Il protocollo IP necessita di conoscere la struttura logica della rete.
Infatti se un nodo A invia un pacchetto (contenente l’indirizzo IP di sorgente
e destinazione) al nodo B situato in una rete differente, il device che collega
le due reti deve avere modo per conoscere entrambe le loro strutture. Questo
deve avere una tabella dinamica dei MAC di entrambe le sottoreti e la giusta
associazione MAC-IP. Questa associazione viene fatta mediante il protocollo
ARP (Address Resolution Protocol) e lo scambio di messaggi propagati in
broadcast. La tabella contenente le coppie vede associato ad esse un TTL
(Time to live), in pratica la loro scadenza.
DHCP La possibilita’ che un computer conosca il suo MAC address ma
non il suo indirizzo IP si presenta spesso nelle reti private. La soluzione
a questo, in precedenza e’ stata RARP (Reverse ARP), successivamente si
e’ arrivati a BOOTP (Bootstrap Protocol), per arrivare a DHCP (Dynamic Host Configuration Protocol) dei giorni nostri. Oltre all’IP, DHCP permette l’assegnazione del server NTP (Network Time Protocol), quello DNS
(Domain Name System) e altri particolari.
Formato del pacchetto IP Il protocollo IP prevede la seguente struttura
per i datagram IP
Figura 1.6: Header del pacchetto IP
17
18
1. Scenario
Data Il campo data non fa parte dell’header IP, e non e’ incluso nel
checksum. Il suo contenuto e’ specificato nel campo protocol e puo’ essere
uno qualsiasi dei protocolli del livello trasporto. I piu’ comuni sono:
Tabella 1.1: Codice protocolli Transport Level
Codice Protocollo
1
Internet Control Message Protocol (ICMP)
2
Internet Group Management Protocol (IGMP)
6
Transmission Control Protocol (TCP)
17
User Datagram Protocol (UDP)
89
Open Shortest Path First (OSPF)
132
Stream Control Transmission Protocol (SCTP)
Frammentazione e riassemblaggio Per rendere il protocollo piu’
tollerante alle differenze delle varie sottoreti si e’ inserito il concetto di frammentazione. Grazie a questo ogni device ha la possibilita’ di spezzare i dati
in piu’ pacchetti. Questo e’ necessario nel caso la MTU (maximum transmission unit) della rete sia minore della dimensione del pacchetto. Per esempio
la dimensione massima di un pacchetto IP e’ di 65,535b, ma la dimensione
tipica del MTU di una rete Ethernet e’ di 1500b. Questo comporta che per
inviare tutto il payload del pacchetto IP sono necessati 45 frame ethernet.
Per la frammentazione si e’ scelto il network layer perche’ e’ il primo che
collega gli estremi della comunicazione anziche’ gli hop. Se la frammentazione
fosse eseguita a livelli superiori (TCP, UDP, etc.) si avrebbero implementazioni ridondanti. Nel caso fosse implementata a livelli inferiori (Ethernet,
ATM, etc.) risulterebbe necessario frammentare e riassemblare ad ogni hop,
il che implicherebbe una aumento spropositato dei costi. In pratica la scelta
e’ stata compiuta per motivi di efficienza.
Frammentazione Quando un device riceve un pacchetto IP esamina
la destinazione e sceglie su quale interfaccia instradarlo. Ogni interfaccia ha
1.4 Layer e protocolli
un MTU specifico, quindi si valuta la necessita’ di frammentazione.
La frammentazione tiene conto della dimensione dell’header (minimo 20b
e massimo 60b). Ogni segmento ha la sua intestazione IP con queste variazioni:
• la dimensione totale del pacchetto viene modificata con la dimensione
del segmento
• il flag MF (more fragments) viene posto a 1 per tutti i frammenti eccetto
l’ultimo
• il fragment offset viene sistemato in accordo alla posizione del segmento
nel pacchetto IP completo utilizzando blocchi di 8byte
Riassemblaggio Alla ricezione di un pacchetto IP e’ necessario controllare il bit della frammentazione e l’offset. Se il bit e’ a 1 e l’offset e’
diverso da 0 allora e’ necessario immagazzinare i dati relativi al pacchetto. Alla ricezione del pacchetto con bit a 0 si potra’ ricostruire il pacchetto
originario utilizzando i campi offset. Una volta riassemblati tutti i segmenti
nell’ordine corretto, il pacchetto IP viene passato al livello superiore dello
stack di rete per ulteriori elaborazioni.
1.4.4
Livello Trasporto (livello 4 del modello OSI)
Il livello di trasporto permette il dialogo strutturato tra mittente e destinatario. I protocolli definiti permettono la comunicazione end-to-end15 .
Uno di questi protocolli e’ il TCP (Transmission Control Protocol). E’
connection-oriented e permette al flusso di dati di essere recapitato senza
errori. I frammenti dello stream vengono impacchettati e passati ai layer
inferiori, sara’ poi il ricevente che provvedera’ a riassemblarli e in caso di
errore a chiederne il rinvio. Implementa anche un meccanismo per il flow
15
Per comunicazione end-to-end si intende lo scambio di informazioni tenendo in con-
siderazione solamente sorgente e destinazione, senza prestare attenzione ai passaggi
intermedi.
19
20
1. Scenario
control, e cioe’ non permette ad una sorgente veloce di congestionare un
ricevente lento.
Il protocollo a cui siamo interessati e’ l’UDP (User Datagram Protocol).
Questo e’ di tipo inaffidabile (non e’ detto che i pacchetti arrivino a destinazione) e senza connessione. E’ comunque abbondantemente utilizzato
laddove le applicazioni necessitano di interattivita’ e velocita’. Per esempio
audio e video vengono quasi sempre inviati attraverso UDP, questo perche’
piuttosto che la ricezione di tutti i pacchetti, e’ molto piu’ importante la
regolarita’ e la continuita’ del flusso di dati.
Protocollo UDP
L’User Datagram Protocol e’ uno dei protocolli fondamentali di Internet.
Le applicazioni possono creare e inviarsi dei messaggi brevi (conosciuti anche come datagram) attraverso degli appositi socket. Il protocollo e’ stato
definito nel 1980 da David P. Reed (RFC 768)[10].
UDP non garantisce l’affidabilita’ della connessione o che i pacchetti
vengano ricevuti nell’ordine di invio. Infatti possono anche essere duplicati
o non arrivare affatto senza nessuna segnalazione. L’eliminazione di questo
controllo rende il protocollo veloce ed efficiente per le applicazioni che non
necessitano di queste garanzie. Spesso applicazione audio e video lo utilizzano data la preferenza ad avere pacchetti mancanti invece che ritardi elevati.
Oppure in caso sia necessario una sincronia tra un server e dei client (per
esempio i giochi in rete) oppure si debbano gestire messaggi in broadcast o
multicast.
Un esempio di applicazioni che utilizzano UDP sono Domain Name System (DNS), streaming media applications come IPTV, Voice over IP (VoIP)
e per esempio Trivial File Transfer Protocol (TFTP).
UDP header Il protocollo UDP impone un header dei pacchetti con la
seguente struttura.
1.4 Layer e protocolli
Figura 1.7: Header del pacchetto UDP
Caratteristiche del protocollo UDP e’ un semplice protocollo basato sul
trasferimento di messaggi e privo di connessione (non si crea una connessione
end-to-end dedicata). Semplicemente lo stream di pacchetti viene inviato
alla destinazione senza nessun controllo di sorta e ognuno dei pacchetti e’
completamente indipendente dall’altro.
Inaffidabilita’ Quando un messaggio viene inviato, non e’ possibile sapere
nulla della sua sorte.
Mancanza di ordinamento Il flusso di messaggi inviati puo’ essere ricevuto in ordine differente.
Leggero Data la mancanza di controlli e’ leggero in termine di byte dell’header da aggiungere, efficiente e veloce.
Datagram I pacchetti vengono inviati individualmente e nel caso arrivino a destinazione essi sono sicuramente integri. Hanno dimensione
predefinita e non vengono spezzettati o riassemblati.
1.4.5
Livello Applicazione (livello 7 del modello OSI)
Il livello applicazione contiene svariati protocolli normalmente utilizzati dagli utenti. Un esempio chiarificatore lo si trova nel protocollo HTTP
(HyperText Transfer Protocol), che sta alla base del World Wide Web.
La quantita’ di protocolli esistenti non permette di discuterne o farne
una panoramica, perche’ qualsiasi applicazione utilizzi la rete si basa su un
protocollo di questo livello (dalle mail alla messaggistica istantanea e molto
altro).
21
22
1. Scenario
Protocollo VoIP
Con VoIP[11, 12] (Voice Over Internet Protocol) si intende il protocollo
capace di gestire il passaggio da segnale audio (analogico) a flusso di pacchetti
(digitale) sulla rete e viceversa.
In questo modo e’ possibile effettuare delle telefonate utilizzando la rete
Internet anziche’ quella telefonica pubblica. Per questo e’possibile telefonare
a costi molto bassi in qualsiasi parte del mondo senza differenze geografiche.
La qualita’ della telefonata e’ paragonabile a quella di una normale linea
telefonica; basta solo disporre di una connessione internet a banda larga
(ADSL o HDSL) con almeno 32 kbps di banda garantita.
Funzionamento Per poter funzionare sono richiesti due tipi di protocollo
di comunicazione in parallelo:
• uno per trasportare la voce sottoforma di dati, normalmente viene
adottato il protocollo RTP (Real-Time Transport Protocol)
• l’altro per riconvertire i dati in voce, per sincronizzarla e riordinarla
quindi cronologicamente
Esistono diversi protocolli standard:
• SIP (Session Initiation Protocol) della IETF;
• H.323 della ITU;
• Skinny Client Control Protocol proprietario della Cisco;
• Megaco (conosciuto anche come H.248);
• MGCP;
• MiNET proprietario della Mitel;
• IAX, usato dai server Asterisk open source PBX e dai relativi software
client.
1.4 Layer e protocolli
Vantaggi I benefici dell’utilizzo di una tecnologia innovativa quale il VoIP
sono molteplici.
Abbattimento costi Consente un abbattimento dei costi notevole, sia
per chiamate nazionali che internazionali o intercontinentali dato che il costo
della chiamata praticamente non varia sia che si parli nel proprio paese che
dalla parte opposta del mondo.
Agevolazioni in campo lavorativo Puo’ essere utilizzato sia all’interno di una stessa azienda, sia per telefonate piu’ complesse, come teleconferenze in multi-point. Inoltre si puo’ utilizzare una sola rete integrata per
voce e dati, che garantisce una riduzione dei bisogni totali di infrastruttura
e, in ambito aziendale uno scambio agevolato delle informazioni.
Servizi telematici Se si decide di utilizzare l’ apparecchio telefonico
apposito, a differenza dei normali apparecchi questo potra’ essere sfruttato
sia per normali conversazioni, che per avere accesso ad alcuni servizi internet,
quali l’ elenco telefonico, ottenendo una risposta in forma vocale o testuale.
Possibilita’ di Number Portability Passando alla tecnologia VoIP
non e’ detto che si debba perdere il proprio numero telefonico, perche’, grazie
alla Number Portability il numero resta tale e quale. La procedura che
permette di trasferire numeri telefonici da un operatore all’altro e’ similare a
quella dei vari gestori di telefonia mobile. E’ possibile, inoltre, telefonare da
un pc portatile via internet da qualsiasi luogo dotato di collegamento ADSL.
Maggiore privacy Le chiamate tramite VoIP sono piu’ sicure delle
normali chiamate, anche se non vengono criptate o cifrate. Per riuscire ad
intercettare una comunicazione VoIP si deve aver accesso agli apparati che
costituiscono la rete VoIP e/o la Rete Internet.
23
24
1. Scenario
Numeri di emergenza Dal 2006 la maggior parte dei provider di
servizi VoIP ha abilitato le chiamate ai numeri di emergenza, localizzando in
tempo reale l’utente.
Svantaggi Come tutte le tecnologie in via di sviluppo, e quindi da perfezionare, anche questa del VoIP presenta diversi svantaggi.
Qualita’ vocale Utilizzando la stessa linea per trasmettere sia voce che
dati, la qualita’ della voce durante una telefonata potrebbe calare e, in caso
di black-out elettrico non sarebbe possibile effetturare telefonate.
La mancata qualita’ eccellente delle telefonate e’ dovuta a due diversi
problemi: il ritardo e la perdita di pacchetti dati.
Il ritardo genera eco e sovrapposizione delle conversazioni. Per sopperire a
questi problemi fastidiosi sara’ necessario progettare degli apparecchi appositi
in grado di cancellare l’eco. Per sopperire alla presenza di eco e disturbi quali
fruscii, sono stati gia’ creati software appositi. Per quanto riguarda la gesione
dei silenzi, delle pause o di respiri prolungati, quindi mancanza di parole, sono
stati creati altri software per eliminarli tenendo conto che, generalmente, una
conversazione e’ costituita da circa il 50% di tempi morti ed in questo modo
si mantiene libera la linea da sovraccarichi inutili.
Per quanto riguarda la perdita dei pacchetti, per ottenere una conversazione lineare questi devono rispettare l’ordine cronologico in cui vengono
inviati. Una perdita di pacchetti voce pari o superiore al 10% non consente
di svolgere una chiara comunicazione.
Banda insufficiente Il gestore della rete dovrebbe garantire una larghezza di banda sufficientemente ampia, per ridurre il tempo di latenza e le perdite
di dati. Tuttavia cio’, mentre e’ relativamente facile nelle reti private, e’ molto
piu’ difficile quando si usa internet come mezzo trasmissivo.
1.5 Crittografia
Numerazioni speciali Un ulteriore svantaggio e’ dato dalla impossibilita’ di alcuni operatori di chiamare i numeri di emergenza e alcuni numeri
speciali.
Il nostro contesto nel VoIP Lo scenario applicativo da noi preso in considerazione, vede utilizzato il VoIP in un contesto wireless. Per questo motivo
diviene indispensabile risolvere il problema dell’interattivita’ del controllo del
flusso di dati con questo mezzo trasmissivo.
1.5
Crittografia
Sicurezza nelle reti wireless Parlando di sicurezza in ambito wireless
si intende la prevenzione di accessi non autorizzati o il danneggiamento dei
computer interconnessi.
Vi sono un gran numero di buchi nella sicurezza dei protocolli utilizzati
e dei metodi di crittazione. Da non sottovalutare e’ anche la mancanza di
consapevolezza e attenzione degli utenti di questo servizio. La violazione di
queste reti e’ diventata molto piu’ semplice con l’introduzione delle applicazioni easy-to-use basate sia su Linux che su Windows trovabili nella rete
gratuitamente.
Una realta’ da tenere in considerazione vede l’utilizzo delle periferiche
wireless non configurate utilizzate per introdursi nelle reti cablate. Questo
approccio e’ stato utilizzato per ottenere l’accesso a quelle reti aziendali prive
di wireless. Infatti dal 2005 ad oggi la stragrande maggioranza dei laptop ha
una scheda wireless integrata, attiva anche se non configurata per l’accesso
ad una rete.
Tipologie di accessi non autorizzati Di seguito sono riporati alcuni
modi per accedere a una rete wireless. Tutti gli attacchi volti a demolire la
rete sono omessi.
L’accesso ad una rete puo’ essere accidentale, specialmente se la rete
25
26
1. Scenario
non e’ protetta e si utilizzano dei tool per l’associazione automatica alle reti
presenti.
L’associazione puo’ essere volontaria e dannosa per gli utenti legittimi
della rete. Vi sono svariati modi per arrivare al risultato desiderato. Il
cracker puo fingersi access point, usare le credenziali fornite dal client per
connettersi alla rete ufficiale e inoltrare tutti i dati del client all’AP vero.
Questo e’ un tipico esempio di ’man in the middle’. Oppure puo’ creare una
rete ad hoc con un laptop connesso alla rete cablata e utilizzarlo come accesso
ad essa.
E’ da tenere presente che le reti wireless operando al livello 2 dello stack,
ignorano le protezioni fornite dal livello 3 come VPN (Virtual private network) o reti autenticate. L’unica protezione possibile e’ situata in un accesso
protetto o autenticato al canale, cosa che migliora la protezione, ma rimane
comunque vulnerabile agli attacchi volontari.
Esiste la possibilita’ di limitare i MAC address con privilegi sulla rete.
Un metodo per accedere a queste reti si basa sull’ascolto delle comunicazione presenti e l’appropriazione da parte del cracker di un indirizzo MAC
privilegiato.
Come affrontare il problema Esistono tantissimi modi per evitare
l’intrusione in una rete, ma non esisono reti sicure al 100%. Il metodo piu’
affidabile vede l’uso combinato di piu’ tecnologie contemporaneamente.
Sicuramente vi sono tre regole d’oro:
1. Tutti i dispositivi che possono accedere alla rete devono essere sicuri.
(Firewall, antivirus, corretta configurazione del sistema)
2. Tutti gli utenti devono sapere cosa significa sicurezza in campo wireless
e non.
3. La rete deve essere costantemente monitorata per vedere malfunzionamenti ed eventuali tentativi di accesso.
1.5 Crittografia
Filtraggio dei MAC ID Si stabiliscono quali sono gli indirizzi MAC
che possono accedere alla rete e si filtrano tutti gli altri.
IP Statico Si disabilita l’assegnamento automatico dell’indirizzo IP eseguito dal server DHCP. Questo non impedisce a qualcuno di connettersi alla rete, solo impone una maggior ricerca. Restringendo la dimensione
delle sottoreti e’ anche possibile bloccare determinati indirizzi che altrimenti
sarebbero utilizzabili senza problemi.
Crittografia Per rendere il canale sicuro diviene quindi necessario introdurre la crittografia. In questo modo vi e’ un oscuramento delle informazioni trasmesse nell’etere.
1.5.1
WEP - Wired Equivalent Privacy
Il WEP e’ un algoritmo definito dallo standard 802.11i e deprecato dal
2004 utilizzato dalle reti wireless. Nato per rendere le reti wireless sicure
come quelle cablate, nel 2001 si sono trovate delle vulnerabilita’ gravi. Ad
oggi, con il dovuto software, una rete WEP diviene utilizzabile in 5 6 minuti.
Nonostante questo la WEP e’ ancora fortemente utilizzata, e rimane la
scelta di default utilizzata da AP e router.
Algoritmo di crittazione WEP usa il cifrario a chiave simmetrica RC4
per il livello di confidenza16 , e il checksum CRC-32 per l’integrita’.
Lo standard a 64 bit usa una chiave di 40 bit concatenata con 24 bit di
inizializzazione per formare la chiave RC4 realmente usata durante il traffico.
La scelta dei 40bit fu dettata dalle restrizioni goverantive presenti in USA
nel 1999. Una volta tolte le restrizioni si amplio’ lo standard fino a 128bit
con 104bit di chiave. Questo tipo di chiave viene spesso usata come stringa
16
Per livello di confidenza si intende la probabilita’ che i dati vengano usati non
dall’utente finale
27
28
1. Scenario
esadecimale di 26 caratteri. Esiste anche un formato a 256bit ma non tutti i
produttori lo implementano.
La dimensione della chiave non e’ la vulnerabilita’ maggiore della WEP.
Infatti un problema sono le collisioni e i pacchetti alterati, problemi che non
hanno nulla a che fare con la lunghezza della chiave.
Autenticazione Vi sono principalmente due metodi per l’autenticazione:
Open System e Shared Key.
Nel caso di Open System, il client non deve fornire delle credenziali. Semplicemente la chiave e’ conosciuta da entrambe le parti e quindi i pacchetti
si oscurano utilizzandola. Per questo non vi e’ una vera autenticazione.
Parlando di Shared Key, la chiave WEP si usa anche per l’autenticazione.
L’handshake e’ suddiviso in quattro parti:
1. il mittente invia la richiesta di autenticazione al destinatario
2. questo invia al mittente una ’frase’ in chiaro
3. il mittente la critta con la chiave WEP stabilita e la reinvia al destinatario
4. il destinatario la decritta utilizzando la WEP e controlla che la frase
mandata corrisponda.
In caso di successo l’autenticazione e’ stata effettuata. Dopo l’associazione
autenticata la chiave viene usata per crittare tutti i frame in uscita.
Rimedi Data la debolezza insita nello standard WEP, l’unica soluzione
possibile sta nell’uso di protocolli di tunneling crittati (IPSec, Secure Shell
ecc.) che permettono di avere una trasmissione sicura utilizzando reti insicure.
Comunque l’unica soluzione realmente efficacie sta nel non usare un protocollo di sicurezza deprecato.
1.5 Crittografia
1.5.2
WPA e WPA2 - WiFi Protected Access
Wi-Fi Protected Access (WPA e WPA2) e’ un protocollo nato in risposta
alle debolezze della WEP. WPA implementa quasi interamente lo standard
IEEE 802.11i, ma e’ da tenere presente che standard e implementazione effettiva hanno avuto processi evolutivi paralleli a causa della necessita’ di
ripristinare la sicurezza. WPA2 implementa interamente lo standard. Se
lo standard WPA non impone modifiche all’hardware (se non un possibile aggiornamento del firmware) il WPA2 funziona solamente su dispositivi
moderni.
Esistono 2 tipologie di protocollo WPA, Enterprise e Personal. Quello
Enterprise propone un server per l’autenticazione. Nel caso del Personal si
ha una chiave precedentemente condivisa, infatti tutti gli accessi avvengono
mediante una parola d’ordine uguale per tutti.
Cifratura I dati sono crittati usando il cifrario RC4 con una chiave a 128bit
con un vettore di inizializzazione di 48bit. L’effettiva miglioria dalla WEP e’
stata l’introduzione del TKIP (Temporal Key Integrity Protocol) che cambia dinamicamente le chiavi in uso, permettendo di affrontare i metodi di
ottenimento della chiave usati per la WEP.
Oltre alla cifratura e all’autenticazione, viene usato il MIC (message integrity code) basato sull’algoritmo chiamato Michael, per proteggere l’integrita’ del payload.
Risultato Avendo aumentato la dimensione di chiavi e vettore di inizializzazione, dopo aver ridotto il numero dei pacchetti inviati con le chiavi e
migliorando il sistema di verifica di integrita’ dei pacchetti, il protocollo e’
arrivato ad un livello di sicurezza accettabile.
Si deve comunque tenere presente che l’algoritmo Michael e’ stato utilizzato anche per permettere il riutilizzo dell’hardware datato, e quindi presenta
delle vulnerabilita’. Per ovviare a queste debolezze, nel caso si trovino due
29
30
1. Scenario
pacchetti compromessi, TKIP riavvia la rete forzando la rigenerazione delle
chiavi e quindi bloccando l’attaccante.
Capitolo 2
Obiettivi e sperimentazione
2.1
Obiettivi
La connessione wireless, per sua stessa natura, non permette di effettuare
alcun controllo di flusso sulla trasmissione. Alcuni protocolli come il TCP
implementano questa caratteristica a livello piu’ alto, ma nel nostro caso
dovendo usare il protocollo UDP, su cui si appoggia il VOIP, non e’ in grado
di fornire questo servizio.
Il nostro studio si pone come obiettivo il riportare in userspace alcune informazioni basilari riguardanti la trasmissione dei frame 802.11 per garantire
almeno un controllo di flusso fino al prime hop della comunicazione (Access
Point).
2.1.1
Ack dal prime hop e interattivita’
Nel nostro contesto e’ necessario sapere se la trasmissione di un frame e’
andata a buon fine. Le motivazioni possono essere varie, la possibilita’ di
scegliere di ritrasmettere i frame non inviati correttamente, il monitoraggio
del carico della rete e delle latenze effettivamente presenti (tempo trascorso dal momento in cui il pacchetto viene processato per la trasmissione e
l’avvenuta ricezione del relativo acknowledgement).
Stabilire se effettivamente il pacchetto sia arrivato a destinazione impone
31
32
2. Obiettivi e sperimentazione
la creazione (o l’utilizzo) di un protocollo differente che agisca almeno a livello
trasporto (layer ISO-OSI). Fissando l’utilizzo di UDP over IP l’unica certezza
che si puo’ ottenere sta’ nell’effettiva ricezione del frame da parte del prime
hop (solitamente l’access point). Da non sottovalutare il fatto che spesso il
prime hop e’ connesso alla rete cablata, il che diminuisce notevolmente la
possibilita’ di perdita dei pacchetti.
Il meccanismo cross-layer da noi implementato elabora informazioni prese
dai livelli 2 3 e 4 e li rende disponibili in user space.
Il problema puo’ essere risolto affrontando i seguenti sottoproblemi uno
alla volta e non necessariamente nell’ordine.
• L’utente che invia un datagram UDP, come fa a sapere a quanti e quali
pacchetti IP esso e’ associato?
• Dato l’identificatore del pacchetto IP, come e’ possibile recuperare
l’identificativo del frame MAC in cui e’ incapsulato?
• Dato un frame MAC, come e’ possibile associarvi gli acknowledgement
ricevuti dall’access point?
Riesaminando lo stack di rete precedentemente spiegato si vede come,
partendo dal basso, a livello MAC si reperiscono le informazioni riguardanti
il frame. Infatti e’ a questo livello che si ottiene l’identificatore del frame e
le informazioni relative al suo stato (ACK ricevuto, retry count ecc).
L’associazione dell’ID del pacchetto IP e il relativo frame MAC e’ possibile
a livello network nel momento in cui vi e’ interazione con il livello MAC. In
questo modo dato un identificatore di un pacchetto IP si possono sapere le
sorti del frame associato.
Lo stesso approccio puo’ essere usato a livello trasporto nel momento in
cui si usino le primitive del livello network per l’incapsulamento dei datagram.
Per risolvere il primo problema e’ stato necessario modificare la syscall di
invio di un pacchetto UDP perche’ questa possa restituire l’id del pacchetto
IP associato, cosicche’ l’utente possegga tutti i dati importanti. Per fornire
le informazioni sull’avvenuta trasmissione dei frame si e’ usato il canale di
2.1 Obiettivi
33
errore dei socket. Tutta la gestione dei controlli e della ritrasmissione e’
lasciata all’applicativo in user-space.
Figura 2.1: Modifiche cross-layer
2.1.2
Crittografia
Le reti wireless forniscono una protezione dei dati in transito mediante la
cifratura di essi. Perche’ il servizio da noi fornito sia efficacie e’ necessario
che funzioni indipendentemente dal tipo di cifratura utilizzata dalla rete.
Come obiettivo formulato in questi termini non e’ detto che sia raggiungibile, data la varieta’ di reti che e’ possibile incontrare sul percorso. Per
questo lo studio si focalizza sul mantenere il servizio stabile in presenza di
reti libere, con chiave WEP o TKIP. In questo modo si ha copertura con la
grande maggioranza delle reti presenti in circolazione.
La gestione di questo tipo di informazioni viene eseguita a livello MAC.
34
2. Obiettivi e sperimentazione
2.2
Sperimentazione
Questo studio e’ stato svolto utilizzando e approfondendo le informazioni
fornite dal progetto di Laboratorio di Reti di Calcolatori e dal Tirocinio
svolto presso l’universita’ di Bologna. Per questo e’ necessario motivare le
scelte fatte esponendo qualche dettaglio relativo alle conoscenze pregresse.
Apportare le modifiche necessarie nel kernel a livello stack di rete, permette di ottenere la migliore portabilita’ possibile. E’ da tenere presente che
quando questo studio ha avuto inizio, Settembre 2007, il nuovo stack di rete
era appena entrato nella versione stable del kernel. La documentazione era
molto nebulosa e la reperibilita’ di driver che lo utilizzassero era ancora difficile. Per questo motivo la ricerca e’ iniziata lato driver, nonostante spesso
abbia posto problemi che esulavano il nostro scopo iniziale.
RTL8187 e RT2570usb Nello scenario adottato, il device da prendere in
considerazione deve essere preferibilmente di tipo USB. Per questo in un primo momento sono stati valutati due diversi adattatori usb wireless dotati di
differenti chipset: un rt2570usb e un rtl8187 per i quali sono presenti i driver per il kernel versione 2.6.23.x. Il driver rtl8187 funziona perfettamente,
mentre l’rt2570 ha ancora un problema legato al trasfer rate e soprattutto,
essendo un device piuttosto datato, risente notevolmente delle condizioni ambientali e della polarizzazione dell’antenna. Nonostante il chipset rtl8187 sia
relativamente nuovo e disponibile in commercio, il suo driver rende praticamente impossibile interfacciarsi in modo aperto con l’hardware a causa della
struttura del firmware. Al contrario, nel caso del rt2570 (parte del rt2x00) il
firmware non e’ presente, ma il chipset ralink rt2570 e’ vetusto e non piu’ in
commercio. La versione successiva (rt73) si basa su firmware e il supporto
sotto Linux e’ ben lontano dall’essere usabile.
La scelta e’ caduta sull’rtl8187 . Mediante l’analisi del codice dei driver
si e’ stabilito che la gestione della ricezione e della trasmissione e’ lasciata
interamente al firmware, come molti altri punti caldi. Il firmware filtra le
informazioni riguardanti la trasmissione a tal punto da costringere gli svilup-
2.2 Sperimentazione
patori del driver a falsificarle per permettere ai protocolli dei livelli superiori
di funzionare a dovere. Infatti il driver segna tutti i pacchetti inviati come
correttamente trasmessi (acknowledgement ricevuto) appena prima di passare il pacchetto al device per la spedizione. Sono state fatte alcune prove
per l’ottenimento delle informazioni mediante metodi alternativi, ma sono
stati fallimentari a causa di problemi aggiuntivi, per esempio il layer USB.
Grazie all’aiuto e all’esperienza del Dott. Vittorio Ghini e’ stato trovato
un modus operandi nell’iterazione tra driver e firmware nelle schede integrate
(Mini PCI e PCI Express Mini).
• Il driver tramite un comando comunica al firmware la sua volonta’ di
spedire un pacchetto.
• Il firmware risponde con una avvenuta ricezione del comando.
• A tempo debito il firmware comunica al driver se il comando e’ andato
a buon fine o ne comunica lo stato di errore.
Questa tipologia di interazione permetterebbe di ottenere dei risultati validi.
Controllando nel driver dell’rtl8187 sappiamo che una sezione dedicata ai
comandi non e’ presente. Sono state fatte delle supposizioni riguardo a questa stranezza, la piu’ plausibile riguarda lo spazio lasciato libero all’interno del
pacchetto. Gli sviluppatori del driver1 ci hanno comunicato che nell’URB2
oltre alla dimensione del pacchetto e’ necessario lasciare un ulteriore spazio
libero, ma le motivazioni non sono note nemmeno a loro. La nostra supposizione consiste nell’esistenza di un ulteriore livello tra USB e firmware. Lo
scopo ipotizzato di quest’ulteriore layer e’ il dialogo con il firmware tramite i
comandi necessari. E’ da notare che il chipset da noi preso in considerazione
1
Andrea Merello, studente dell’universita’ di Genova. E’ nel team di sviluppo del driver,
estremamente disponibile, ha fornito importanti delucidazioni in alcuni punti del codice.
2
USB Request Block, pacchetto utilizzato nell’interazione con l’USB layer
35
36
2. Obiettivi e sperimentazione
e’ montato solamente su supporti USB, quindi dovendo tenere presente l’ulteriore incapsulamento aggiunto dal protocollo USB e’ possibile che l’approccio
a comandi sia stato scartato a priori.
Il protocollo USB crea un vero e proprio livello di astrazione ulteriore tra
i device e i relativi driver, per questo si e’ accantonata l’idea dell’utilizzo di
un device USB salvo ulteriori sviluppi.
IPW3945 La ricerca si e’ spostata su una scheda Mini PCI con chipset
Intel ipw3945. I driver esterni al kernel (gli ipw3945) sono basati sul vecchio
stack di rete, per questo una volta divenuti stabili i nuovi iwl3945 (basati sul
nuovo stack) il passaggio e’ stato rapido.
La disponibilita’ di informazioni e l’evoluzione dello stack di rete (Febbraio 2008) ha reso possibile tracciare i dati sensibili all’interno del kernel e
rendere realta’ la migrazione del nostro studio a livelli di astrazione superiori.
ZD1201 Grazie ai progressi e all’indipendenza delle modifiche effettuate
dai driver, l’ultimo device sperimentato e’ un usb basato su chipset Zydas
zd1201. Anche in questo caso esistevano dei driver esterni basati sul vecchio
stack di rete e dei nuovi interni integrati col nuovo stack ieee80211.
L’utilizzo di questa WNIC USB ha permesso di ottenere un giusto compromesso tra informazioni filtrate dal driver e necessita’ iniziale di utilizzare un dispositivo USB. Infatti il driver maschera l’informazione relativa al
retry count rendendo piu’ complicato il bilanciamento di carico o la decisione
di spedire i datagram usando un’interfaccia piuttosto che un altra; fornisce
comunque le informazioni riguardandi l’acknowledgrment ricevuto e quindi
permette l’interattivita’ legata al fusso di dati.
Ulteriori sviluppi (Maggio-Giugno 2008) hanno visto l’uscita del kernel
2.6.25 e 2.6.26 verso i quali migrano il codice e gli sforzi di sviluppo, l’arrivo
di nuovi driver wireless e un generale consolidamento dello stack wireless
nella sua interezza.
Capitolo 3
Parte tecnica
Nelle decisioni prese durante lo studio e la progettazione di questo lavoro si e’ tenuto conto di un fattore determinante: per rendere compatibile
il nostro meccanismo con la moltitudine di schede wireless in commercio,
si e’ evitato di effettuare modifiche al driver, inserendo il nostro codice all’interno dello stack di rete. In questo modo, utilizzando hardware wireless
differenti e quindi avendo driver diversi, il nostro lavoro riesce a funzionare
correttamente, senza dover percio’ effettuare modifiche caso per caso.
N.B.: Nella figura che segue solo nelle funzioni in blu ci sono state modifiche; in verde sono riportati brevi commenti sulle funzioni in questione.
37
38
3. Parte tecnica
Figura 3.1: Panoramica meccanismo cross-layer
3.1 Intel PRO/Wireless 3945ABG
3.1
Intel PRO/Wireless 3945ABG
Pur avendo effettuato modifiche solo allo stack di rete, per poter giustificare le nostre scelte e per comprenderne i motivi occorre prima descrivere
il funzionamento di uno dei driver delle schede wireless in commercio. Per
questo studio sono state prese in considerazione le schede PCI Express, in
particolare l’hardware utilizzato per questo lavoro e’ la Intel PRO/Wireless
3945ABG.
3.1.1
Analisi driver iwl3945
In passato, con il vecchio stack di rete, il driver di questa scheda era
l’ipw3945, esterno al kernel. Oggi pero’ le modifiche dello stack all’interno
del kernel di linux hanno portato ad un passaggio dai driver ipw agli iwlwifi
(integrati nel kernel).
Per rimanere al passo con i developer percio’ la scelta del driver da utilizzare
e’ ricaduta su iwl3945, driver che attualmente si trova all’interno del kernel
di linux da noi utilizzato (versione 2.6.25.6).
Incontro tra firmware e driver Nel file iwl3945-base.c, la funzione
iwl irq tasklet e’ stata identificata come il punto piu’ vicino al firmware ma
ancora all’interno del driver, in cui e’ possibile l’intercettazione dei pacchetti.
In questo punto e’ infatti possibile discriminare se il pacchetto in transito
sia in ricezione o in trasmissione tramite la variabile inta fh, su cui viene
memorizzato il valore di un registro del CSR. Se inta fh vale 0x0 allora
siamo in trasmissione, nel caso sia 0x10000 siamo in ricezione e tutti gli altri
valori rappresentano vari stati dei registri e del masterbus.
Nel corpo di questa funzione compaiono delle code in ricezione e in trasmissione contenenti informazioni sui pacchetti inviati e ricevuti. Per la precisione, lato ricezione e’ presente una sola coda, mentre sono ben 6 quelle
riguardanti la trasmissione. Quest’ultimo particolare impedisce un controllo diretto dei pacchetti inviati per il raggiungimento del nostro obiettivo,
39
40
3. Parte tecnica
perche’ occorre tenere presente che in questo punto le informazioni necessarie per discriminare la coda utilizzata dalle altre in un preciso istante per
un determinato pacchetto sono nascoste.
Ricezione e trasmissione Per evitare ambiguita’, in futuro, si parlera’
di ricezione quando la scheda wireless riceve frame dalla rete, indipendentemente che questi siano dati, ack o frame di management, mentre si parlera’
di trasmissione quando l’applicazione invia dati sulla rete.
Comportamento lato ricezione
N.B. Se non specificato diversamente, i file di cui si parla per individuare
l’implementazione di una funzione sono in drivers/net/wireless/iwlwifi. Il
punto di partenza per avere una corretta e completa panoramica del comportamento lato ricezione del driver e della parte di stack di rete riguardante
l’IEEE802.11 che dialoga con esso consiste nello studio delle funzioni contenute nel file iwl3945-base.c.
Piu’ precisamente occorre partire dalla
seguente funzione:
iwl pci probe Funzione che inizializza molti parametri collegati con il livello fisico, come il livello di rumore del segnale, la potenza del segnale stesso
(ecc.) che per il raggiungimento del nostro obiettivo non sono rilevanti. Al
contrario risultano essere importanti due strutture, iwl priv e ieee80211 hw,
che vengono inizializzate proprio in questo punto e che vengono utilizzate i
svariati punti poiche’ contengono una notevole quantita’ di informazioni sul
livello fisico, sullo stato della comunicazione...
Sono riportati solamente alcuni campi, per la definizione completa vedere
drivers/net/wireless/iwlwifi/iwl-priv.h
1
struct iwl priv {
/∗ i e e e d e v i c e used by g e n e r i c i e e e p r o c e s s i n g code ∗/
3
s t r u c t i e e e 8 0 2 1 1 h w ∗hw ;
struct ieee80211 channel ∗ ieee channels ;
3.1 Intel PRO/Wireless 3945ABG
struct ieee80211 rate ∗ ieee rates ;
5
/∗ temporary frame s t o r a g e l i s t ∗/
struct list head free frames ;
7
int frames count ;
u8 phymode ;
9
int alloc rxb skb ;
v o i d (∗ r x h a n d l e r s [REPLY MAX] ) ( s t r u c t i w l p r i v ∗ p r i v ,
11
s t r u c t i w l r x m e m b u f f e r ∗ rxb ) ;
c o n s t s t r u c t ieee80211 hw mode ∗modes ;
13
/∗ p c i hardware a d d r e s s s u p p o r t ∗/
void
15
iomem ∗ hw base ;
/∗ Rx and Tx DMA p r o c e s s i n g queues ∗/
s t r u c t i w l r x q u e u e rxq ;
17
s t r u c t i w l t x q u e u e txq [IWL MAX NUM QUEUES ] ;
unsigned long s t a t u s ;
19
u32 c o n f i g ;
21
int l a s t r x r s s i ;
/∗ From Rx p a c k e t s t a t i s i t i c s ∗/
int last rx noise ;
/∗ From beacon s t a t i s t i c s ∗/
struct tasklet struct irq tasklet ;
23
};
In include/net/mac80211.h e’ possibile trovare la seguente definizione.
s t r u c t ieee80211 hw {
2
struct ieee80211 conf conf ;
s t r u c t wiphy ∗ wiphy ;
4
s t r u c t w o r k q u e u e s t r u c t ∗ workqueue ;
c o n s t c har ∗ r a t e c o n t r o l a l g o r i t h m ;
6
void ∗ priv ;
u32 f l a g s ;
8
unsigned i n t extra tx headroom ;
int channel change time ;
10
u8 queues ;
41
42
3. Parte tecnica
s8 m a x r s s i ;
s8 m a x s i g n a l ;
12
s8 max noise ;
14
};
Inizialmente viene creata una ieee80211 hw mediante l’invocazione di
ieee80211 alloc hw.
ieee80211 alloc hw Funzione definita in net/mac80211/ieee80211.c,
inizializza alcuni campi necessari per la gestione a livello fisico della comunicazione e alloca spazio per la struttura ieee80211 hw, associandole dei gestori
per svariati eventi, sia in trasmissione che in ricezione. Tra gli altri, i piu’ importanti (per il nostro scopo) sono rx handlers e tx handlers. Questi
campi non sono presenti direttamente nella struttura ieee80211 hw, ma lo
sono in un’altra struttura associate ad essa, molto importante ed usata molto
frequentemente perche’ contenente moltissime informazioni necessarie per il
funzionamento della comunicazione, ieee80211 local.
In net/mac80211/ieee80211 i.h e’ possibile trovare la definizione completa.
struct ieee80211 local {
2
/∗ embed t he d r i v e r v i s i b l e p a r t . ∗ /
s t r u c t i e e e 8 0 2 1 1 h w hw ;
4
c o n s t s t r u c t i e e e 8 0 2 1 1 o p s ∗ ops ;
s t r u c t n e t d e v i c e ∗mdev ;
6
struct tasklet struct tasklet ;
s t r u c t s k b u f f h e a d skb queue ;
8
struct sk buff head skb queue unreliable ;
u n s i g n e d l o n g s t a t e [NUM TX DATA QUEUES ] ;
10
struct ieee80211 tx stored packet
p e n d i n g p a c k e t [NUM TX DATA QUEUES ] ;
12
struct tasklet struct tx pending tasklet ;
i n t s h o r t r e t r y l i m i t ; /∗ d o t 1 1 S h o r t R e t r y L i m i t ∗/
3.1 Intel PRO/Wireless 3945ABG
i n t l o n g r e t r y l i m i t ; /∗ dot11LongRetryLimit ∗/
14
ieee80211 rx handler ∗ rx pre handlers ;
ieee80211 rx handler ∗ rx handlers ;
16
ieee80211 tx handler ∗ tx handlers ;
/∗ dot11CountersTable ∗/
18
u32 dot11TransmittedFragmentCount ;
u32 dot11MulticastTransmittedFrameCount ;
20
u32 dot11FailedCount ;
u32 dot11RetryCount ;
22
u32 d o t1 1Mu ltip l eRetryCo un t ;
u32 dot11FrameDuplicateCount ;
24
u32 dot11ReceivedFragmentCount ;
u32 dot11MulticastReceivedFrameCount ;
26
u32 dot11TransmittedFrameCount ;
u32 dot11WEPUndecryptableCount ;
28
};
Ottenuta un’ieee80211 hw, si ricava l’iwl priv direttamente dal suo campo
priv. Da notare che questo e’ uno dei punti di comunicazione tra il livello
ieee80211 (ieee80211 hw), implementato nel kernel, e il nostro driver specifico
(iwl3945). Utilizzando il campo priv (puntatore a void) dell’ieee80211 hw lo
stack puo’ comunicare con il livello sottostante indipendentemente dal driver
presente; e’ quest’ultimo che salvera’ su priv la struttura specifica del driver
(iwl priv).
iwl rx handle Definita in iwl3945-base.c questa funzione, invocata da
iwl irq tasklet quando si riceve un frame, seleziona il gestore corretto per
l’evento che ha scatenato la sua invocazione. Per poter capire meglio come
si comporta occorre conoscere due elementi molto importanti del driver, la
gestione tramite comandi e le code in trasmissione e ricezione.
43
44
3. Parte tecnica
Utilizzo dei comandi Per la comunicazione tra driver e livello fisico
viene utilizzata un’apposita struttura, l’iwl cmd, che puo’ essere utilizzata
tramite il campo cmd sia in ricezione che in trasmissione.
1
s t r u c t iwl cmd {
s t r u c t iwl cmd meta meta ;
s t r u c t i w l c m d h e a d e r hdr ;
3
union {
u32 f l a g s ;
5
s t r u c t i w l t x c m d tx ;
s t r u c t iwl rxon time cmd rxon time ;
7
struct iwl rxon assoc cmd rxon assoc ;
u8 payload [ 3 6 0 ] ;
9
}
11
attribute
}
attribute
( ( packed ) ) cmd ;
( ( packed ) ) ;
Ad ogni evento il driver associa uno specifico comando, al cui interno sono
contenute le informazione necessarie per la corretta gestione dell’evento. I
campi che ci riguardano sono cmd e hdr.
1
s t r u c t iwl cmd header {
u8 cmd ;
u8 f l a g s ;
3
5
7
/∗
0:7
index in f i f o
∗
8:13
fifo selection
∗ 14:14
b i t i n d i c a t i n g i f t h i s packet r e f e r e n c e s the
∗
’ e x t r a ’ s t o r a g e a t th e end o f t h e memory queue
∗ 15:15
(Rx i n d i c a t i o n )
∗/
9
l e 1 6 sequence ;
11
}
attribute
( ( packed ) ) ;
I possibili comandi dell’iwl sono definiti in iwlwifi/iwl-commands.h, di
seguito la parte relativa alla scheda in esame:
3.1 Intel PRO/Wireless 3945ABG
REPLY ALIVE
45
0x1
REPLY ERROR 0x2
Comandi RXON e QOS
REPLY RXON
0x10
REPLY RXON ASSOC
0x11
REPLY QOS PARAM
0x13
REPLY RXON TIMING
0x14
Supporto Multi-Station
REPLY ADD STA
0x18
REPLY REMOVE STA
0x19
not used
REPLY REMOVE ALL STA 0x1a
not used
RX, TX, LEDs
REPLY 3945 RX
0x1b
REPLY TX
0x1c
REPLY RATE SCALE
0x47
REPLY LEDS CMD
0x48
REPLY TX LINK QUALITY CMD
0x4e
3945 only
3945 only
4965 only
Comandi relativi 802.11h
RADAR NOTIFICATION
0x70
not used
REPLY QUIET CMD
0x71
not used
REPLY CHANNEL SWITCH
0x72
CHANNEL SWITCH NOTIFICATION
0x73
REPLY SPECTRUM MEASUREMENT CMD
0x74
SPECTRUM MEASURE NOTIFICATION
0x75
Power Management
POWER TABLE CMD
0x77
PM SLEEP NOTIFICATION
0x7A
PM DEBUG STATISTIC NOTIFIC
0x7B
46
3. Parte tecnica
Notifiche e comandi relativi alla scansione della rete
REPLY SCAN CMD
0x80
REPLY SCAN ABORT CMD
0x81
SCAN START NOTIFICATION
0x82
SCAN RESULTS NOTIFICATION
0x83
SCAN COMPLETE NOTIFICATION
0x84
Comandi IBSS/AP
BEACON NOTIFICATION
0x90
REPLY TX BEACON
0x91
WHO IS AWAKE NOTIFICATION
0x94
not used
Comandi vari
QUIET NOTIFICATION
0x96
REPLY TX PWR TABLE CMD
0x97
MEASURE ABORT NOTIFICATION
0x99
not used
not used
Configurazione BT
REPLY BT CONFIG
0x9b
Notifiche e comandi RF-KILL
REPLY CARD STATE CMD
0xa0
CARD STATE NOTIFICATION
0xa1
Notifiche Beacon persi
MISSED BEACONS NOTIFICATION
0xa2
REPLY MAX
0xff
Tabella 3.1: Comandi iwl
3.1 Intel PRO/Wireless 3945ABG
Code in trasmissione e ricezione Attraverso la struttura iwl priv
si possono ottenere i frame inviati e ricevuti, grazie alla presenza dei campi
iwl rx queue e iwl tx queue. In queste code vengono memorizzati i riferimenti
ai frame di cui il driver deve ancora analizzare le informazioni: l’iwl rx queue
viene utilizzata per ottenere i frame ricevuti. iwl tx queue invece ha una
struttura un po’ diversa, perche’ attraverso queste code viene fatta un’associazione tra i frame da inviare e i comandi corrispondenti. Quando occorre
trasmettere un frame, questo viene memorizzato su una delle varie code
iwl tx queue, al cui interno verra’ memorizzato il comando con cui, come
sara’ spiegato successivamente, si riuscira’ a riottenere le informazioni sul
frame nel momento in cui si ricevera’ l’ack.
1
struct iwl tx queue {
struct iwl queue q ;
s t r u c t i w l t f d f r a m e ∗bd ;
3
s t r u c t iwl cmd ∗cmd ;
s t r u c t i w l t x i n f o ∗ txb ;
5
}
La funzione iwl rx handle scorre le varie code di ricezione presenti nell’iwl priv, da cui estrae un skb (socket buffer), struttura che viene utilizzata
per il trasferimento dei dati da inviare e dei dati accessori tra i vari livelli
gerarchici. Occorre tener presente che, mentre in passato un skb conteneva
direttamente in modo esplicito gli header dei vari protocolli di comunicazione,
ad oggi, con le piu’ recenti versioni del kernel di linux, cio’ non e’ piu’ vero.
Infatti nei nuovi kernel all’interno di un skb e’ presente un puntatore all’header corrispondente allo stadio in cui e’ attualmente il pacchetto e che viene
spostato man mano che si va da un protocollo di comunicazioni all’altro. Dal
campo data di questo skb si ottiene un iwl rx packet, una struttura contenente un campo con l’header del comando e una union in cui vengono salvate
le informazioni vere e proprie ottenute dal livello fisico. A questo punto, in
base al tipo di comando associato all’iwl rx packet viene invocato il gestore
adatto. Nel nostro caso, siamo interessati a sapere quando riceviamo un ack
47
48
3. Parte tecnica
di un nostro frame: nel momento in cui ci si imbatte nel comando REPLY TX
significa che e’ stato ricevuto un ack; in questo caso il gestore che viene invocato e’ iwl rx reply tx. Inoltre, sempre in questo caso, viene invocata la
funzione iwl tx cmd complete (che verra’ discussa a breve).
iwl rx reply tx Definita in iwl3945-base.c gestisce la ricezione degli ack.
Da un skb, lo stesso socket buffer associato al comando REPLY TX (vedi
funzione iwl rx handle), estrae secondo le modalita’ gia’ descritte in precedenza un iwl rx packet e di seguito l’header del comando corrispondente.
Da quest’ultimo vengono estratti due indici, txq id e index. Il primo indica la coda in trasmissione su cui e’ salvato il frame che e’ stato appena
acked; il secondo e’ un indice interno alla coda che verra’ utilizzato nella funzione iwl tx queue reclaim. Dalla coda in trasmissione (iwl tx queue)
contenuta nell’iwl priv e indicata dal txq id, si ottiene la seguente struttura
(sono riportati solamente i campi di nostro interesse):
struct ieee80211 tx status {
struct ieee80211 tx control control ;
2
u8 f l a g s ;
bool e x c e s s i v e r e t r i e s ;
4
u8 r e t r y c o u n t ;
int ack signal ;
6
}
Su questa struttura vengono salvate informazioni molto importanti sul
frame inviato, ottenute dall’iwl tx resp contenuto nell’iwl rx packet di prima.
Proprio questo e’ il punto piu’ a basso livello in cui si e’ in grado di sapere
se un frame inviato e’ acked oppure no. Infatti dall’iwl rx packet di prima e’
possibile ricavare il retry count del frame inviato e soprattutto il campo che
indica se l’ack e’ stato ricevuto: questo campo (status) e’ costituito da 32
bit e l’informazione a noi necessaria e’ contenuta nel bit meno significativo
(se messo ad 1 significa che il frame e’ acked). Quest’ultimo dato in particolare viene memorizzato nel campo flags della struttura iee80211 tx status.
3.1 Intel PRO/Wireless 3945ABG
Gli altri campi dell’ieee80211 tx status vengono impostati in questo punto,
sempre con le informazioni ottenibili tramite l’iwl rx packet.
1
t x s t a t u s −>r e t r y c o u n t = t x r e s p −>f a i l u r e f r a m e ;
t x s t a t u s −>queue number = s t a t u s ;
3
t x s t a t u s −>q u e u e l e n g t h = t x r e s p −>b t k i l l c o u n t ;
t x s t a t u s −>q u e u e l e n g t h |= t x r e s p −>f a i l u r e r t s ;
5
t x s t a t u s −>f l a g s = i w l i s t x s u c c e s s ( s t a t u s ) ?
IEEE80211 TX STATUS ACK : 0 ;
Prima di terminare, la funzione invoca iwl tx queue reclaim(che verra’ analizzata in seguito)
iwl tx cmd complete Definita in iwl3945-base.c viene utilizzata per liberare i buffer che non vengono piu’ utilizzati. Come gia’ spiegato in precedenza estrae dall’iwl rx packet presente nel campo data dello skb gli indici
per individuare le informazioni sul comando relativo al frame appena acked.
Come in iwl rx reply tx, viene invocata la funzione iwl tx queue reclaim.
iwl tx queue reclaim Definita in iwl3945-base.c viene utilizzata per liberare le code in trasmissione che contengono i frame per i quali l’ack e’
gia stato ricevuto e quelli per i quali, invece, data la scadenza dei timeout, non lo riceveremo mai. Le code contenenti le informazioni su questi
frame, prima di venir deallocate, vengono passate come parametro alla funzione iwl txstatus to ieee. Quando tutte le code non utilizzate sono state
liberate, viene verificata la disponibilita’ dello spazio minimo necessario per
sbloccare la trasmissione di frame in attesa.
iwl txstatus to ieee Definita in iwl3945-base.c esegue solamente una distinzione tra eventi scatenati da interrupt e non. Nel primo caso viene invocata
ieee80211 tx status irqsafe, nel secondo ieee80211 tx status.
ieee80211 tx status irqsafe Definita in net/mac80211/ieee80211.c, estrae dallo skb l’oggetto per cui si e’ messo in moto tutto questo meccan-
49
50
3. Parte tecnica
ismo (e’ arrivato l’ack oppure e’ scaduto il timeout), ne imposta il tipo a
IEEE80211 TX STATUS MSG e schedula ieee80211 tasklet handler.
ieee80211 tasklet handler Definita in net/mac80211/ieee80211.c, ha due
comportamenti diversi in base al motivo per cui e’ stata richiamata. Nel caso
in cui si e’ ricevuto un frame dati, allora il campo pkt type dello skb sara’
stato impostato in precedenza con il valore IEEE80211 RX MSG e la funzione
invochera’ ieee80211 rx. Ci si trova invece nel secondo caso quando si riceve
un ack oppure quando e’ scaduto il timeout in trasmissione e si considera
non acked il frame inviato. In queste due situazioni il campo pkt type dello skb viene impostato a IEEE80211 TX STATUS MSG (vedi funzione
ieee80211 tx status irqsafe) e viene invocata la funzione ieee80211 tx status.
ieee80211 tx status
Quando la scheda wireless riceve un ack di un frame
inviato in precedenza oppure quando scade il timeout per la ricezione di un
ack relativo ad un frame gia’ inviato, viene invocata la funzione in questione,
definita in net/mac80211/ieee80211.c. All’interno del corpo di questa funzione avviene il controllo del numero di volte che il frame e’ stato inviato
(retry count) e soprattutto la verifica del fatto che il frame sia acked oppure
no, controllando semplicemente il valore memorizzato nel campo flag della
struttura ieee80211 tx status. Se il valore memorizzato e’ IEEE80211 TX STATUS ACK
allora significa che si e’ ricevuto l’ack, altrimenti si considera perso il frame inviato. Si rammenta che, come gia’ detto sopra, questo campo viene impostato
nel corpo della funzione iwl rx reply tx.
ieee80211 rx Definita in net/mac80211/rx.c viene invocata quando si
riceve un frame dati. Visto che non viene coinvolta quando si riceve un ack,
non e’ necessario conoscere in dettaglio il suo comportamento. Si sappia
solamente che gestisce la ricezione dei frame data e managment, invocando
gli opportuni gestori.
3.1 Intel PRO/Wireless 3945ABG
Comportamento lato trasmissione
Lato trasmissione sono riportate solamente le funzioni piu’ rilevanti dal
punto di vista del nostro lavoro, presenti all’interno del driver e nella parte di
stack di rete che implementa l’IEEE802.11. Per quello che riguarda la parte
controllata dal driver, le due funzioni principali sono le seguenti, il cui corpo
si puo’ trovare nel file iwl3945-base.c
iwl mac tx Lato trasmissione, il punto di passaggio tra lo stack e il driver
avviene tramite l’invocazione da parte del primo della funzione iwl mac tx.
Questa, fatti alcuni controlli trascurabili (per quello che ci riguarda) invoca
iwl tx skb.
iwl tx skb In questa funzione viene associato al frame da inviare il comando REPLY TX che poi, come gia’ detto, servira’ lato ricezione per sapere
se e’ stato ricevuto l’ack. iwl tx skb si occupa anche di impostare correttamente il valore del campo sequence dell’header del comando, inserendoci
gli indici della coda in trasmissione utilizzata per il frame e la sua posizione
all’interno della coda (questi valori saranno poi utilizzati lato ricezione per
l’associazione tra il comando e il frame inviato, come spiegato nella funzione
iwl rx reply tx ). Altra cosa rilevante fatta dalla funzione e’ la sistemazione
dello skb contenente il frame e del suo header, come i campi len, flag...
Per quello che riguarda la parte di kernel che implementa il protocollo
IEEE802.11, le funzioni che destano interesse per il raggiungimento del nostro
obiettivo sono le seguenti:
ieee80211 tx Definita in net/mac80211/tx.c, viene invocata ogni qualvolta ci sia un frame da inviare. In particolare, per poter inviare il frame la
funzione richiama i gestori presenti in local->tx handler. In questo campo,
all’interno di ieee80211 alloc hw, vengono memorizzate le seguenti funzioni:
51
52
3. Parte tecnica
ieee80211 tx handler ieee80211 tx handlers [ ] = {
ieee80211 tx h check assoc ,
2
ieee80211 tx h sequence ,
ieee80211 tx h ps buf ,
4
ieee80211 tx h select key ,
ieee80211 tx h michael mic add ,
6
ieee80211 tx h fragment ,
ieee80211 tx h encrypt ,
8
ieee80211 tx h rate ctrl ,
ieee80211 tx h misc ,
10
ieee80211 tx h load stats ,
NULL
12
};
ieee80211 tx h sequence Questa funzione, presente tra i gestori in trasmissione, viene definita in net/mac80211/tx.c e viene invocata ogni volta che
occorre inviare un frame per poterne incrementare il sequence number.
3.2
Internet Protocol
Una volta ottenuta l’associazione tra acknowledgement e i frame IEEE802.11
trasmessi, occorre riuscire ad associare il frame in questione con il pacchetto
ip che trasporta (o con il frammento di pacchetto ip nel caso ci sia frammentazione). Essendo il futuro legato all’IPv6 e’ necessario dedicarsi a questo
protocollo, anche se, per i motivi che verranno descritti in questa sezione, il
nostro lavoro sfrutta il suo predecessore, l’IPv4.
A livello IP i problemi da risolvere sono due: il primo, come gia’ detto, e’ associare il datagram ip al frame IEEE802.11, il secondo invece consiste nell’ottenere, a partire da un pacchetto udp, le informazioni desiderate
sul datagram ip che lo racchiude, in modo tale da poter collegare il frame
IEEE802.11 con il pacchetto udp. Per risolvere la seconda problematica, e’
3.2 Internet Protocol
stato utilizzato il seguente escamotage: nel punto in cui si estraggono le informazioni sul datagram ip, vengono estratte anche quelle collegate al pacchetto
udp. All’applicazioni vengono poi passati i dati desiderati sul flusso udp con
la granularita’ dei datagram ip (ad ogni datagram ip vengono trasmesse le
informazioni). Risolvendo, come verra’ spiegato successivamente, l’associazione tra i frame 80211 e i datagram ip, possiamo in questo modo collegare
i pacchetti udp con i singoli frame, come desiderato.
3.2.1
UDP over IPv6
Utilizzando questo protocollo l’associazione tra frame IEEE802.11 e datagram IP trova un grande ostacolo. Nel passaggio tra IPv4 e IPv6 vi sono state
molte modifiche, sia per quello che riguarda i campi dati che l’header. Proprio in quest’ultimo vi e’ stato il cambiamento che ci ha fatto abbandonare
l’IPv6: nel suo header e’ stato tolto il campo ID presente invece nell’IPv4.
Figura 3.2: Struttura IPv6 Header
Percio’, non sapendo come poter identificare un pacchetto IPv6, la nostra
53
54
3. Parte tecnica
applicazione, almeno per il momento, utilizza l’IPv4. La risoluzione dell’associazione tra pacchetti UDP, IPv6 e frame IEEE802.11 viene lasciata a future
modifiche dell’applicazione.
3.2.2
UDP over IPv4
Nel kernel buona parte delle funzioni relative all’IPv4 si trovano in /net/ipv4.
Una spiegazione dettagliata delle funzioni utili per questo lavoro verra’ riportata successivamente, quando verranno presenta le nostre modifiche
effettuate a queste funzioni.
L’idea base per associare un pacchetto ip con il o i frame IEEE802.11 che
lo trasportano e’ di sfruttare gli id presenti nei due header, che forniscono
un’appiglio naturale per identificare i due oggetti e per collegarli tra di loro.
Capitolo 4
Realizzazione-Implementazione
4.1
Funzionamento dell’applicazione
4.1.1
Spiegazione generale
Lato trasmissione, ogni volta che viene inviato un datagram ip, all’utente
che l’ha inviato viene comunicato il suo identificativo. All’interno dell’applicazione, quando si e’ passati al livello IEEE802.11 e l’header di questo
protocollo e’ stato inserito nel pacchetto, ma prima che questo venga crittato (nel caso ci sia crittazione) vengono estratte da quest’ultimo le seguenti
informazioni:
• id datagram ip
• porta sorgente
• campo more fragment dell’header IEEE802.11 (indica se al frame in
questione ne seguono altri che portano al loro interno frammenti dello
stesso pacchetto ip)
• id frame IEEE802.11 (servira’ come identificativo dei dati estratti)
Una volta ottenute, queste informazioni vengono memorizzate in un’apposita struttura. Quando in ricezione viene eseguito il corpo della funzione
55
56
4. Realizzazione-Implementazione
ieee80211 tx status, come gia’ detto in precedenza, puo’ voler dire che e’
stato ricevuto l’ack di un frame inviato oppure che, a causa della scadenza
dei timeout, il frame inviato deve essere considerato non ricevuto dall’access
point. All’interno di questa funzione vengono estratte le informazioni sull’ack inviato dall’access point, il retry count, il filtered count e l’id del frame
IEEE802.11 inviato. Proprio tramite a questo identificativo si collegano le
informazioni ottenute in ricezione con i dati estratti in trasmissione di cui si
e’ parlato in precedenza. In questo modo si riesce a stabilire se un determinato datagram ip (e quindi pacchetto udp) ha ricevuto l’ack dall’access point
oppure no, piu’ altre informazioni di corredo come il retry count.
4.1.2
Approfondimento: lato trasmissione
Livello udp-ip
Lato trasmissione, il pacchetto udp viene identificato mediante il datagram ip che lo trasporta, utilizzando il suo id. Questo, che viene memorizzato in 16 bit dell’header ip, viene configurato dalla funzione ip select ident,
definita in include/net/ip.h. Questa si comporta in tre modi diversi: se la
frammentazione dei datagram non e’ prevista, nel caso in cui sia impostato il campo daddr (indirizzo destinazione) del socket utilizzato per la comunicazione, l’id viene incrementato direttamente, altrimenti viene messo
a 0. Nel caso in cui invece ci sia la frammentazione attiva, viene invocata
ip select ident. Questa funzione, definita in net/ipv4/route.c, a sua volta si
occupera’ di impostare adeguatamente l’identificativo del datagram ip. Abbiamo osservato pero’ che l’id viene di norma messo a 0 da ip select ident.
Quindi, per poter fare l’associazione datagram ip con i dati raccolti dalla
nostra applicazione e’ stata modificata la funzione in questione nel seguente
modo: nel punto in cui originariamente l’id veniva impostato a 0, e’ stata
inserita l’invocazione della funzione
ip select ident. In questo modo l’id del
datagram ip viene sempre impostato ad un valore univoco, rendendo possibile l’associazione tra frame IEEE802.11 e pacchetto ip tramite i relativi
4.1 Funzionamento dell’applicazione
57
identificativi.
A livello udp e’ stata modificata la funzione udp push pending frames
definita in /net/ipv4/udp.c, che viene richiamata da udp sendpage quando
si vuole trasmettere un flusso di dati (con udp).
Questa crea una variabile
be16 ipdgramid, nella quale verra’ successiva-
mente mantenuta l’informazione sull’id del datagram ip. Oltre a questo la
funzione invoca udp push pending frames get ipdgramid passandole l’indirizzo di ipdgramid. In questo punto e’ stato spostato il corpo originario di
udp push pending frames, con l’aggiunta di questa riga di codice:
err = ip_push_pending_frames_get_ipdgramid( sk, p_ipdgramid );
dove err sara’ il valore di ritorno della funzione.
Questa funzione, definita in net/ipv4/ip output.c, combina i vari frammenti ip presenti nel socket, li accorpa in un unico datagram ip, sistemando anche i vari campi del skb e dell’header ip e li inoltra verso i livelli successivi per la loro trasmissione (lo stesso comportamento che aveva
ip push pending frame,
la
quale
ora
invoca
solamente
ip push pending frame get ipdgramid). Inoltre all’interno della funzione avviene il salvataggio dell’id del datagram ip nella nostra variabile ipdgramid,
dopo l’invocazione di ip select ident.
Un’altra funzione modificata (sempre in udp.c) e’ udp sendmsg, la quale ora
si comporta come udp push pending frames.
IEEE802.11
Nella parte di kernel che implementa questo protocollo ci sono state le
modifiche piu’ sostanziali. Prima pero’ di parlarne e’ meglio introdurre le
strutture utilizzate per la raccolta e la gestione dei dati.
rtlkill info Per memorizzare le informazioni estratte dai frame trasmessi in
attesa di aver una risposta affermativa o negativa riguardo l’ack, e’ stata utilizzata una lista di rtlkill info, una struttura introdotta da noi in ieee80211.c
e definita come segue:
58
1
4. Realizzazione-Implementazione
struct r t l k i l l i n f o {
l e 1 6 i d ; /∗ s e q u e n c e i d frame 8 0 2 . 1 1 ∗/
s t r u c t packet datagram info ;
3
s t r u c t timespec tx time ;
s t r u c t timespec rx time ;
5
s t r u c t r t l k i l l i n f o ∗ next ;
7
};
• Il campo id viene utilizzato per distinguere tra loro i vari rtlkill info e
consiste nel sequence number dei frame IEEE802.11.
• Il campo datagram info e’ di tipo packet, struttura inserita da noi e
definita in ieee80211.c. La descrizione e’ riportata a seguito di questo
elenco.
• Il campo tx time viene utilizzato per memorizzare il tempo di sistema
nel momento in cui il frame viene inviato (viene memorizzato questo
valore quando vengono estratte le altre informazioni dagli header ip e
udp).
• Il campo rx time viene utilizzato per memorizzare il tempo di sistema
nel momento in cui e’ possibile sapere se il frame e’ acked oppure no
(coincide con l’esecuzione del corpo della funzione ieee80211 tx status).
• Il campo next e’ il puntatore al prossimo rtlkill info (e’ uguale a NULL
nel caso quest’ultimo non ci sia).
N.B. I campi tx time e rx time sono utilizzati solamente per uno scopo
statistico sulle tempistiche.
1
s t r u c t packet {
u8 acked ; /∗ acked , not acked , no ack r e q u e s t e d
3
o r ack f i l t e r e d ∗/
u8 r e t r y c o u n t ; /∗ r e t r y c o u n t e r ∗/
5
u n s i g n e d l o n g f i l t e r e d c o u n t ; /∗number o f t i m e s
4.1 Funzionamento dell’applicazione
59
t h e frame has
been f i l t e r e d ∗/
7
u8 fragment ; /∗ 0 i f th e l a s t fragment ,
1 o t h e r w i s e ∗/
9
b e 1 6 i p i d ; /∗ i p p a c k e t i d ∗/
b e 1 6 u d p p o r t ; /∗ s o u r c e udp p o r t ∗/
11
};
La lista di rtlkill info e’ organizzata in questo modo: ogni elemento nella
lista mantiene, come gia’ detto, un puntatore al successivo. Il primo elemento della lista viene raggiunto tramite il campo next della sentinella, un
rtlkill info definito come segue:
static struct r t l k i l l i n f o sentinel =
2
{0 ,
{0 ,0 ,0 ,0 ,0 ,0} ,
4
{0 ,0} ,
{0 ,0} ,
6
NULL}
In questo modo la sentinella rimane in memoria costantemente; di questo
rtlkill info viene utilizzato solamente il campo next per individuare il primo
rtlkill info contenente informazioni sui frame inviati.
Assieme alla definizione di queste strutture sono state inserite funzioni
accessorie che agiscono sulle code di rtlkill info:
struct r t l k i l l i n f o ∗ r t l k i l l i n f o s e a r c h (
2
l e 1 6 id ) ;
void r t l k i l l i n f o a d d ( s t r u c t r t l k i l l i n f o ∗ p a c k e t i n f o ) ;
void r t l k i l l i n f o r e m o v e ( s t r u c t r t l k i l l i n f o ∗ p a c k e t i n f o ) ;
Terminata l’introduzione sulle strutture inserite, ora e’ possibile descrivere le modifiche effettuate per far funzionare correttamente l’applicazione.
ieee80211 tx h sequence In questa funzione, descritta in precedenza, e’
stata inserita l’invocazione di una nostra funzione, rtlkill extract pkt info
60
1
4. Realizzazione-Implementazione
/∗ ∗∗∗ RTLKILL ∗∗∗ ∗/
i f ( r e q u i r e d i p l o c a l e r r o r n o t i f y ( tx−>skb−>sk ) ) {
i n t r e t = r t l k i l l e x t r a c t p k t i n f o ( hdr ) ;
3
}
5
/∗ ∗∗∗ RTLKILL ∗∗∗ − end ∗/
rtlkill extract pkt info
Questa funzione ha lo scopo di analizzare il pac-
chetto che sta per essere inviato (la funzione richiede come parametro l’header
IEEE802.11).
Da questo header si ottiene il sequence number del frame IEEE802.11,
che, come gia detto in precedenza, verra’ utilizzato per associare in ricezione
le informazioni sulla trasmissione del frame al datagram ip. Nel caso in
cui il frame IEEE802.11 contenga al suo interno un pacchetto ip allora
vengono estratte dal datagram le informazioni collegate ai protocolli udp
e ip mediante l’invocazione di get udp info, di cui si parla qui di seguito.
Queste informazioni, assieme al tempo di sistema ottenuto tramite CURRENT TIME vengono salvate in un rtlkill info, che verra’ aggiunto alla lista
di rtlkill info. N.B.: Viene creato un rtlkill info solamente nel caso in cui il
frame IEEE802.11 contenga al suo interno un datagram ip, che a sua volta
trasporta un pacchetto udp. In tutti gli altri casi la funzione termina senza
modificare l’ambiente.
get udp info Questa funzione analizza gli header ip e udp, estraendone le
seguenti informazioni:
• Indirizzo sorgente (header ip)
• Indirizzo destinazione (header ip)
• Porta sorgente (header udp)
• Porta destinazione (header udp)
• Identificativo datagram ip (header ip)
4.1 Funzionamento dell’applicazione
61
• Dimensione dati trasportati (header ip)
• Byte indicante la presenza di altri frammenti ip dopo quello in questione
• Offset del campo data dal primo datagram ip della sequenza
Queste informazioni vengono salvate all’interno dei parametri della funzione (sono dei puntatori), in modo tale da poter essere salvati nel rtlkill info.
4.1.3
Approfondimento: lato ricezione
ieee80211 tx status Come gia’ detto in precedenza, le informazioni necessarie per sapere se un frame ha ricevuto l’ack dall’access point si possono
trovare nel corpo della funzione ieee80211 tx status, al cui interno percio’
abbiamo inserito l’invocazione della nostra funzione rtlkill info response. La
chiamata avviene solamente se il controllo “if (required ip local error notify(sk)”
da esito positivo: questo succede quando sul socket utilizzato per la comunicazione e’ stata invocata una “recvmsg” sulla coda di errori (MSG ERRQUEUE);
per maggiori dettagli vedere la sezione “Utilizzo applicazione”, comunque per
ora basti sapere che per poter utilizzare la nostra applicazione questa recvmsg
e’ necessaria.
rtlkill info response Questa funzione estrae dall’header IEEE802.11 e dal
parametro ieee80211 tx status le informazioni sul retry count, sul fatto che
il frame inviato sia acked oppure no con le stesse modalita’ della funzione
ieee80211 tx status, descritte in precedenza nella sezione “Comportamento
lato ricezione”. Inoltre viene estratto dall’header IEEE802.11 il sequence
number del frame, utilizzato per ritrovare nella coda degli rtlkill info le informazioni memorizzate in precedenza lato trasmissione sul frame. Ottenuto
il rtlkill info corretto, si uniscono tutti i dati ottenuti, che, oltre a venir
memorizzati nel rtlkill info, vengono passati al mittente del frame tramite
l’invocazione di ip local error notify, che verra’ spiegata fra poco. Nel caso
in cui si stia facendo debug (RTLKILL DEBUG definito) viene memorizzato
62
4. Realizzazione-Implementazione
sul rtlkill info il tempo di sistema tramite CURRENT TIME e viene invocata rtlkill info take response, che non fa altro che stampare sul log di sistema
tutti i dati ottenuti. Una volta che le informazioni a cui siamo interessati
sono passate al mittente del frame, il rtlkill info diviene inutile, percio’, prima di terminare, la funzione dealloca lo spazio utilizzato per memorizzare il
rtlkill info tramite rtlkill info remove, che si occupa anche di toglierlo dalla
coda degli rtlkill info.
1
v o i d i p l o c a l e r r o r n o t i f y ( s t r u c t s o c k ∗ sk , i n t s e n t ,
3
b e 3 2 daddr ,
b e 1 6 dport ,
b e 3 2 saddr ,
be16 sport ,
b e 1 6 ipdgramid ,
u16 f r a g m e n t d a t a l e n , u16 f r a g m e n t o f f s e t ,
5
u8 more fragment ){
...
7
s e r r = SKB EXT ERR( skb ) ;
...
9
s e r r −>e e . e e e r r n o = 0 ;
/∗ s u c c e s s ∗/
s e r r −>e e . e e o r i g i n = SO EE ORIGIN LOCAL NOTIFY ;
11
s e r r −>e e . e e t y p e = s e n t ; /∗ 1 s e n t , 0 not s e n t ∗/
s e r r −>e e . e e c o d e = more fragment ; /∗ more fragment ∗/
13
s e r r −>e e . e e p a d = 0 ;
s e r r −>e e . e e i n f o = ipdgramid ;
/∗ i d datagram ∗/
15
s e r r −>e e . e e d a t a = f r a g m e n t o f f s e t +
( ( ( u32 ) f r a g m e n t d a t a l e n ) < <16);
17
s e r r −>a d d r o f f s e t = ( u8 ∗)& iph−>daddr −
s k b n e t w o r k h e a d e r ( skb ) ;
19
s e r r −>p o r t = dport ;
21
...
Tramite l’invocazione di questa funzione tutti i dati utili vengono salvati
nella memoria dei socket utilizzata per la comunicazioni di errori (questo
4.1 Funzionamento dell’applicazione
canale di comunicazione viene richiesto tramite required ip local error notify):
• sk e’ il socket utilizzato
• success e’ un intero che puo’ assumere i seguenti valori: 0 se non si e’
ricevuto l’ack del frame inviato, 1 se l’ack e’ stato ricevuto, 2 se non ci
sono state execessive retry
• indirizzo di destinazione del frame
• porta di destinazione
• indirizzo sorgente
• porta sorgente
• id del datagram ip
• lunghezza datagram
• offset datagram (nel caso un pacchetto sia stato suddiviso in piu’ datagram)
• flag utile se il pacchetto da trasmettere e’ stato suddiviso in piu’ datagram; indica se il frame e’ l’ultimo oppure se ne seguiranno altri.
Come verra’ spiegato nella sezione “Utilizzo applicazione” l’utente che
richiede il servizio della nostra applicazione dovra’ leggere sul canale d’errore
dei socket le informazioni richieste.
4.1.4
Utilizzo applicazione
L’utente che voglia utilizzare la nostra applicazione per avere informazioni
sulla ricezione da parte dell’access point dei pacchetti udp inviati deve comunicare allo stack di rete la necessita’ di monitorare i pacchetti spediti.
63
64
1
4. Realizzazione-Implementazione
i n t OptVal = 1 ;
r i s = s e t s o c k o p t ( s o c k e t f d , IPPROTO IP , IP RECVERR,
( char ∗)&OptVal , s i z e o f ( OptVal ) ) ;
3
Syscall
Per rendere funzionante l’appplicazione e’ stata introdotta una libreria
(che deve essere compilata per poter essere utilizzata) con all’interno una
nuova socket system call, sendmsg get ipdgramid.
1
#d e f i n e SYS SENDMSG GET IPDGRAMID
18;
...
3
s o c k e t c a l l ( s e n d m s g g e t i p d g r a m i d ,SENDMSG GET IPDGRAMID)
All’invocazione di questa syscall viene eseguita sys socketcall (socket.c)
la quale invoca la seguente funzione da noi scritta:
1
a s m l i n k a g e l o n g s y s s e n d m s g g e t i p d g r a m i d ( i n t fd ,
s t r u c t msghdr
3
unsigned f l a g s ,
u s e r ∗msg ,
be16 ∗ p ipdgramid ) ;
Questa, la cui definizione e’ presente in include/linux/syscall.h e il cui corpo si trova in net/socket.c, invoca sock sendmsg get ipdgramid, passandole
l’indirizzo del parametro p ipdgramid, sul quale l’utente protra’ poi leggere
l’identificativo del datagram ip. sock sendmsg get ipdgramid richiama a sua
volta sock sendmsg get ipdgramid, con le modalita’ gia’ descritte per quello che riguarda p ipdgramid. In quest’ultima, anch’essa definita all’interno
di socket.c, e’ presente la segente riga di codice:
1
r e t=sock−>ops−>s e n d m s g g e t i p d g r a m i d ( i o c b , sock , msg ,
s i z e , p ipdgramid ) ;
La variabile sock altro non e’ che il socket utilizzato per la trasmissione, mentre tramite il campo ops (di tipo proto op) si raggiunge la funzione memorizzata nel campo sendmsg get ipdgramid. Questo campo e’ stato aggiun-
4.1 Funzionamento dell’applicazione
65
to da noi in proto ops, oltre che in inet sockraw ops e inet dgram ops. In
tutti i casi la funzione che viene richiamata e’ inet sendmsg get ipdgramid,
definita in /net/ipv4/af inet, che richiama udp sendmsg get ipdgramid attraverso il campo sk prot della struttura sock presente nel socket utilizzato
per la trasmissione. Nel nostro caso, facendo traffico udp, in sk prot ci sara’
memorizzato un udp prot, struttura nel quale e’ stato aggiunto un campo
sendmsg get ipdgramid in cui viene appunto scritto il nome della funzione
udp sendmsg get ipdgramid. Quest’ultima, dopo la nostra modifica, oltre a
preparare
la
trasmissione
del
pacchetto
udp,
invoca
udp push pending frames get ipdgramid (continuando il passaggio per indirizzo di p ipdramid), la quale, coma gia’ detto nella sezione “Livello udp-ip”
invoca ip push pending frames get ipdgramid (per maggiori dettagli vedere
la sezione apposita, si rammenta solamente che attraverso questo percorso
viene memorizzato su p ipdramid l’id del pacchetto ip trasmesso).
La
syscall
in
questione
puo’
essere
richiamata
invocando
sendmsg get ipdgramid, la quale permette di sapere l’ID del pacchetto IP
spedito (quarto parametro) e se il tentativo di spedizione e’ avvenuto con
successo.
i n t r i s = s e n d m s g g e t i p d g r a m i d ( s o c k e t f d , &msgHeader ,
MSG NOSIGNAL , &i d ) ;
2
Un’altra operazione fondamentale che deve essere fatta dall’utente per
poter utilizzare l’applicazione e’ la seguente:
recvmsg ( s o c k e t f d , msg , MSG ERRQUEUE) ;
Il primo parametro e’ l’identificativo del socket che si sta utilizzando per
la comunicazione, il secondo e’ un puntatore ad un msghdr, all’interno del
quale verranno salvati i dati richiesti, mentre il terzo parametro serve per
poter fare la receive sul canale d’errore del socket.
Nel caso in cui la funzione restituisca un valore maggiore o uguale a 0 e non
siano segnalati errori, la nostra applicazioni fornisce informazioni all’utente,
che le puo’ estrarre in questo modo dalla variabile msg: mediante le funzioni
66
4. Realizzazione-Implementazione
CMSG FIRSTHDR e CMSG NXTHDR si ottengono i vari header dei dati di corredo,
detti ancillary data. In questi header ci sono informazioni sui dati, sui vari
protocolli di comunicazioni adottati ... Le vere e proprie informazioni che
ci interessano invece devono essere estratte tramite CMSG DATA, trattando il
valore di ritorno come un puntatore a sock extended err, struttura i cui campi
conterranno le nostre informazioni.
1
s t r u c t s o c k e x t e n d e d e r r ∗ ee ;
e e = ( s t r u c t s o c k e x t e n d e d e r r ∗)CMSG DATA( c ) ;
3
...
i p i d=ntohs ( ee−>e e i n f o ) ;
5
m o r e f r a g=ee−>e e c o d e ;
f r a g l e n = ( ( ( u32 ) ( ee−>e e d a t a )) > >16);
7
o f f s e t = ( ( ( ( u32 ) ( ee−>e e d a t a ))<<16)>>16);
Capitolo 5
Valutazione
Lo studio di questo meccanismo cross-layer e’ stato integrato con delle
prove pratiche in cui si e’ verificato il corretto funzionamento della nostra
applicazione in varie situazioni. Per ragioni pratiche legate alla disponibilita’,
si e’ deciso di utilizzare come hardware wireless una antenna usb zd1211rw,
chipset 1211. Avendo apportato modifiche solamente nello stack di rete,
l’applicazione e’ in grado di funzionare anche con driver diversi dall’iwl3945.
5.1
Metriche
Nelle varie prove effettuate sono stati analizzati due fattori:
• affidabilita’: e’ stato verificato che le informazioni sugli ack dei frame
inviati fossero corrette ed e’ stata inoltre osservata la completezza delle
informazioni, per conoscere in quali scenari la nostra applicazione fornisce il massimo dei dati e in quali invece viene ridotta la quantita’ di
informazioni.
• tempistiche: e’ stato analizzato il ritardo presente tra il momento in
cui un frame viene inviato e l’istante in cui si viene a conoscenza del
fatto che il pacchetto sia acked oppure no.
67
68
5. Valutazione
5.1.1
Parametri
Per avere dati completi sono state effettuate piu’ prove, variando alcuni
parametri:
• tipologia rete: i test sono stati realizzati con:
– rete non cifrata
– cifratatura WEP
– cifratura WPA express: chiave WPA-PSK, TKIP.
• traffico di background:
– assenza di traffico di background: rete in cui c’e’ solo un utente
che invia tramite access point ad un altro utente.
– con traffico di background: 10 utenti che tramite lo stesso access
point occupano la rete, facendo ping e inviandosi tra di loro dei
dati. All’incirca la quantita’ di traffico durante ogni prova e’ di
1Mbyte.
• dimensione dati inviati:
– pacchetti da 1024 byte (nessuna frammentazione)
– pacchetti da 2048 byte (con frammentazione: per trasmettere ogni
pacchetto sono necessari due frame IEEE802.11)
5.2
Scenario sperimentale
I test sono stati realizzati all’interno del dipartimento di informatica di
Bologna, in corridoio Ercolani, ambiente con aria “satura” per la presenza
di varie reti che occupano molti dei canali disponibili. Per diminuire le interferenze con gli altri utenti, le prove in assenza di cifratura e con cifratura
WEP sono state effettuate utilizzando un unico access point di nostra proprieta’, a cui si sono collegati l’utente che sfrutta la nostra applicazione, l’utente
5.3 Prove e risultati
che riceve i messaggi del primo e, in caso di test con traffico di background, le
altre dieci postazioni che inviano pacchetti nella “nostra” rete. In questo modo gli accessi alla rete utilizzate per le prove sono monitorati e sappiamo con
certezza se c’e’ presenza di traffico e in che quantita’. L’access point a nostra
disposizione supporta l’IEEE80211 di tipo b e g. Per i test con cifratura
WPA, invece, non potendo disporre di una rete privata, abbiamo utilizzato ALMAWIFISTUDIO, rete fornita dall’universita’ di Bologna a tutti gli
studenti universitari. Le differenze con le precedenti prove sono le seguenti:
• gli accessi non sono controllati, non possiamo sapere quanti utenti sono
collegati alla rete che stiamo utilizzando
• sono presenti piu’ access point di ALMAWIFISTUDIO nel luogo in cui
si sono fatte le prove
5.3
5.3.1
Prove e risultati
Esecuzione test
Rete non cifrata e con WEP
Sono state eseguite varie prove, tutte con le seguenti modalita’:
la postazione che riceveva il flusso di dati udp era posta nelle vicinanze dell’access point, mentre l’utente che creava questo flusso e che quindi utilizzava
la nostra applicazione era mobile; dalla posizione di partenza vicina all’access
point, si allontanava lentamente da quest’ultimo in modo da aumentare la
probabilita’ di perdita di pacchetti. Il test si fermava quando l’utente, allontanatosi troppo, perdeva il collegamento alla rete. Nelle prove con traffico di
background, gli utenti in aggiunta erano fissi e vicini all’access point.
Rete cifrata con WPA
A differenza dei test precedenti, qui non e’ stato possibile, per le ragioni
gia’ descritte, controllare l’accesso alla rete utilizzata, percio’ sono state es-
69
70
5. Valutazione
eguite solamente prove con traffico di background, non stimabile pero’, per
l’impossibilita’ di avere informazioni sugli utenti presenti nelle nostre vicinanze e collegati ad ALMAWIFISTUDIO, e sul loro traffico. In questi test
c’era l’utente addetto alla ricezione del flusso udp, con postazione fissa, e l’utente che utilizzava l’applicazione che, partendo da una posizione vicina ad
uno degli access point di ALMAWIFISTUDIO, si allontanava. A differenza
delle prove precedenti, queste venivano fermate dopo un certo intervallo di
tempo, senza aspettare che l’utente perdesse il segnale della rete, a causa
di altri access point presenti nelle vicinanze del dipartimento di informatica,
che propagano il segnale di ALMAWIFISTUDIO.
Traffico di foreground (traffico dell’applicazione)
In tutti i test, per ogni utente che utilizza l’applicazione, sono stati inviati 50 pacchetti udp, con una frequenza all’incirca di 0,4 pacchetti trasmessi al secondo. Cio’ comporta una trasmissione di 410 byte al secondo nelle
prove senza frammentazione e di 820 byte al secondo in quelle con frammentazione (si parla di dimensione dei dati, senza considerare gli header dei vari
protocolli).
Estratto output test
output applicazione
Sending UDP "11" to (192.168.2.241:11111) ipid 39395
sent UDP, IP id 39395 frag_len 65535 offset 65535 more_frag 1
sent UDP, IP id 39395 frag_len 65535 offset 65535 more_frag 0
Sending UDP "12" to (192.168.2.241:11111) ipid 39396
sent UDP, IP id 39396 frag_len 65535 offset 65535 more_frag 1
NOT sent UDP, IP id 39396 frag_len 65535 offset 65535 more_frag 0
Sending UDP "13" to (192.168.2.241:11111) ipid 39397
NOT sent UDP, IP id 39397 frag_len 65535 offset 65535 more_frag 1
NOT sent UDP, IP id 39397 frag_len 65535 offset 65535 more_frag 0
5.3 Prove e risultati
Sep 4 15:08:03 kernel:***RTLKILL*** frame id : 1920
Sep 4 15:08:03 kernel:***RTLKILL*** datagram id : 39395
Sep 4 15:08:03 kernel:***RTLKILL*** source port : 58383
Sep 4 15:08:03 kernel:***RTLKILL*** fragment : 1
Sep 4 15:08:03 kernel:***RTLKILL*** acked : 1
Sep 4 15:08:03 kernel:***RTLKILL*** retry_count : 0
Sep 4 15:08:03 kernel:***RTLKILL*** filtered_count : 0d
.........................
Sep 4 15:08:03 kernel:***RTLKILL*** frame id : 1936
Sep 4 15:08:03 kernel:***RTLKILL*** datagram id : 39395
Sep 4 15:08:03 kernel:***RTLKILL*** source port : 0
Sep 4 15:08:03 kernel:***RTLKILL*** fragment : 0
Sep 4 15:08:03 kernel:***RTLKILL*** acked : 1
Sep 4 15:08:03 kernel:***RTLKILL*** retry_count : 0
Sep 4 15:08:03 kernel:***RTLKILL*** filtered_count : 0d
.........................
Sep 4 15:08:06 kernel:***RTLKILL*** frame id : 1952
Sep 4 15:08:06 kernel:***RTLKILL*** datagram id : 39396
Sep 4 15:08:06 kernel:***RTLKILL*** source port : 58383
Sep 4 15:08:06 kernel:***RTLKILL*** fragment : 1
Sep 4 15:08:06 kernel:***RTLKILL*** acked : 1
Sep 4 15:08:06 kernel:***RTLKILL*** retry_count : 0
Sep 4 15:08:06 kernel:***RTLKILL*** filtered_count : 0d
.........................
Sep 4 15:08:06 kernel:***RTLKILL*** frame id : 1968
Sep 4 15:08:06 kernel:***RTLKILL*** datagram id : 39396
Sep 4 15:08:06 kernel:***RTLKILL*** source port : 0
Sep 4 15:08:06 kernel:***RTLKILL*** fragment : 0
Sep 4 15:08:06 kernel:***RTLKILL*** acked : 0
Sep 4 15:08:06 kernel:***RTLKILL*** retry_count : 0
Sep 4 15:08:06 kernel:***RTLKILL*** filtered_count : 4152370048d
71
72
5. Valutazione
.........................
Sep 4 15:08:09 kernel:***RTLKILL*** frame id : 1984
Sep 4 15:08:09 kernel:***RTLKILL*** datagram id : 39397
Sep 4 15:08:09 kernel:***RTLKILL*** source port : 58383
Sep 4 15:08:09 kernel:***RTLKILL*** fragment : 1
Sep 4 15:08:09 kernel:***RTLKILL*** acked : 0
Sep 4 15:08:09 kernel:***RTLKILL*** retry_count : 0
Sep 4 15:08:09 kernel:***RTLKILL*** filtered_count : 0d
.........................
Sep 4 15:08:10 kernel:***RTLKILL*** frame id : 2000
Sep 4 15:08:10 kernel:***RTLKILL*** datagram id : 39397
Sep 4 15:08:10 kernel:***RTLKILL*** source port : 0
Sep 4 15:08:10 kernel:***RTLKILL*** fragment : 0
Sep 4 15:08:10 kernel:***RTLKILL*** acked : 0
Sep 4 15:08:10 kernel:***RTLKILL*** retry_count : 0
Sep 4 15:08:10 kernel:***RTLKILL*** filtered_count : 4152370048d
Risultati
Nella tabella che segue sono riportati per ogni test effettuato gli intervalli
di tempi medi che intercorrono tra l’istante in cui viene inviato un frame e il
momento in cui l’applicazione fornisce informazioni sulla sua sorte. I valori
indicati sono espressi in nsecondi.
1
1
1
1
2
4
1
4
no traffico bg
no traffico bg
traffico bg (10 client)
traffico bg (10 client)
traffico bg (10 client)
traffico bg (10 client)
traf. bg ALMAWIFISTUDIO
traf. bg ALMAWIFISTUDIO
applicazioni
1024 Byte
1024 Byte
1024 Byte
1024 Byte
2048 Byte
1024 Byte
2048 Byte
1024 Byte
traf pers
xx
xx
xx
xx
18.287.006
18.287.006
10.547.086
14.397.089
open
xx
xx
15.927.642
19.560.530
397.321.446
14.803.633
18.906.654
18.802.267
WEP
Tabella 5.1: Ritardi medi risposte applicazione
56.894.098
22.343.824
xx
xx
xx
xx
xx
xx
WPA
5.3 Prove e risultati
73
74
5. Valutazione
Grafici
Nei grafici sottostanti sono riportati i valori presenti nella tabella precedente (asse y), mostrando inoltre anche la differenza fra i ritardi per i frame
acked (colore giallo) e frame non acked (colore arancione). In colore blu sono
riportati i valori medi senza distinzione tra acked e non (valori presenti nella
tabella). N.B.: La lettera F indica i test in cui sono stati inviati pacchetti
udp di 2048 Byte e in cui percio’ e’ presente frammentazione.
Figura 5.1: Riassunto Generale
I grafici che seguono si riferiscono a quelle prove in cui piu’ utenti sulla
stessa macchina utilizzano l’applicazione. La prima serie di valori di ogni
grafico si riferisce al test nel complesso, senza alcuna distinzione tra i mittenti
dei frame, mentre quelli che seguono sono ottenuti mantenendo separati i
risultati dei vari utenti.
5.3 Prove e risultati
Figura 5.2: WEP multisessione
Figura 5.3: WPA multisessione
75
76
5. Valutazione
Il grafico che segue, a differenza dei precedenti, non riporta i valori medi
dei ritardi ottenuti nei test, ma mostra l’andamento del tempo necessario
per ottenere una risposta sulla sorte del frame di una singola prova, quella
eseguita su una rete senza cifratura, con frammentazione e traffico di background. Nell’asse y sono riportati i ritardi in nsecondi, mentre sull’asse x vi
sono i frame in ordine cronologico. I frame con una sola colonna (blu) sono
quelli che hanno ricevuto un ack, mentre quelli con due colonne (blu-rosso)
non l’hanno ricevuto.
Figura 5.4: Andamento ritardi singola prova
5.4
5.4.1
Discussione risultati
Prove
I vari test hanno fornito risultati simili, con l’unica eccezione dei valori
della prova con cifratura WEP, traffico di background e frammentazione, che
sono molto superiori; questo perche’ alcuni pacchetti inviati hanno riscontrato un ritardo molto elevato, nell’ordine dei secondi, che ha innalzato notevolmente i valori medi del test.
Una caratteristica dei test effettuati in assenza di cifratura e con la WEP
e’ il fatto che quando l’utente che utilizzava l’applicazione si e’ allontanato
5.4 Discussione risultati
dall’access point fino a perderne il segnale, non e’ piu’ riuscito a riconnettersi
automaticamente alla rete (questo non e’ dovuto al nostro lavoro). Tutto
cio’ invece non si e’ verificato durante le prove con WPA, in cui si e’ utilizzato wpa supplicant, il quale impedisce la chiusura della connessione quando
si perde il segnale dell’access point e permette la riconnessione automatica
alla rete. Questo elemento, comunque, non influenza minimamente la nostra
applicazione, che funziona correttamente anche quando si perde il segnale e
lo si riacquisisce successivamente.
5.4.2
Affidabilita’
Come gia’ detto in precedenza, l’applicazione e’ stabile, indipendentemente dal driver utilizzato, ma le informazioni fornite dipendono invece direttamente dal firmware, dai dati che questo fa arrivare dal hardware al driver
e quindi alla parte di stack di rete che implementa il protocollo IEEE802.11.
Infatti non tutte le schede wireless forniscono informazioni valide sul fatto
che i frame siano oppure no acked, sul retry count ..., fornendo invece a
volte informazioni false per mantenere la compatibilita’ con i livelli superiori: i frame vengono dichiarati sempre acked oppure il retry count viene
sempre considerato 0. In questi casi la nostra applicazione non puo’ accorgersi del problema e quindi continua ad essere in esecuzione fornendo pero’
le informazione datele dal driver e quindi dal firmware, che sono percio’ errate. Durante il nostro lavoro sono stati fatti degli studi e delle prove con
varie schede wireless, ottenendo una diversa affidabilita’ delle informazioni
dell’applicazione in base al dispositivo hardware utilizzato:
• rtl8187 : i frame sono sempre dichiarati acked e il retry count e’ considerato 0. Percio’ la nostra applicazioni e’ impotente ed e’ inutile
utilizzarla perche’ fornisce dati errati.
• iwl3945 : i dati forniti sono sempre completi, quindi la nostra applicazioni funziona correttamente.
77
78
5. Valutazione
• zd1211rw : le informazioni sullo stato acked dei frame sono corrette,
mentre il valore del retry count e’ sempre 0, e percio’ non e’ affidabile.
La nostra applicazione quindi mantiene un funzionamento parziale,
fornendo solo una parte di informazioni corrette.
5.4.3
Ritardi
Premessa
Prima di addentrarci nella discussione sui ritardi, occorre dire che questi
valori sono attendibili solo dal punto di vista statistico, perche’ ottenuti
tramite l’utilizzo di system call, che quindi, per quello che riguarda le tempistiche, comportano problemi dovuti a scheduling e alla precisione dell’orologio
di sistema... Infatti, per esempio, a volte abbiamo ottenuto dei ritardi pari
a 0 nsecondi, cosa improbabile nella realta’. Comunque, anche se i risultati
delle prove non possono essere considerati con una precisione del nsecondo,
sono indicativi, con i valori medi, dell’entita’ dei ritardi.
Dall’analisi dei tempi ottenuti dai test si puo’ osservare che, come previsto, vi e’ una differenza notevole fra i ritardi dei frame non acked e di quelli
acked. Questo perche’ si puo’ sapere se un pacchetto e’ acked nell’istante in
cui arriva l’ack dall’access point, mentre per considerarlo non acked occorre
aspettare che i timeout terminino, cosa che ovviamente crea un maggiore
ritardo. Il fatto invece non previsto e’ la vicinanza dei ritardi medi dei pacchetti indipendentemente dalla cifratura della rete. Infatti ci aspettavamo
un ritardo maggiore nei test con WEP e WPA, dovuto alla necesssta’ di
decrittare i frame, a differenza delle prove su rete aperta, ma, dai risultati
ottenuti, quello che si puo’ dire e’ che, almeno con la frequenza di dati inviati
dei test, la tipologia di cifratura della rete non influisce notevolmente sui ritardi. Un altro fattore osservabile dai risultati (grafico relativo alla singola
prova) e abbastanza prevedibile, consiste nel fatto che allontanandosi dall’access point i ritardi aumentano e c’e’ una maggiore probabilita’ di avere
5.4 Discussione risultati
frame non acked. Cio’ e dovuto a fattori fisici, perche’ in una comunicazione
tra due postazioni, all’aumentare della distanza, la potenza del segnale ricevuto da uno dei due elementi diminuisce, rendendo difficile all’antenna la
corretta ricezione del pacchetto, anche perche’ un segnale di bassa potenza
e’ facilmente mascherabile dal rumore circostante.
79
80
5. Valutazione
Capitolo 6
Sviluppi Futuri
6.1
IPv6
L’ICANN1 rese disponibile il protocollo IPv6 sui root server DNS dal 20
luglio 2004, ma solo dal 4 febbraio 2008 inizio’ l’inserimento dei primi indirizzi
IPv6 nel sistema di risoluzione dei nomi. Si prevede che il protocollo IPv4
verra’ utilizzato fino al 2025 circa, per dare il tempo necessario ad adeguarsi
e correggere gli eventuali errori.
Oltre a rispondere all’esigenza dell’aumento dello spazio di indirizzamento, l’IPv6 incorpora alcuni protocolli che prima erano separati, come l’ARP,
ed e’ in grado di impostare automaticamente alcuni parametri di configurazione della rete, come per esempio il default gateway. Inoltre supporta
nativamente il QOS e introduce l’indirizzamento anycast, che permette ad
un computer in rete di raggiungere automaticamente il piu’ vicino server
disponibile di un dato tipo (un DNS, per esempio) anche senza conoscerne a
priori l’indirizzo.
Per quanto riguarda il miglioramento del servizio, le principali migliorie
sono:
1
L’ICANN (Internet Corporation for Assigned Names and Numbers) e’ un ente inter-
nazionale non profit, istituito il 18 settembre 1998 per proseguire in numerosi incarichi di
gestione relativi alla rete Internet che in precedenza erano demandati ad altri organismi.
81
82
6. Sviluppi Futuri
• header di lunghezza fissa (40 byte)
• pacchetti non frammentabili dai router
• eliminazione del campo checksum
Queste tre novita’ alleggeriscono il lavoro dei router, migliorando l’instradamento e il throughput. IPv6 e’ la seconda versione dell’Internet Protocol ad essere ampiamente sviluppata, e costituira’ la base per la futura
espansione di Internet.
Proprio per questo motivo un argomento molto interessante riguarda il
porting da IPv4 a IPV6 del meccanismo cross-layer trattato.
6.2
DCCP
Il Datagram Congestion Control Protocol (DCCP) e’ un protocollo di comunicazione a livello di trasporto orientato al messaggio. E’ stato sviluppato
dall’IETF e standardizzato nell’ RFC 4340.
Applicazioni che possono far uso del DCCP includono quelle con limiti
di tempo per la consegna di dati tali che la consegna in ordine combinata
con il controllo della congestione possa far arrivare alcune informazioni al
ricevente dopo che non sia piu’ utili. Tali applicazioni includono lo streaming
e telefonia via Internet.
Il controllo di congestione e’ il modo in cui i protocolli di rete scoprono la
capacita’ della rete in un particolare cammino. La motivazioni primaria dello
sviluppo del DCCP e’ fornire un modo per tali applicazioni di guadagnare
accesso ai meccanismi standard di controllo della congestione senza doverla
implementare a livello applicazione.
Molto probabilmente appoggiarsi a questo protocollo piuttosto che all’UDP migliorerebbe ulteriormente la qualita’ del servizio da noi proposto.
6.3 Monitor
6.3
Monitor
Ottenute le informazioni dallo stack e dal driver sui datagram UDP inviati, occorre ora trasmettere questi dati alle applicazioni. In questo contesto
sono queste ultime a dover provvedere all’elaborazione delle informazioni
ottenute.
Tutte le operazioni lasciate alle applicazioni possono essere eseguite da
un modulo che dialoghi direttamente con lo stack e gestisca al meglio la
concorrenza di piu’ applicazione che usufruiscono dello stesso servizio.
6.4
IEEE 802.11r
Dopo un anno di interessamento al problema, e a poco piu’ di un mese
dalla discussione di questo documento, l’IEEE ha creato un nuovo standard
che avrebbe facilitato ulteriormente il nostro compito.
Il 15 Luglio 2008 l’IEEE ha pubblicato lo standard 802.11r-2008[13] anche
conosciuto come Fast BSS Transition. Queste modifiche permettono un cambio di AP dinamico e quindi rendono reale la continuita’ della connessione
transitando nella rete in maniera rapida e sicura.
Alcuni dettagli per permettere un servizio del genere sono gia stati introdotti in altre implementazioni del protocollo, tuttavia il ritardo di consegna di circa 100 ms e’ sempre stato troppo lungo per supportare applicazioni
come voce e video ed e’ particolarmente problematico per la sicurezza delle
connessioni che utilizzando WPA/WPA2 puo’ richiedere da 2 a 8 secondi per
la negoziazione.
La principale applicazione prevista per il 802.11r e’ lo standard VOIP.
BSS Transaction:
Scansione Attiva o passiva per altri AP nella zona utilizzando 802.11k
Autenticazione L’autenticazione con un (uno o piu’) AP prestabilito
83
84
6. Sviluppi Futuri
Associazione Riassociazione con l’AP e negoziazione della connessione
A questo punto, Access Point e device mobile dispongono di una connessione:
PTK Four way handshake della sessione basato su chiavi di autenticazione
802.1x
QOS Gestione della qualita’ del servizio
Essendo nuovo, questo standard non ha ancora implementazioni effettive.
Probabilmente con i dovuti accorgimenti il nostro meccanismo cross-layer
puo’ essere adattato allo standard. Dopo quasi un anno di studi, il fatto
che la IEEE abbia deciso di affrontare il problema, sicuramente ci riempie di
soddisfazione.
6.5
Kernel Linux
Riguardo alle modifiche compiute sullo stack di rete (grazie alla loro
indipendenza dalle funzionalita’ preesistenti) potrebbe essere utile una integrazione nella versione ufficiale del kernel di Linux, soprattutto tenendo
presente il nuovo standard IEEE 802.11r.
Capitolo 7
Conclusioni
Il panorama attuale vede le comunicazioni in continua evoluzione. Le reti
wireless sono in aumento sul territorio e la tecnologia VoIP ha sempre piu’
applicazioni sia dal punto di vista lavorativo che personale.
L’utilizzo combinato di queste due tecnologie e’ complicato dal problema dell’elevata perdita di pacchetti insita nelle reti Wi-Fi e l’utilizzo di un
protocollo inaffidabile come UDP da parte del VoIP.
Il nostro scenario ipotetico vede un dispositivo mobile connesso ad un AP,
e la possibilita’ di spostamento nello spazio senza perdita di connettivita’ a
patto di copertura del percorso.
Questa comunicazione avviene attraveso lo scambio di pacchetti. Il dispositivo mobile invia all’AP i dati di interesse, e a sua volta l’AP comunica
l’avvenuta ricezione (Acknowledgement).
Grazie alle modifiche apportate allo stack di rete, il problema della comunicazione all’applicazione l’avvenuta ricezione degli acknowledgement da
parte del device all’applicazione e la gestione dell’interattivita’ e’ stato risolto.
La parte iniziale riguardante lo studio delle informazioni effettivamente
disponibili a basso livello, ha mostrato che tutto il lavoro svolto diviene affidabile solo in presenza di driver capaci di fornire informazioni precise e
corrette, a volte passano ai livelli superiori informazioni false per mantenere
la compatibilita’ con vari protocolli. In questi casi il nostro meccanismo non
85
86
7. Conclusioni
puo’ accorgersi del problema e quindi continua ad essere in esecuzione fornendo pero’ le informazione datele dal driver e quindi dal firmware, che sono
percio’ errate.
Come gia’ detto precedentemente, il codice da noi integrato nello stack e’
stabile, indipendentemente dal driver utilizzato. Non appesantisce o rallenta
significativamente il kernel, ma soprattutto non ne compromette le funzionalita’ dato che non modifica processi1 esistenti, ma ne crea uno nuovo parallelo
ad essi.
Lo studio ha permesso di evidenziare che tendenziamente le schede wireless PCI Express o MINIPCI esportano maggiori informazioni e tendono ad
essere piu’ precise dei device USB. Questo pensiamo sia dovuto alla mancanza
dello stack USB che crea un ulteriore livello di astrazione.
Il lavoro qui svolto getta le basi per la creazione di un modulo che gestisca
i dati da noi forniti, per permettere un alleggerimento dei controlli da parte
delle applicazioni.
Fornisce inoltre alcuni semplici e indicativi risultati circa il comportamento e il possibile utilizzo dell’interattivita’ cosi’ costituita. Il problema
risolto ad oggi e’ ritenuto particolarmente significativo nell’ambito delle reti
wireless.
Con grande soddisfazione personale, nel periodo in cui questa tesi e’ stata
sviluppata anche l’IEEE stava lavorando ad un progetto molto simile. La
pubblicazione dello standard IEEE 802.11r (15 Luglio 2008) ci permette di
affermare la significativita’ del nostro lavoro e la possibilita’ di adattare le
nostre modifiche allo standard per renderle esecuitve fuori dalla nostra rete
di testing.
Grazie all’evoluzione degli standard e delle tecnologie attuali, la possibilita’ di integrare le nostre modifiche al kernel di Linux sembrerebbe non del
tutto impossibile e sicuramente un esperienza inestimabile.
1
Per processo si intende processo di elaborazione di uno o piu’ dati per ottenerne
informazioni.
Sicuramente grazie alla mia famiglia,
che ha reso possibile tutto questo.
Un ringraziamento speciale al Dott. Vittorio Ghini,
che seguendoci un anno intero ci ha permesso di realizzare una
tesi volta a risolvere un problema reale.
Grazie a Giulio Grassi,
collega e amico che ha reso indimenticabile questa tesi e gli
anni passati insieme.
Ultimi ma non per importanza, grazie a tutti gli amici e
colleghi,
che mi hanno accompagnata fino a qua, coscienti che di anni
da passare insieme ce ne saranno altri due.
Grazie a tutti.
Bibliografia
[1] Andrew S. Tanenbaum, Computer Networks (4th Edition),
Prentice Hall, 2003
[2] L. Peterson, B. Davie, Computer Networks: A Systems
Approach (3rd Edition), Morgan Kaufmann, 2003
[3] Institute of Electrical and Electronics Engineers, IEEE
802.11TM WIRELESS LOCAL AREA NETWORKS, Website, 2008,
http://www.ieee802.org/11/
[4] Institute of Electrical and Electronics Engineers, IEEE
802.11TM Standard, Website, 2008,
http://standards.ieee.org/getieee802/802.11.html
[5] BBC, Wi-Fi: A warning signal, Website, 2007,
http://news.bbc.co.uk/2/hi/programmes/panorama/6674675.stm
[6] Fabio M. Zambelli, Report semina terrore sul Wi-Fi,
Website, 2008,
http://www.setteb.it/content/view/3934
1
2
BIBLIOGRAFIA
[7] Filippo Vendrame, I tedeschi temono il Wi-Fi, Website,
2007,
http://www.oneadsl.it/28/09/2007/i-tedeschi-temono-ilwi-fi/
[8] Francesca Guido, Pericolo wi-fi, Website, 2007,
http://www.datamanager.it/articoli.php?visibile1̄&idricercato2̄1059
[9] Information Sciences Institute University of Southern
California, RFC791 - Internet Protocol, 1981,
http://www.faqs.org/rfcs/rfc791.html
[10] J. Postel, RFC768 - User Datagram Protocol, 1980,
http://www.faqs.org/rfcs/rfc768.html
[11] Autori vari: IETF, ISI, Voice Over IP, Website,
http://www.protocols.com/pbook/VoIPFamily.htm
[12] Roberto Arcomano, VoIP Howto, Website, 2002,
http://www.faqs.org/docs/Linux-HOWTO/VoIPHOWTO.html
[13] IEEE P802.11 Task Group R, Project IEEE 802.11r,
Website, 2008,
http://grouper.ieee.org/groups/802/11/Reports/tgr update.htm
Fly UP