Il Nobel per l'informatica
A.M. Turing Award e
Presidential Medal of Freedom
Come altre grandi invenzioni nella storia del
pianeta, Internet deve la sua genesi a ragioni
militari e di difesa. Il rischio di centralizzare
informazioni top-secret in un unico luogo impose
l'esigenza di dislocare i dati in calcolatori distanti tra
loro, con la conseguente necessità di creare protocolli
di comunicazione affidabili e sicuri.
Nei primi anni settanta, la Defence Advanced Research
Project Agency, DARPA finanziò l'Università di
Stanford e la BBN (Bolt, Beranek and Newman) per lo
sviluppo di un insieme di protocolli di comunicazione
da utilizzarsi per lo sviluppo di reti a commutazione di
pacchetto, per l'interconnessione di calcolatori
eterogenei. Fu così che nacque l'Internet Protocol Suite
i cui due protocolli più noti sono TCP (Trasmission
Control Protocol) e IP (Internet Protocol).
Si fa riferimento a questa architettura di rete con la
sigla TCP/IP. I creatori di
questi protocolli di trasmissione, utilizzati nel web,
sono Robert Kahn e Vinton Cerf, a cui
l'attuale Presidente degli Stati Uniti George W. Bush ha
consegnato la Presidential Medal of Freedom, ovvero
la più alta tra le onorificenze civili a stelle e strisce, il 9
Novembre 2005. I due studiosi non sono nuovi a questo genere di premiazioni:
all'inizio del 2005 è stato
assegnato loro il prestigioso A.M. Turing
Award 2004, equivalente del Premio Nobel nel settore
dell'Information Technology. Cerf e Kahn hanno
sviluppato lo standard per la trasmissione di pacchetti
nel lontano 1973 mentre lavoravano per la DARPA.
L'A.M. Turing Award è assegnato annualmente dalla
Association for Computing Machinery, ACM, ad una
personalità che eccelle per i contributi di natura tecnica
che ha dato alla comunità informatica. Vengono
considerati contributi al settore dei computer duraturi e
di elevata importanza tecnica. Il fatto che l'ACM si
dedichi primariamente al software e alla teoria
dell'elaborazione dei dati si riflette nel fatto che
nessuno dei premi riguarda contributi strettamente
dedicati all'hardware, settore al quale si dedica
primariamente l'Institute of Electrical and
Electronics Engineers, IEEE. Il premio è intitolato al
matematico inglese Alan Mathison Turing (1912 -
1954), in riconoscimento del suo contributo unico e
originale alla nascita delle attività di calcolo mediante
dispositivi automatici. Spesso il Turing Award viene
chiamato il "premio Nobel del calcolo automatico".
Ogni vincitore tiene una lezione che sarà pubblicata su
un periodico dell'ACM.
Attualmente Vint Cerf, collabora con Google alla
creazione degli standard per le future applicazioni e nel
frattempo si dedica allo sviluppo di nuovi protocolli di
comunicazione interplanetaria per il Jet Propulsion Lab
della NASA. Robert Kahn, invece, dopo 13 anni di
servizio presso la DARPA è diventato presidente della
Corporation for National Research Initiatives (CNRI).
Il Turing Award 2005, il più recente, è invece stato assegnato al
celeberrimo matematico inglese Peter Nour per il
lavoro pionieristico svolto durante la definizione del
linguaggio di programmazione Algol 60. Durante quel lavoro il
dr. Naur introdusse la notazione che in seguito divenne nota come
Backus-Naur Form, BNF.
Internet, la I nella sigla TCP/IP, già fenomeno degli anni '90,
sta divenendo un elemento fondante della società, della cultura e del
commercio. Rivisitiamo allora, da un punto di vista non tecnico,
le nozioni che stanno alla base di TCP/IP.
Anzitutto, si tratta di una suite, o famiglia, di protocolli.
Questo concetto era stato teorizzato negli anni 80 dalla Open Systems
Interconnection, OSI, come la cooperazione tra servizi che operano
a diversi livelli. Il modello OSI prevede sette livelli, ma è stato
soppiantato dall'approccio pragmatico di TCP/IP che fonde i livelli superiori
secondo la convenienza e la natura dei problemi via via che si presentano.
Inoltre TCP/IP non si occupa del livello fisico: questo è stato un
ingrediente fondamentale del suo successo poiché lo ha reso
indipendente dall'hardware.
Ciascun protocollo della famiglia, ma anche idee e indicazioni, è
stato inizialmente descritto come una Request For Comments, RFC.
Per esempio, Vint Cerf ha stabilito l'utilizzo del codice ASCII nell'RFC 20.
Possiamo tentare una mappa dando degli esempi
7: applicazione
la parte più alta è quella visibile all'utente.
|
HTTP, SMTP, FTP, Telnet
|
6: presentazione
trascodifica, crittografia e simili.
|
SSL, TLS
|
DNS
|
5: sessione
gestione dello scambio di dati, connessione.
|
TCP: flusso di dati continuo
|
4: trasporto
trasferimento.
|
UDP: invio di pacchetti
|
3: rete
instradamento, indirizzamento logico.
|
IP, ICMP, ARP, IGMP, BGP, PPP
|
2: collegamento dati
tra punti contigui, indirizzamento fisico.
|
Ethernet, NDIS, Token Ring, ADSL, WiFi
|
1: fisico
il mezzo fisico, descritto in termini di impedenza, frequenza, ecc.
|
doppini, onde radio
|
Una mappa dei protocolli che rispetti i livelli è impossibile,
anche perché ciascuno dei livelli superiori può essere
riutilizzato come livello inferiore, creando dei tunnel
per produrre reti virtuali, guadagnando in flessibilità
al costo di una qualche inefficienza.
Nella pratica, l'utente di uno stack TCP/IP, ossia il programma
applicativo, per solito utilizza TCP. Meno frequentemente utilizza UDP,
in quanto in questo caso deve farsi carico della gestione della sessione.
Altrimenti è possibile utilizzare IP raw, non cucinato,
per avere la piena libertà di comporre i pacchetti.
Durante la spedizione un pacchetto discende i livelli verso il basso.
Ogni livello avvolge il contenuto in un involucro
prima di passarlo al livello inferiore. Ai livelli logici, l'involucro
consiste in una testata, o header, mentre al livello fisico
può cambiare a seconda del mezzo di trasmissione usato. In ricezione,
ogni livello spacchetta il messaggio per consegnarne il contenuto
al livello superiore. Così ogni livello riceve un contenuto
uguale a quello che era stato spedito dal livello remoto suo pari
(peer).
Header IP
Nel pacchetto IP i campi più importanti sono:
- Version
- Indica la versione del protocollo. Quello correntemente
usato è la versione 4, IPv4. La versione 5 non esiste
e dopo vari singulti la versione 6, IPv6, è oggi funzionale
su tutti i sistemi operativi degni di una qualche rilevanza.
Sono i carrier e i fornitori di servizi che hanno investito
in servizi aggiuntivi in IPv4 che hanno difficoltà
ad effettuare il cambio di versione.
- Total Lenght
- Lunghezza totale del pacchetto IP.
- Time-to-live
- Tempo di vita del pacchetto. Il TTL è
un numero che viene decrementato ad ogni hop,
cioè ogni volta che il
pacchetto IP passa da un nodo della rete al successivo.
Se il TTL arriva a zero vuol dire che il pacchetto
sta girando in tondo e non arriverà mai a destinazione.
Così viene scartato.
Questo campo viene utilizzato in modo diverso dall'utility
traceroute. Solitamente quando viene scartato un pacchetto
si invia una segnalazione (un pacchetto ICMP Time exceeded)
al mittente. Così inviando un pacchetto con un TTL di 1,
poi di 2, 3, eccetera, posso ricevere una segnalazione da
ciascun nodo lungo il percorso.
- Protocol
- Questo campo indica quale protocollo di livello superiore
deve ricevere il contenuto del pacchetto. Per esempio per TCP
viene usato il numero 6.
- Source address
- Indirizzo del mittente.
- Destination address
- Indirizzo del destinatario.
Questi sono solitamente chiamati indirizzi IP o semplicemente
IP. In IPv4
l'indirizzo consiste in 4 byte e viene solitamente scritto
in dotted decimal notation, p.es. 1.2.3.4. Non c'è
bisogno, su questo sito, di ricordare che un byte va da 0 a 255,
vero? Hmmm... vediamo. Di ricordare che la network mask
viene usata per eseguire un AND bit per bit con l'indirizzo c'è
bisogno? Due indirizzi IP che diano lo stesso risultato dopo l'AND
sono sulla stessa rete, altrimenti è necessario inviare
il pacchetto al default gateway.
È importante osservare che i campi di un pacchetto IP
vengono riempiti quando il pacchetto è ospite della macchina
che lo spedisce, il source host, cioè prima della
spedizione al livello fisico.
Non c'è nessun meccanismo che controlli, per esempio, che
l'indirizzo del mittente sia effettivamente l'indirizzo dell'host
che ha composto il pacchetto. I firewall controllano che gli
indirizzi abbiano un senso, eliminando, per esempio, i pacchetti
che provengono dall'esterno con un indirizzo del mittente che
corrisponde a un indirizzo interno.
La suite TCP/IP comprende protocolli di routing (instradamento)
che permettono di determinare dinamicamente il percorso lungo
il quale raggiungere una data destinazione. Per esempio,
Border Gateway Protocol (BGP) e Internet Group Management Protocol
(IGMP). Nella tabella li abbiamo indicati allo stesso livello di IP,
ma ovviamente questi sono anche clienti di IP, che utilizzano per
svolgere le loro funzioni. Diverso è il ruolo di PPP (Point to Point
Protocol) che si infila sotto IP e che prevede al suo interno
una serie di altri protocolli per effettuare la trasmissione di dati
(alcuni lo segnano al livello 2).
IP prevede che un pacchetto possa essere frammentato durante
la spedizione. Una vera maledizione per i firewall o i gateway
che debbano riassemblare quei frammenti. Spesso è salubre
richiedere la non-frammentabilità dei pacchetti che si
spediscono, per evitare che i frammenti siano semplicemente
scartati, specie se troppo piccoli perché sia possibile
decidere cosa farne.
Indirizzi IP "Privati"
Onde permettere la creazione di reti che utilizzassero il
protocollo IP senza per forza dover essere direttamente
connesse all'Internet globale, sono state riservate alcune classi
di indirizzi IP come indirizzi privati.
Questi indirizzi non possono essere utilizzati su
Internet, ma chiunque è libero di utilizzarli per una rete
privata, che sia domestica o di una grande azienda.
Un computer che utilizzi uno di questi indirizzi non
potrà collegarsi direttamente ad un computer su un
indirizzo pubblico, ma esistono dei meccanismi per
permettergli di comunicare con Internet:
- il NAT viene spesso usato per far "uscire" una
rete privata su internet attraverso un solo
indirizzo pubblico. Questa tecnica è detta anche
IP masquerading.
- un proxy può essere collegato sia alla rete
pubblica che ad una rete privata, permettendo ad
esempio di navigare il web dalla rete privata.
Le classi di indirizzi IP privati sono:
- 10.0.0.0/8 con i primi 8 bit fissi e gli altri
assegnabili, può contenere 16.777.216
calcolatori
- 172.16.0.0/12 con i primi 12 bit fissi e gli altri
assegnabili, può contenere 1.048.576 calcolatori
- 192.168.0.0/16 con i primi 16 bit fissi e gli altri
assegnabili, può contenere 65.536 calcolatori
Naturalmente, ciascuna di queste classi di indirizzi può
essere a sua volta suddivisa in sottoreti di dimensione
inferiore, ovvero con maschera di sottorete più lunga.
Nella notazione CIDR (Classless Inter-Domain Routing),
la network mask è indicata dal numero di bit iniziali
alzati, per esempio 10.0.0.0/8 indica una mask 255.0.0.0 per
la classe di indirizzi da 10.0.0.0 a 10.255.255.255.
Header TCP
Il valore aggiunto di TCP è notevole: presenta un flusso
di dati full duplex che può essere letto e scritto
come se fosse un file.
Nell'header TCP i campi più importanti sono:
- Porta sorgente (Source port)
- Identifica il programma che spedisce il pacchetto.
Un programma può richiedere un numero di porta preciso
solo se nessun altro programma lo sta già usando. Questo
di solito viene fatto dal programma che si mette in ascolto
su numeri corrispondenti a servizi ben noti. Per esempio 25
per l'invio della posta (SMTP), 80 per il web (HTTP).
Altrimenti un programma può lasciare che gli venga
assegnato un numero qualsiasi, per solito un numero maggiore
di 5000 onde evitare che corrisponda a un qualche servizio
predefinito. I numeri di porta vanno da 0 a 65535.
- Porta di destinazione (Destination port)
- identifica il programma che riceve il pacchetto.
Vale quanto detto per la porta sorgente. Assieme ai
due indirizzi IP, i due numeri di porta identificano
univocamente una connessione TCP sull'internet in
un dato momento.
- Numero di sequenza (Sequence number)
- Identifica il byte iniziale del pacchetto all'interno del flusso di dati.
TCP si preoccupa di riassemblare i dati
tenendo conto del fatto che pacchetti diversi possono
attraversare la rete secondo percorsi diversi e quindi
arrivare in ordine inverso.
I numeri di sequenza sono ovviamente successivi,
ma non partono da 0. È importante che il primo
numero sia scelto in modo casuale per
poter distinguere un pacchetto vagante (p.es. appartenente a
un tentativo di connessione non riuscito) da un pacchetto
appartenente ad una connessione in corso, con gli stessi
numeri di porta.
Le prime implementazioni di TCP/IP utilizzavano un
algoritmo piuttosto semplice per determinare il primo
numero di sequenza. In questo modo esso risultava
prevedibile e poteva essere usato in modo malevolo
per creare una falsa connessione. Se posso prevedere il
numero di sequenza, allora posso inviare una serie di
pacchetti TCP con un indirizzo del mittente fasullo
assumendo ciecamente che arrivino. L'RFC 1948
prende atto di questo difetto nel 1996 e da allora
le implementazioni adottano sofisticate tecniche
matematiche per generare il numero di sequenza
iniziale (ISN) in modo inattaccabile.
- Numero di acknowledgment (Acknowledgment number)
- Il valore atteso dal peer. Dopo che il peer ha generato
un suo numero di sequenza, lo informo di aver ricevuto quel
pacchetto inviando il numero che mi aspetto di ricevere.
Alcuni pacchetti possono andare perduti, perciò se
un host riceve un acknowledge inferiore al
numero di sequenza che sta per inviare potrebbe essere
necessario ritrasmettere i byte mancanti. Tuttavia,
il pacchetto con l'acknowledge potrebbe essere vecchio.
Tenendo conto dei tempi di percorrenza dei pacchetti,
TCP ottimizza le ritrasmissioni ed evita di congestionare
la rete.
- Finestra (Window)
- Il numero di byte che il ricevente è in grado
di accettare. Mentre spedisce un acknowledge, il ricevente
ha anche un'idea del tempo che impiega il programma al
livello superiore per smaltire i dati che arrivano. Con
questo campo ha modo di governare la velocità di
arrivo in modo da evitare congestioni locali.
- Checksum
- TCP verifica l'attendibilità dei dati attraverso
questo campo. La checksum è la somma di tutti i campi
del pacchetto TCP, compreso l'header e compreso uno pseudo-header
che contiene gli indirizzi di origine e di destinazione, la
lunghezza dei dati e il proprio numero di protocollo (6).
I dati dello pseudo header risiedono nell'header IP.
Alcune schede di rete effettuano in hardware la checksum TCP.
Molti protocolli di livello più basso effettuano
verifiche d'integrità più sofisticate.
TCP appare inizialmente nell'RFC 793, scritto dal
compianto Jon Postel nel 1981 per DARPA. Viene usato sia per trasferire
le battute di tasti da un terminale col protocollo Telnet,
sia per trasmettere grosse moli di dati binari con rsync.
Può seguire l'algoritmo di Nagel o quello di
Van Jacobson: il programma al livello superiore lo può
configurare secondo le proprie necessità.
TCP prevede anche il concetto di trasmissione urgente, o
out of band, scarsamente usato dai protocolli moderni.
Instaurazione della connessione
La procedura utilizzata per instaurare in modo
affidabile una connessione TCP tra due host è chiamata
three-way handshake (triplice stretta di mano), ad
indicare la necessità di scambiare tre messaggi per
garantire la corretta creazione della connessione.
Supponiamo, per esemplificare, che l'host A (il client)
intenda instaurare una comunicazione TCP con l'host B
(il server); i passi indicati dalla tecnica three-way
handshake sono:
- A invia un segmento SYN a B, contenente il suo
sequence number x;
- B invia un segmento SYN/ACK ad A,
contenente il suo sequence number y e
l'acknowledgment del sequence number x di A;
- A invia un segmento ACK a B con
l'acknowledgement del sequence number y di B.
Avendo chiamate SYN poi insieme SYN + ACK e
infine ACK se si cercano solo i segmenti di tipo ACK
si ottengono tutte le nuove connessioni instaurate
Link Utili
TCP/IP da Wikipedia
Premio Turing da Wikipedia
Architettura TCP/IP: indirizzamento e routing 71 slide di Mario Astolfi
Introduction to the works of Peter Naur
il sito lui dedicato
A Peter Naur il Turing Award 2005 la notizia su Programmazione.it
Una medaglia ai padri del TCP/IP la notizia sul Corriere della Sera del 7 novembre 2005
Relazione introduttiva su ARPANET/INTERNET e CV di Cerf e Kahn del prof. Luciano Lenzini dell'Università di Pisa.