Leggi il dodicesimo capitolo

13. Approfondimenti tecnici


Segnalibro
  1. Chi stabilisce come funziona Internet? Dove posso trovare la relativa documentazione?
  2. Perchè Internet è "la rete delle reti"?
  3. Che cos'è un IP (numero)?
  4. Che cos'è il DNS? Come fa la rete a sapere dove si trova il computer "xxx.yy"?
  5. Che cos'è un "IP dinamico"?
  6. Che cos'è il TCP/IP? Come funziona la trasmissione di dati su Internet?
  7. Che cos'è il "modello di comunicazione a livelli"?
  8. Che cos'è e come funziona l'IP (protocollo)?
  9. Che cos'è il "numero di porta" in una comunicazione?
  10. Che cos'è e come funziona il TCP?
  11. Come viene decisa la strada che percorrono i pacchetti?
  12. Cosa sono UDP, ICMP, ARP?

Segnalibro 13.1. Chi stabilisce come funziona Internet? Dove posso trovare la relativa documentazione?

A differenza di altri mezzi di comunicazione, Internet si è sviluppata grazie alla collaborazione reciproca e in assenza di una vera autorità centrale che la governasse. D'altro canto, perchè la rete possa funzionare è necessario un gran numero di convenzioni ferree da rispettare - ad esempio l'assegnazione dei nomi, il funzionamento dei protocolli...

Inizialmente, e fino a non troppi anni fa, il numero di reti locali collegate a Internet era relativamente ridotto, ed era quindi abbastanza facile mettere tutti d'accordo sull'uso di determinate convenzioni. Per questo motivo, fu creata presso l'InterNIC (Internet Network Information Center, ossia il centro di coordinamento delle reti americane, che ancor oggi è il principale riferimento per la gestione della rete) la cosiddetta IETF (Internet Engineering Task Force), che si preoccupava di coordinare lo sviluppo di nuovi protocolli e nuove applicazioni per la rete, e di pubblicare i relativi standard.

Segnalibro Quando qualcuna delle persone che collaboravano a questi processi voleva proporre alle altre un nuovo standard per una particolare applicazione, spediva loro una RFC (Request For Comments) contenente i risultati del proprio lavoro. Queste RFC, allo scopo di evitare confusioni, venivano progressivamente numerate, secondo l'ordine di pubblicazione; se era necessario aggiornare il contenuto di una RFC, semplicemente qualcuno scriveva la nuova versione e la pubblicava in una nuova RFC, a cui veniva assegnato un nuovo numero. In ogni momento, l'ultima pubblicata valeva come standard di fatto, anche se quasi nulla veniva "imposto".

Con il tempo, la serie delle RFC divenne il principale riferimento per tutte le informazioni sul funzionamento della rete, tanto che al suo interno cominciarono anche ad essere pubblicati documenti informativi, o proposte alternative per i sistemi già esistenti. Per questo motivo, si decise di selezionare alcune delle RFC e di trasformarle in standard obbligatori su tutta la rete: a queste RFC, oltre al loro numero d'ordine, è stata assegnata la sigla STD seguita da un numero. Mentre, come detto, ciascuna RFC una volta pubblicata non viene più modificata, e in caso di aggiornamenti essi vengono pubblicati con un nuovo numero di serie, il numero degli STD riguarda l'argomento e viene progressivamente assegnato a diverse RFC man mano che esse vengono aggiornate. Ad esempio, fino a giugno 1995 lo STD 1 (che corrisponde alla definizione di tutti i protocolli ufficialmente parlati su Internet) corrispondeva alla RFC 1780; l'11 luglio 1995 è stata pubblicata la RFC 1800, e da quel giorno essa è diventata lo STD 1, rendendo obsoleta (obsoleting) la RFC 1780; successivamente, sono uscite ancora altre RFC, con numeri superiori a 1800, che hanno soppiantato la 1800 nel ruolo di STD 1. Analogamente, alcune RFC sono entrate a far parte della serie delle FYI (For Your Information), numerate in modo analogo agli STD, che costituiscono invece una serie di documenti informativi poco tecnici e dedicati agli utenti comuni.

Allo scopo di evitare la proliferazione di RFC, inoltre, la IETF ha iniziato a pubblicare gli Internet drafts (bozze per Internet), ossia documenti che vengono forniti come lavoro in corso di definizione ed hanno una validità di pochi mesi. Soltanto quando il lavoro è giunto a conclusione la bozza viene pubblicata come RFC.

Segnalibro Attualmente, l'InterNIC e altri organismi di gestione della rete hanno costituito la Internet Society (http://info.isoc.org/), che si occupa di mandare avanti la IETF e tutte le operazioni connesse al "governo tecnico" della rete; presso la Internet Society esiste anche la IANA (Internet Assigned Numbers Authority), che si occupa di registrare tutti i valori dei parametri numerici assegnati su Internet, come ad esempio i numeri di porta usati dai vari protocolli. Per gli aspetti tecnici più direttamente legati al World Wide Web, invece, ci si può rivolgere al W3C (World Wide Web Consortium: http://www.w3.org/).

Sebbene quanto detto in questo paragrafo possa sembrare molto serio e poco utile all'utente comune, va invece detto che l'insieme di RFC costituisce la principale fonte di informazioni sul funzionamento di Internet a qualsiasi livello. È vero, molte RFC riguardano problemi particolarmente tecnici di cui l'utente finale nemmeno sospetta l'esistenza; tuttavia ne esistono altre - particolarmente quelle pubblicate come FYI - che sono mirate proprio agli utenti comuni e forniscono informazioni importanti. Esistono persino delle RFC divertenti - in particolare quelle pubblicate il primo di aprile...

Le RFC e le Internet draft possono essere recuperate presso il GARR, via FTP (ftp://ftp.nic.it/rfc/) o WWW (http://www.nic.it/mirrors/), oppure collegandosi all'InterNIC (http://www.internic.net/) o alla Internet Society.


Segnalibro 13.2. Perchè Internet è "la rete delle reti"?

Internet è una enorme rete di calcolatori, formata connettendo tra loro varie reti più piccole, alcune locali, alcune regionali, altre continentali o mondiali (magari a loro volta formate connettendo tra loro reti più piccole...). Per questo motivo si dice normalmente che Internet è "la rete delle reti": mentre una singola rete locale collega tra loro vari computer, Internet collega tra loro varie reti locali!

Segnalibro In generale, ogni rete locale di calcolatori (LAN o Local Area Network) è formata da un certo numero di computer collegati tra loro tramite un ben determinato mezzo fisico (ad esempio un cavo coassiale). Una LAN può avere strutture molto diverse: i computer possono essere collegati tra loro tramite un anello, in cui ciascuno manda messaggi al successivo e li riceve dal precedente (rete token ring), oppure tramite un bus (ossia, c'è un unico lungo cavo a cui sono collegati tutti i computer, che, uno alla volta, lo usano per mandare i loro messaggi: è il caso delle reti Ethernet, che sono il tipo più diffuso). Anche il mezzo fisico su cui viaggiano i segnali può essere molto diverso (cavo coassiale, fibra ottica, doppino telefonico...); inoltre la trasmissione dei dati sul cavo avviene seguendo convenzioni (ossia "protocolli fisici") diversi da rete a rete: su una certa LAN i messaggi verranno trasmessi su un cavo coassiale e immettendo su di esso una tensione di +5 Volt per dire "1" e -5 Volt per dire "0", su un'altra i messaggi verranno trasmessi su una fibra ottica mandando un impulso luminoso per dire "1" e nessun impulso per dire "0", e così via. (I modi reali di trasmissione sono spesso molto più complicati, ma sorvoliamo...) Ciascuna rete locale è caratterizzata anche da altri due livelli di funzionamento, sovrastanti a quello fisico:

Segnalibro Proprio perchè su reti locali diverse i computer parlano "linguaggi" diversi, a livello di trasmissione fisica, di accesso e di controllo, per collegare tra loro due reti locali non è sufficiente metterle in comunicazione tramite un cavo, come si farebbe tra due computer. È necessario che tra una rete e l'altra venga posto un apposito computer, detto router, o anche gateway (cancello), che parli entrambi i protocolli di LAN delle due reti e provveda a leggere, tradurre e rispedire (store and forward) i dati che lo attraversano; dovendo rispedire in avanti i dati, i router svolgono anche l'indirizzamento dei messaggi, ossia decidono in che direzione devono andare per arrivare alla loro destinazione. I router sono l'elemento fondamentale e l'idea vincente di Internet: potete pensare ad essa come ad un insieme di isole (le LAN), che in condizioni normali non potrebbero comunicare, e che vengono collegate da ponti (i router). A proposito dei due termini, negli ultimi anni sta prevalendo l'uso del termine "router" per indicare i computer che collegano tra loro le reti locali, mentre il termine "gateway", per estensione, viene utilizzato per un qualsiasi computer o programma che traduca dati da un protocollo ad un altro, specialmente se di alto livello: ad esempio un computer che provvede a ricevere per E-mail articoli che poi pubblica sui newsgroup è detto un gateway da E-mail a news.

Segnalibro Allo scopo di permettere a grosse quantità di dati di percorrere facilmente lunghi tratti (ad esempio la traversata oceanica), sono inoltre stati predisposti dei tratti di rete speciali, detti dorsali (backbones), che collegano tra loro punti molto distanti con un mezzo fisico (che può essere un cavo, ma anche un ponte via satellite!) capace di trasportare velocemente grandi quantità di dati. In origine, la rete Internet aveva una sola dorsale, quella americana, ma con l'aumentare e il complicarsi dei collegamenti la topologia della rete si è molto aggrovigliata.

Segnalibro A proposito dei collegamenti fisici che costituiscono la rete, spesso sentirete parlare di banda. Questo termine indica in generale una gamma di frequenze utilizzabili per una trasmissione; in questo ambito, tuttavia, con questo termine si identifica normalmente il bit rate del collegamento, ossia la quantità di bit che possono essere trasmessi sul collegamento in un secondo. (In realtà, i due dati sono veramente la stessa cosa o quasi, ma dovremmo addentrarci nella teoria dei segnali...) Questo valore può variare da pochi Kb/s (ad esempio 64 Kb/s è la banda disponibile su un singolo canale ISDN) fino a molti Mb/s per le dorsali. Questa è la capacità di trasmissione totale, che deve essere divisa tra tutti gli utenti: la divisione è una divisione di tempo (TDMA), ossia il canale viene usato da una sola persona per volta, a turno. La divisione di tempo è opposta alla divisione di frequenza (FDMA), che è utilizzata ad esempio nelle trasmissioni radiofoniche (in cui più utenti trasmettono in contemporanea utilizzando frequenze diverse all'interno della banda disponibile): per vari motivi, la TDMA è in generale una soluzione più efficiente. Lo strumento che permette la divisione di tempo è il pacchetto, di cui parleremo a lungo nel resto di questo capitolo.

In conclusione, possiamo provare a fare un esempio di instradamento dei dati sulla rete. Supponiamo ad esempio che un ipertesto memorizzato su un computer di un'Università americana venga richiesto da un utente del Politecnico di Torino. Un possibile percorso potrebbe essere il seguente:

  1. Il computer su cui sono memorizzati i dati li trasmette sulla rete locale dell'Università americana fino al router che la collega al resto di Internet;
  2. Probabilmente, questo router darà sulla rete metropolitana (MAN: si dice di una rete che collega tra loro le varie reti locali di una singola area urbana) della città in cui l'Università americana è posta; i dati viaggeranno allora sulla MAN fino ad un altro router;
  3. A questo router, se siamo fortunati, è collegata una dorsale capace di portare i dati direttamente su di un nodo intercontinentale sulla costa orientale degli Stati Uniti, ad esempio a New York;
  4. Giunti a New York, i dati saranno rispediti su di una dorsale oceanica, ad esempio quella verso la Germania utilizzata dalle Università europee;
  5. Giunti in Germania, i dati, tramite un router, saranno instradati sulla dorsale verso l'Italia, e - magari attraversando un router in Svizzera - arriveranno al principale nodo delle reti universitarie italiane (GARR), situato a Bologna;
  6. Dal router di Bologna, i dati saranno instradati sul collegamento di rete che porta a Torino, dove entreranno sulla MAN torinese;
  7. Da tale MAN, tramite un router, i dati passeranno sulla LAN del Politecnico di Torino;
  8. Viaggiando su tale LAN, i dati arriveranno finalmente al computer dell'utente.
Interessante, vero? Se volete scoprire il percorso dei vostri dati, potete utilizzare ad esempio un programma di Traceroute.


Segnalibro 13.3. Che cos'è un IP (numero)?

La sigla IP - che indica uno dei protocolli parlati su Internet - è solitamente usato per indicare anche quel numero binario di 32 bit (4 byte) che identifica univocamente un qualsiasi computer connesso a Internet, e che andrebbe più correttamente detto indirizzo IP.

Questo numero è definito in modo da contenere almeno un qualche indizio sulla collocazione fisica del computer a cui si riferisce, in modo da facilitare le operazioni di collegamento. Poichè, come detto, Internet è formata dall'unione di tante reti locali, ciò si ottiene dividendo il numero in due parti: la prima (quella più a sinistra) indica la rete locale a cui appartiene il computer, mentre quella più a destra permette di determinare a quale particolare computer di quella rete locale si riferisca quel particolare IP. In questo modo, i computer che indirizzano i dati sulla rete si preoccupano solamente di leggere la prima parte dell'IP e di spedire i dati alla corrispondente rete locale; una volta arrivati là, sarà poi compito dell'hardware di gestione della rete locale di indirizzare i dati al giusto computer. Si ha però un problema: se ad esempio usassimo due byte per indicare la rete e gli altri due per indicare il computer all'interno della rete (o "nodo" della rete locale), potremmo avere al massimo 65536 reti locali in Internet (il massimo numero esprimibile con due byte); ma ce ne sono molte di più! D'altra parte, se decidessimo di usare tre byte per identificare la rete, potremmo avere molte più reti locali, ma per identificare il nodo avanzerebbe un solo byte, e potremmo quindi avere al massimo 256 nodi per ciascuna rete; ma in molte delle reti locali (es. in una Università) i computer connessi alla rete sono molti di più! Per questo motivo è stata pensata una struttura "flessibile", in cui l'indirizzo è effettivamente suddiviso in due parti, una caratteristica della rete e una del nodo, ma la dimensione delle due parti è variabile. Gli indirizzi IP, pertanto, sono suddivisi in classi, a seconda della grandezza della "parte di IP" usata per esprimere la rete; le classi si distinguono a seconda del valore del primo byte dell'IP. Ed ecco la tabella esatta: si noti che i numeri 0 e 255 sono riservati per scopi speciali, per cui i quattro byte dell'IP possono variare ciascuno tra 1 e 254. Nella tabella, le x indicano la parte di indirizzo riservata all'individuazione del nodo all'interno della rete, e possono essere un qualsiasi numero compreso tra 1 e 254. Per ogni classe di IP sono indicati il massimo numero di reti e il massimo numero di computer per rete (nodi).

ClasseDaAMax. retiMax. nodiNote
A1.x.x.x126.x.x.x12616.387.064Usato per poche grandi reti
B128.1.x.x191.254.x.x16.25664.516Solitamente usato per le reti di medie dimensioni (università, grosse aziende)
C192.1.1.x223.254.254.x2.064.512254Usato per le reti di piccole dimensioni
D224.x.x.x239.x.x.xIndirizzi per trasmissioni broadcast e multicast (trasmissione contemporanea a più di un computer)
E240.x.x.x254.x.x.xAttualmente indefiniti (tranne qualche numero particolare)

Con questo sistema si ha una elevata flessibilità, e diventa possibile assegnare ad ogni ente che si collega ad Internet un numero di IP relativamente adeguato alle sue esigenze, riducendo i numeri "sprecati" (ovviamente, nessun ente utilizza tutti gli IP assegnatigli, dal primo all'ultimo: ad esempio, se un ente ha 2000 computer, poichè la classe C è insufficiente, è costretto a richiedere un indirizzo di classe B, sprecando così ben 62516 numeri; sono stati introdotti palliativi per questo problema, come l'uso di più indirizzi di classe C vicini, ma non dureranno molto). Il problema non è irrilevante, perchè facendo i conti si trova che il massimo numero di computer collegabili a Internet, limitato dagli IP teoricamente disponibili, è di 3 miliardi 654 milioni e rotti; tenendo conto che un forte spreco di IP è inevitabile, questo numero è inadeguato agli sviluppi previsti per la rete, tanto che sono allo studio nuovi sistemi di indirizzamento. In particolare, è già cominciata la transizione dall'attuale IP versione 4 all'IP versione 6 (o IP Next Generation) che permetterà di avere ben 16 byte di indirizzo, contro i quattro attuali, e quindi avrà teoricamente posto per un numero di computer pari a 2 elevato a 128. Per contro, esso renderà abbastanza difficile ricordarsi a memoria il proprio indirizzo IP...

Vediamo un esempio pratico: consideriamo l'IP 131.192.8.30. Poiche' il primo byte vale 131, questo e' un indirizzo di classe B: pertanto i primi due byte (131.192) individueranno univocamente la rete locale a cui appartiene il computer, e saranno uguali per tutti i computer che appartengono a tale rete locale. Gli altri due byte (8.30), invece, servono ad individuare il particolare computer all'interno della rete locale. Questa struttura serve a semplificare la ricerca del singolo computer: difatti, all'esterno della rete locale, l'unica informazione che interessa è come raggiungere il router di ingresso a tale rete, mentre il compito di contattare tutti i computer con IP che inizia per 131.192 potrà essere delegato a tale router.

Tuttavia, molte reti locali sono a loro volta formate da tante sottoreti (subnets); ad esempio, la rete di una Università contiene solitamente sottoreti separate per le sue varie sedi, e così via. Per contemplare questa possibilità, nelle classi di tipo A o B è possibile che una parte dei byte dedicati all'individuazione del singolo nodo venga in realtà usata per distinguere tra le varie sottoreti. Ad esempio, nell'IP precedentemente citato, il terzo byte (8) potrebbe servire ad individuare la sottorete, e a questo punto l'ultimo (30) servirebbe ad individuare il particolare computer nella sottorete.

Esistono infine alcuni IP particolari. Ad esempio, l'IP 255.255.255.255 indica tutti i computer sulla rete locale del computer dell'utente; analogamente, "riempiendo" con dei 255 le x (vedi tabella) di un indirizzo si ottiene un IP che indica tutti i computer sulla rete locale corrispondente; ad esempio 131.192.255.255 indica tutti i computer sulla rete locale individuata dai due byte 131.192. Messaggi indirizzati a questi IP saranno letti da tutti i computer! Nel caso esista la suddivisione in sottoreti, è possibile applicare lo stesso principio: 131.192.8.255 indica tutti i computer sulla sottorete 8 di 131.192 (ammettendo che 131.192 sia suddivisa in sottoreti). Ovviamente, questo tipo di IP può essere usato solo come destinazione.

Gli zeri, al contrario, servono per indicare i valori incogniti: 0.0.0.0 indica il computer dell'utente, e può essere usato soltanto per indicare il mittente del pacchetto. Gli indirizzi che iniziano con 127 (tipicamente, 127.0.0.1), così come il nome letterale localhost, servono come loopback: i dati spediti da un computer a questo indirizzo vengono in realtà inviati a se stesso. Se state usando una macchina su cui è attivo un sito FTP, provate l'URL ftp://127.0.0.1/ (o ftp://localhost/)! (Questo è un tipico consiglio dato dagli hacker ai neofiti che li scocciano chiedendo quali siano i siti dove si può trovare del buon software).


Segnalibro 13.4. Che cos'è il DNS? Come fa la rete a sapere dove si trova il computer "xxx.yy"?

Il DNS (Domain Name System o Domain Name Space) è il sistema utilizzato dai computer che gestiscono Internet per tradurre gli indirizzi letterali (es. www.polito.it) nel corrispondente indirizzo IP (es. 131.192.8.30) e viceversa. Tale sistema si basa sull'esistenza di computer di servizio, detti name server o DNS server, che vengono interpellati ogni volta che si rende necessaria una traduzione; per questo motivo, nella configurazione dei programmi di comunicazione di base (come Trumpet Winsock o Accesso Remoto) viene richiesto di indicare un name server, senza il quale non è possibile utilizzare gli indirizzi letterali.

Poichè è impensabile che un name server conservi un elenco di tutti i nomi letterali con relativo IP, la traduzione avviene in forma distribuita. Ad esempio, supponiamo di voler accedere all'indirizzo lennon.engr.wisc.edu. Per prima cosa, il nostro programma di comunicazione interpella il nostro name server definito nella configurazione, il quale conserva un elenco di tutti i domini di primo livello associati ad un altro name server; il nostro name server cercherà il dominio edu e restituirà l'IP del name server ad esso associato. Il nostro computer contatterà allora questo server, che conserverà un elenco di tutti i domini di secondo livello situati dentro edu, e che segnalerà l'indirizzo IP del server per il sottodominio wisc.edu. Contattando questo ulteriore server, il nostro computer riceverà l'IP del server per il sottodominio engr.wisc.edu; contattando tale server, finalmente il nostro computer riuscirà a sapere l'IP del computer lennon.

Poichè tutto ciò è lungo e complicato, esistono alcune scorciatoie. Innanzi tutto non esiste mai un solo name server per dominio, per evitare che, in caso esso smetta di funzionare, il dominio venga tagliato fuori dalla rete. Inoltre, i name server sono capaci di imparare: dopo aver svolto per la prima volta tutta la trafila di cui sopra, il nostro server memorizzerà gli IP dei vari server intermedi incontrati lungo il cammino, associati al relativo sottodominio, e nel caso di future richieste per gli stessi sottodomini si rivolgerà direttamente a loro. Per questo motivo, solitamente si "saltano" vari livelli nella procedura, e rivolgendosi a uno o al più due server diversi è possibile ritrovare l'IP del computer. Tuttavia, le associazioni tra indirizzo IP e nome letterale vengono automaticamente eliminate dopo un periodo di tempo prefissato, in modo da costringere il name server a ripetere la trafila e quindi a controllare se per caso l'IP associato a quel nome è cambiato nel frattempo.

Come già visto, all'interno del DNS è possibile definire degli alias, ossia equivalenze tra un nome letterale ed un altro nome letterale, utili per semplificare gli indirizzi letterali o per avere più indirizzi letterali associati ad un singolo computer.


Segnalibro 13.5. Che cos'è un "IP dinamico"?

Un computer collegato in permanenza alla rete, come visto, è univocamente identificato da un numero detto IP. Poichè si stanno diffondendo le connessioni dirette via linea commutata, comunque, una parte sempre maggiore dei computer in rete sono connessi a Internet soltanto saltuariamente, ossia quando l'utente si collega con il server via telefono: è questo il caso dei comuni accessi via modem che quasi tutti gli utenti italiani usano. In questo caso, è comunque necessario che il computer disponga di un proprio indirizzo IP, in modo da poter essere individuato dal resto della rete nei periodi in cui il collegamento è attivo.

Prendiamo ad esempio il caso di un provider che abbia 500 utenti e 10 linee telefoniche. I cinquecento utenti useranno per collegarsi più o meno cinquecento computer diversi; si potrebbe quindi pensare di assegnare ad ognuno di questi computer un proprio indirizzo IP, che funzionerà soltanto quando quel particolare utente si collega con il provider, e resterà inutilizzato quando non è collegato. In questo caso, dal punto di vista del resto della rete, è esattamente come se il computer dell'utente fosse collegato in permanenza a Internet, ma fosse spento durante tutti quei periodi in cui l'utente non è connesso con il provider. L'IP è quindi allocato staticamente, ossia corrisponde sempre e solo al particolare computer usato dall'utente per collegarsi.

Questo tipo di fornitura degli IP è molto usato negli Stati Uniti, dove la rete si è diffusa prima, ma rappresenta un grosso spreco: difatti il provider deve riservare per sè e i propri utenti 500 IP, ma ne userà soltanto dieci alla volta: poichè le linee telefoniche sono dieci, non ci potranno mai essere più di dieci utenti collegati contemporaneamente. Per questo motivo, negli ultimi anni sta prevalendo il modello dell'IP allocato dinamicamente (volgarmente, IP dinamico). In questo caso, il provider riserva per i propri utenti un numero di IP pari al numero delle linee telefoniche, e assegna ciascun IP non ad un utente, ma ad una linea telefonica. Quando un utente si collega, esso accede ad una delle linee telefoniche e "riceve" l'IP corrispondente a tale linea; quell'IP individuerà il suo computer per tutto il tempo in cui egli resterà collegato, ma quando egli si sarà disconnesso e un nuovo utente avrà occupato quella linea telefonica quello stesso IP passerà ad indicare il computer del nuovo utente. Lo stesso IP, quindi, indicherà computer diversi in momenti diversi! In questo modo, inoltre, il provider avrà bisogno di un numero molto minore di indirizzi (una rete di classe C è solitamente sufficiente), il che è anche un vantaggio per l'economia generale di Internet.

Questo sistema, tuttavia, presenta dal punto di vista dell'utente un grosso svantaggio: poichè la particolare linea telefonica su cui si collega l'utente varia imprevedibilmente ad ogni connessione, anche l'IP dell'utente non è conoscibile a priori, il che significa che l'utente non può configurare i programmi di connessione a basso livello perchè non sa quale IP avrà nella successiva connessione (per tralasciare il fastidio di dover alterare l'IP ad ogni connessione per farlo corrispondere a quello che si riceve). Il problema è stato risolto in vari modi:

  1. Usando un protocollo recente per la connessione via modem - ad esempio il PPP con l'estensione PAP o CHAP - l'indirizzo dell'utente viene comunicato automaticamente dal server al computer dell'utente.
  2. In alternativa, la maggior parte dei programmi di TCP/IP stack (e.g. Trumpet Winsock) prevedono la possibilità di inserire uno script (serie di comandi eseguiti sul momento) che permetta ad esempio di leggere un messaggio spedito dal server nella fase di apertura del collegamento e ricavare automaticamente da esso l'indirizzo IP da utilizzare (si veda ad esempio la sezione sullo script di login di Trumpet Winsock).
  3. Infine, sono stati sviluppati due sistemi per la trasmissione automatica dell'IP e di altri dati all'atto della connessione (RARP - Reverse Address Resolution Protocol - e BOOTP - Bootstrap Protocol), peraltro usati su reti locali.


Segnalibro 13.6. Che cos'è il TCP/IP? Come funziona la trasmissione di dati su Internet?

Con il nome di TCP/IP si indica normalmente un insieme di protocolli di comunicazione, che più correttamente andrebbe chiamato Internet protocol suite (collezione di protocolli Internet), che regolano le comunicazioni tra i vari computer connessi alla rete.

I protocolli contenuti in questo insieme sono essenzialmente di due tipi: alcuni di essi si occupano delle operazioni di "basso livello", ossia della spedizione di numeri binari tra i due computer che stanno dialogando, indipendentemente da cosa effettivamente significhino quei dati, mentre altri si occupano delle operazioni di "alto livello", ossia di compiere operazioni più complesse come copiare un file, spedire un E-mail, controllare un computer a distanza, indipendentemente dal modo con cui queste operazioni e i loro dati verranno trasmessi sulla rete. Tra i protocolli di basso livello i principali sono il TCP, l'IP e l'UDP; questi protocolli vengono gestiti dai cosiddetti programmi di TCP/IP stack. I protocolli di alto livello, come i vari FTP, HTTP, TELNET, SMTP, sono invece gestiti direttamente dai programmi applicativi, come i browser o il software di posta elettronica. Si noti sia la differenza tra TCP/IP (un insieme di protocolli) e TCP e IP (che sono singoli protocolli), sia che il nome IP, che designa correttamente un protocollo, è stato nell'uso comune assunto anche come nome del numero binario che identifica univocamente ciascun computer posto in rete.

Come abbiamo visto, Internet è formata dall'unione di reti locali tra loro diverse. D'altra parte, è necessario che tutti i computer, per poter comunicare, parlino la stessa lingua: l'idea è quindi quella di "sovrapporre" ai diversi protocolli locali delle varie reti un protocollo unico, che è la base su cui poi si costruirà tutto il resto; esso è appunto il protocollo IP.

Le caratteristiche fondamentali della trasmissione dei dati su Internet derivano sostanzialmente da questo protocollo, che sarà poi esaminato più attentamente nel seguito, e sono quelle di essere a pacchetto e best effort.

Segnalibro "A pacchetto" significa che il protocollo IP trasmette su Internet non un flusso continuo di dati, ma blocchi elementari di dati detti appunto pacchetti (packets), o meglio ancora datagrammi (datagrams) (nel seguito useremo comunque il termine "pacchetto", più comunemente usato in ambito non tecnico).

I vantaggi di spedire i dati binari "spezzettati" invece che in una volta sola sono molteplici:

È ovviamente necessario aggiungere a ciascun pacchetto una intestazione (header), standardizzata e di dimensione fissa, contenente alcune informazioni, per permettere poi l'"incollatura" dei pacchetti presso il destinatario e il controllo degli errori (spesso si dice che l'intestazione funge da "busta elettronica": una busta vera, difatti, viene letta prima del messaggio e contiene informazioni necessarie per la consegna e indipendenti dal contenuto della lettera). Questo è uno degli svantaggi del sistema a pacchetti: tanto più i pacchetti sono piccoli, tanto più una parte rilevante del tempo di trasmissione è impiegata nel trasmettere le intestazioni invece che i dati che esse contengono! (Un po' come spedire 10 kg di materiale avendo a disposizione solo contenitori che pesano ciascuno mezzo chilo: se si mettono i 10 kg in un pacco solo il postino dovrà trasportare 10,5 kg di roba, se si fanno 100 pacchi da un etto il postino dovrà trasportare 60 kg!).

"Best effort" (per i maligni, send and pray) significa che, a differenza di quanto avviene nelle reti di telecomunicazione tradizionali, come quella telefonica, non c'è nessuna garanzia sul funzionamento del servizio. Quando si spedisce un pacchetto di dati su Internet, si può solo sperare che arrivi: la rete garantisce di fare tutto il possibile per consegnarlo a destinazione, ma può darsi che per l'eccessivo traffico il pacchetto si perda o venga eliminato. Nella rete telefonica, invece, quando si inizia a comunicare si ha la garanzia che una quantità sufficiente di risorse di rete (cavi, circuiti...) sono state riservate per la comunicazione, e che lo saranno finchè l'utente non l'avrà terminata. Per questo motivo, se vi cade la linea durante una telefonata avete tutto il diritto di arrabbiarvi con la Telecom, mentre se vi si interrompe un collegamento su Internet non potete arrabbiarvi con nessuno; d'altra parte, anche per lo stesso motivo, l'uso della rete telefonica non è gratuito, mentre quello di Internet sì. Dal punto di vista commerciale, è ben difficile far pagare un servizio senza offrire garanzie sulla sua qualità, e d'altra parte se nessuno paga per i servizi che usa non ci sono soldi per migliorare la rete: questo è il maggior ostacolo ad un ulteriore sviluppo di Internet, ed è proprio quello che ha portato allo sviluppo di tecniche innovative come ATM.

Il protocollo IP, che rappresenta il livello più basso del TCP/IP, viene "sovrapposto" ai protocolli delle LAN sottostanti: questo significa che, ogni volta che il programma di gestione del protocollo IP deve trasmettere un pacchetto, lo affida ai protocolli di livello inferiore, che sono quelli che sanno come trasmettere dati sul particolare tipo di rete locale a cui appartiene il computer, o sulla linea telefonica se si è collegati via modem.


Segnalibro 13.7. Che cos'è il "modello di comunicazione a livelli"?

Prima di proseguire, è meglio precisare bene il concetto di livello (o strato, in inglese layer) in un sistema di telecomunicazione. Il modello a livelli è stato standardizzato, a livello astratto, dal cosiddetto protocollo ISO/OSI; l'idea è quella di suddividere le funzioni che devono essere svolte dai computer che vogliono comunicare sulla rete, partendo dalle operazioni più elementari, come trasmettere un bit su un cavo elettrico, che vengono poste al livello più basso, ed arrivando fino alle operazioni più generali, come trasmettere un file o un messaggio di posta elettronica, che vengono poste al livello più alto, e che, per essere eseguite, necessiteranno di sfruttare le operazioni più semplici compiute dai livelli inferiori. Ciascun livello, per eseguire gli ordini del livello superiore, svolge alcune operazioni di propria competenza e, in più, sfrutta i servizi forniti dal livello inferiore; esso ignora completamente le caratteristiche dei livelli superiori o inferiori, e non ne comprende nè il ruolo nè le strutture dati. In questo modo, il problema più generale di comunicare viene suddiviso in sottoproblemi, che possono essere risolti in modo completamente indipendente e intercambiabile, avendo il solo obbligo di rispettare le specifiche sul modo di ricevere ordini dal livello superiore e di darne al livello inferiore.

Senza troppe pretese di rigore, il modello a livelli può essere facilmente esemplificato nel modo seguente. Supponiamo che un utente debba copiare un file lungo 100000 byte dal proprio computer ad un altro tramite il protocollo FTP, ossia un protocollo del livello più alto, che viene gestito direttamente dai programmi applicativi che usa l'utente. Per prima cosa egli dà il relativo comando al suo programma cliente FTP. Il protocollo FTP prevede un modo molto semplice di spedire un file: sostanzialmente, il cliente manda al server FTP un comando prestabilito seguito dai dati contenuti nel file da spedire (e questo è ciò che si definisce un messaggio). Ora, il protocollo FTP ha il problema di far giungere il comando e i dati al computer remoto: poichè esso non è capace di farlo da solo, si rivolge ad un protocollo di livello inferiore, che è uno di quelli di cui non abbiamo ancora parlato: il TCP. Il programma che "parla" il protocollo FTP si rivolge al programma che "parla" il protocollo TCP, dicendogli: "Senti, io devo mandare al computer X, identificato dall'indirizzo IP a.b.c.d, questo messaggio:" e quindi aggiunge la sequenza di bit corrispondente ai dati che deve mandare.

Il TCP, dal canto suo, non ha la minima idea di cosa significhi quella stringa binaria: non sa che si tratta di un comando seguito da un file, e del resto questo non gli interessa; sa solo che il suo lavoro è farla arrivare così come è e senza errori al computer X. Questo è un principio generale: ogni livello non sa cosa fanno tutti gli altri, ma Pertanto esso prende questa stringa, e, per i motivi visti prima, la divide in pacchetti, ad esempio di 500 byte, e li numera in modo che poi possano essere riappiccicati nell'ordine giusto. Dopo di ciò si accorge che sì, lui sa fare tante belle cose, ma non sa spedire i singoli pacchetti di dati lungo la rete, anche perchè non sa stabilire che strada fargli percorrere per arrivare fino al computer X; allora si rivolge ad un protocollo di livello inferiore, che è l'IP, e gli passa, uno alla volta, i singoli pacchetti dicendogli: "Ehi, senti, potresti spedire al computer X, identificato dall'indirizzo IP a.b.c.d, questo pacchetto?".

L'IP, dal canto suo, non solo non ha la minima idea di che tipo di dati siano contenuti nei singoli pacchetti, ma non ha neanche idea che da qualche parte esista un protocollo chiamato FTP, nè sa che in quel pacchetto da mandare ci sono un po' di dati del file da spedire e un po' di dati aggiunti dal TCP, come ad esempio il numero d'ordine del pacchetto; non solo, ma non sa neanche che quello è il ventiquattresimo pacchetto di una serie di duecento che contengono il file originario: tutto quello che lui fa è prendere quel pacchetto e mandarlo al computer X; cosa ci debba fare il computer X con quel pacchetto è problema che non lo riguarda. L'IP, in particolare, determina che strada debba fare quel singolo pacchetto (si noti che, visto che per l'IP ciascun pacchetto è completamente separato dagli altri, i vari pacchetti dello stesso file possono seguire strade diverse!), e in particolare quale altro computer della rete locale rappresenti il miglior passo successivo (next hop) verso la destinazione. Una volta decisa la strada, arriva fino alla presa di rete - o al modem, se siete collegati via telefono - e poi dice: "Però, diavolo, qui c'è - ad esempio - un cavo coassiale: io non so mica come fare a spedire dei numeri binari su un cavo coassiale!". Cosa fa allora l'IP? Semplice: chiama un protocollo di livello ancora inferiore, che è appunto quello di controllo logico della rete locale, ed è quindi diverso a seconda del tipo di rete su cui il computer è collegato, e gli passa il pacchetto, insieme all'indirizzo del computer a cui essi devono essere mandati; poichè stiamo agendo a livello di singola rete locale, non si tratterà più dell'indirizzo IP, ma di un indirizzo scritto in un formato comprensibile e proprio di quella particolare rete locale, ricavato dall'indirizzo IP mediante un sistema di conversione (ad esempio il protocollo ARP).

Potremmo proseguire così, scendendo tra i vari livelli dei protocolli caratteristici della singola rete locale (LLC e MAC), fino ad arrivare al livello fisico, il cui compito è trasmettere fisicamente una sequenza di bit generata dal livello superiore (e di cui quindi esso ignora il significato). Ad esempio, può darsi che tale protocollo preveda che ogni volta che si deve spedire un 1 bisogna immettere sul cavo coassiale una tensione di +5 Volt e mantenerla costante per un microsecondo, ogni volta che deve si deve spedire uno 0 bisogna immettere -5 Volt sempre per un microsecondo: il relativo programma, o meglio ancora l'hardware del computer o del modem, provvede a tradurre la stringa di numeri binari in una serie di tensioni successivamente immesse sul cavo.

Che cosa succede sul computer X? Beh, su di esso sta funzionando un altro programma che supporta il protocollo fisico, sta in ascolto e sente che sul cavo arriva una sequenza di tensioni, ad esempio +5 +5 -5 +5 -5 -5 -5 +5...; il suo lavoro è quella di tradurla nella corrispondente stringa binaria 11010001... (In realtà, il computer X potrebbe essere posto su una rete locale diversa, in cui il protocollo fisico è diverso, per cui il pacchetto potrebbe arrivargli ad esempio sotto forma di impulsi luminosi su una fibra ottica.) Dopo aver fatto questo, il suo lavoro è terminato: pertanto esso prende questa stringa e la passa al livello superiore, ossia ai programmi di gestione della LAN e quindi, risalendo i livelli, al programma di IP che sta funzionando sul suo computer. Questo IP prende la stringa di numeri binari e capisce che essa forma un pacchetto - del resto, il suo lavoro è trasportare pacchetti - e pertanto ricostruisce il pacchetto e lo passa al TCP del suo computer, che provvede a rimettere in ordine i pacchetti secondo il numero apposto dal TCP del computer dell'utente, a controllare se ci sono tutti e, in tal caso, a spedire un messaggio di "tutto OK" al mittente (ossia, prepara un messaggio che significa convenzionalmente "tutto OK", se è troppo lunga la divide in pacchetti, la passa al suo IP che determina che strada deve seguire...); quindi passa il messaggio vero e proprio al server FTP, che interpreta il comando e scrive il file sul computer remoto. Va notato che il programma server FTP non ha la minima idea di come effettivamente quel file sia arrivato fin lì: per lui, i livelli inferiori potrebbero anche non esistere, perchè quello che vede arrivare è semplicemente il comando FTP "scrivi questo file sul tuo hard disk"! Inoltre con questa struttura si ha ad esempio il vantaggio che, se cambia il mezzo fisico con cui sono collegati i computer, basta cambiare il protocollo di livello più basso, mentre gli altri (IP, TCP, FTP...) possono funzionare ugualmente e allo stesso modo su tutta Internet indipendentemente dal tipo di collegamento fisico esistente tra i computer.

Se ancora non aveste capito, una similitudine può essere fatta con quanto avviene per una persona che deve parlare ad un'altra: una parte del cervello pensa ai concetti che devono essere espressi, quindi, non sapendo come esprimerli, li passa ad un'altra parte (il livello inferiore) che trasforma i concetti in una frase in un determinato linguaggio, quindi divide la frase nelle singole parole e passa, in modo separato, ciascuna parola ad una terza parte del cervello, che decide come dovranno muoversi i vari muscoli del corpo per poter pronunciare la singola parola e farla giungere al destinatario, quindi passa i vari comandi ai muscoli (il livello fisico) che provvedono effettivamente alla trasformazione della parola (un concetto astratto, come una stringa di numeri binari) in qualcosa di fisico (ossia una serie di movimenti e onde di pressione nell'aria) che può effettivamente venire trasmesso.

Tutto questo era relativamente impreciso e molto semplificato per poter essere abbastanza comprensibile anche dai meno esperti; tuttavia, per i più interessati, le domande successive descrivono più in dettaglio vari aspetti della comunicazione, come il concetto di porta, il funzionamento del TCP e dell'IP e il modo con cui vengono determinati i percorsi da far percorrere ai pacchetti.


Segnalibro 13.8. Che cos'è e come funziona l'IP (protocollo)?

L'IP (Internet Protocol) è il protocollo che si occupa di consegnare al computer remoto i singoli pacchetti, che vengono generati dai livelli superiori (ossia, dal TCP o, più raramente, da altri protocolli di controllo della trasmissione). A questo scopo, esso prende ogni singolo blocco di dati che arriva dal livello superiore e vi aggiunge una ulteriore intestazione di 20 byte (che va a posizionarsi prima dell'header del TCP, che a sua volta precede il blocco di dati vero e proprio) contenente dati come gli indirizzi IP numerici del computer mittente e del computer destinatario. Inoltre sono presenti altri campi, come un numero di protocollo che indica a quale protocollo di livello superiore va riconsegnato il pacchetto (normalmente è il TCP); una checksum che permette di individuare gli errori di trasmissione; un tempo di vita (time to live) che serve, come si vedrà, a evitare cicli infiniti. Inoltre, esiste un numero di versione; a questo proposito, è attualmente in corso - e durerà molti anni - la transizione dalla versione 4 alla versione 6 (detta anche IPng o IP Next Generation), che permetterà di collegare alla rete un numero molto maggiore di computer.

L'IP è un protocollo di tipo non connesso (connectionless): questo significa che i dati vengono affidati alla rete, che poi, in maniera separata pacchetto per pacchetto, provvede a consegnarli; chi trasmette non attende alcun segnale di ricevuto dal destinatario, e non si ha controllo sul fatto che la trasmissione vada a buon fine, che la velocità di trasmissione sia appropriata, o che i pacchetti non si mescolino e non si duplichino. Ovviamente, non ci si può aspettare un risultato di qualità da un approccio di questo tipo: difatti, i protocolli di controllo della trasmissione, come il TCP, servono proprio a garantire un minimo di controllo sul corretto ricevimento dei dati.

Compito dell'IP è soprattutto quello di decidere quale strada far prendere ai singoli pacchetti; difatti, il livello IP trasmette i dati sfruttando il livello inferiore, che è quello caratteristico della rete locale: per questo motivo, esso deve decidere qual è il successivo computer attraverso cui il pacchetto deve passare per giungere al destinatario (next hop), limitando la scelta a quelli direttamente connessi alla rete locale su cui sta trasmettendo, poichè essi sono gli unici raggiungibili dal protocollo di rete locale a cui il pacchetto sta per venire affidato. Per questo motivo, l'implementazione del livello IP è la parte più importante dei router! Inoltre, l'IP deve provvedere a convertire gli indirizzi IP in indirizzi comprensibili alla particolare rete locale su cui si sta appoggiando, mediante protocolli come l'ARP.

Una volta deciso a quale computer andrà spedito il pacchetto, il livello IP passa pacchetto e indirizzo del successivo destinatario al protocollo fisico della rete locale (generalmente una rete Ethernet), che provvede alla consegna.


Segnalibro 13.9. Che cos'è il "numero di porta" in una comunicazione?

Ciascun computer connesso alla rete può avere in corso un certo numero di conversazioni con molti computer diversi, e inoltre uno stesso computer può stare svolgendo con esso più conversazioni parallele (pensate ad esempio cosa succede quando vi collegate contemporaneamente con un cliente FTP e con un cliente Telnet allo stesso computer, oppure quando dal vostro browser aprite due finestre e con esse richiedete di leggere due ipertesti diversi ma posti sullo stesso computer).

È quindi necessario che le varie conversazioni non si mescolino tra loro. Per ottenere questo, si fa finta che ciascun computer disponga di un certo numero di porte (ports) per comunicare con la rete - un po' come ad esempio un ripetitore irradia nell'etere su un certo numero di "canali" diversi - e si assegna a ciascuna conversazione che il computer sta intavolando un numero di porta diverso. Il tutto funziona un po' come se, attraverso un corridoio, due uomini dovessero trasportare un certo numero di oggetti dalla stanza 1 alla stanza 2; per evitare confusioni le due stanze potrebbero avere ognuna due porte che danno sul corridoio, una rossa e una blu, e si potrebbe fare in modo che uno dei due uomini usi sempre le porte rosse mentre l'altro usi sempre le porte blu. In realtà, i numeri di porta impegnati in ciascuna conversazione sono due - uno su ciascun computer. Perchè due conversazioni possano essere distinte è allora sufficiente che anche uno solo dei due numeri di porta sia diverso. (Contrariamente all'esempio degli uomini e del corridoio, le "porte" di un computer non esistono fisicamente: tutte le comunicazioni passano attraverso la stessa presa di rete. Pertanto non c'è nessun problema ad avere più di una comunicazione in corso sulla stessa porta, basta che esse avvengano con computer diversi o anche con lo stesso computer ma con un suo numero di porta diverso). Quando su un computer sono in esecuzione un certo numero di programmi diversi che devono dialogare con la rete, comunque, ciascuno di essi usa un numero di porta diverso.

Ciascun computer, su Internet, può avere 65536 porte diverse. Si pone allora il seguente problema: un utente, con il suo computer, vuole recuperare un file da un archivio FTP. Egli conosce l'indirizzo del sito FTP; tuttavia, come fa a sapere quale delle 65536 porte di quel computer è stata assegnata al programma server FTP con cui il suo cliente FTP deve dialogare? Questo problema è stato risolto prevedendo alcuni numeri di porta standard (well known port numbers) assegnati ai server per i vari protocolli: in particolare, quando si intavola una connessione FTP, se non diversamente specificato, il cliente manderà i suoi messaggi alla porta 21 del ricevente (mentre sul proprio computer userà un numero di porta libero e a piacere, tipicamente da 1000 in poi). Naturalmente, è possibile anche far girare un server FTP su un qualsiasi altro numero di porta, ma se gli utenti non lo conoscono non potranno accedere al sito, perchè i loro clienti FTP, a meno che non gli si dica altrimenti, richiederanno i file alla porta 21. Tra l'altro, questo è un metodo molto usato per proteggere da occhi indiscreti siti FTP a cui solo gli utenti autorizzati possono accedere - tipo i siti dei pirati informatici! Alcuni numeri di porta standard sono 21 (FTP), 23 (Telnet), 25 (SMTP), 80 (HTTP), 110 (POP3), 119 (NNTP).

Ovviamente, il numero di porta non interessa al livello IP, il cui compito è molto più elementare: prendere pacchetti e spedirli ai computer di destinazione, indipendentemente dall'attività di alto livello a cui tali pacchetti sono correlati. Il numero di porta, invece, è gestito dal livello che riceve i dati dai protocolli dello strato più alto: questo è il livello di controllo della trasmissione, tipicamente corrispondente al protocollo TCP.


Segnalibro 13.10. Che cos'è e come funziona il TCP?

Il TCP (Transmission Control Protocol) è il protocollo che si occupa del controllo e della preparazione dei dati per la trasmissione vera e propria (che viene effettuata dai protocolli di livello inferiore, ossia l'IP). Esso riceve dai protocolli di livello superiore un flusso continuo di dati da trasmettere e l'indirizzo IP del computer a cui essa deve essere spedita; mette in coda i dati che gli arrivano dai livelli superiori, e contemporaneamente estrae dall'inizio della coda i dati che può trasmettere, sotto forma di pacchetti. Difatti, è compito del TCP quello di creare i pacchetti che poi saranno trasmessi dall'IP. A livello di TCP, i blocchi di dati si chiamano segmenti; aggiungendo le informazioni di controllo, ciascun segmento diventa un pacchetto.

Su ciascun computer possono essere in corso parecchi collegamenti; tuttavia, la linea di trasmissione è una sola... Per questo motivo, tra i compiti del programma che gestisce il protocollo TCP vi è anche quello di multiplare le connessioni, ossia di raccogliere i dati che devono essere spediti dai vari programmi che usano la rete e di metterli in una coda unica, suddividendo tra tutti le capacità trasmissive disponibili; inoltre, esso deve demultiplare i dati ricevuti, consegnando i byte giusti a ciascun destinatario. Il modo con cui il TCP distingue le varie comunicazioni in corso sul computer è proprio il già citato numero di porta!

La caratteristica più importante del TCP è quella di essere connesso (connection oriented), ossia di stabilire un collegamento con il computer di destinazione, dialogando con esso allo scopo di capire se i dati vengono ricevuti correttamente. Come abbiamo visto, difatti, il sottostante protocollo IP è non connesso: pertanto, se voglio controllare la trasmissione devo necessariamente farlo a questo livello.

In particolare, la connessione viene sfruttata per effettuare tre tipi di controllo:

  1. Controllo d'errore, ossia il controllo sul fatto che ciascun segmento non sia stato modificato lungo il percorso a causa di errori di trasmissione;
  2. Controllo di sequenza, ossia il controllo che i vari segmenti, "scavalcandosi" lungo il percorso, non vengano riappiccicati in un ordine diverso da quello originario;
  3. Controllo di flusso, ossia il controllo della velocità di trasmissione per evitare di saturare la rete o di perdere dati in zone congestionate.

Per garantire questi tre controlli, il TCP aggiunge a ciascun segmento di dati una intestazione, normalmente lunga 20 byte, le cui principali informazioni sono:

  1. Numero di porta usata dal mittente: indica quale porta il mittente sta usando per trasmettere;
  2. Numero di porta usata dal destinatario: indica a quale porta del destinatario va consegnato il pacchetto;
  3. Numero d'ordine del pacchetto (sequence number) all'interno dell'intero insieme di dati da trasmettere: indica il numero d'ordine del primo byte di dati contenuto nel pacchetto (ad esempio se i pacchetti sono di 500 byte, essi porteranno i numeri d'ordine 0, 500, 1000...);
  4. Numero di "riconoscimento" (ACK number): indica quanti byte di dati sono stati ricevuti correttamente dal mittente fino a quel momento, ossia il numero d'ordine del prossimo pacchetto che il mittente si attende di ricevere dal destinatario;
  5. Finestra libera del mittente: indica il numero di byte che il mittente può ricevere, nel momento in cui spedisce questo pacchetto, prima di venire saturato (ovvero di non avere più il tempo di leggere nuovi pacchetti perchè troppo impegnato a trattare i precedenti);
  6. Checksum: è un numero ottenuto (più o meno) sommando tutti i byte di dati contenuti nel pacchetto, e serve al controllo d'errore: se il destinatario riceve un pacchetto in cui, sommando tutti i byte di dati, si ottiene un numero diverso da quello riportato nel campo "Checksum" allora certamente esso è stato alterato durante la trasmissione, per cui si è verificato un errore e il pacchetto va scartato;
  7. Indicatore di urgenza: dice al destinatario di leggere immediatamente il pacchetto in arrivo, lasciando perdere eventuali pacchetti arrivati in precedenza e ancora in attesa di essere letti e trattati.

Il controllo di sequenza è effettuato mediante un meccanismo noto come go back N, che funziona nel modo seguente:

  1. Il programma di TCP del computer mittente, che chiameremo A, dopo aver diviso i dati in pacchetti, comincia a spedirli: questi pacchetti contengono al proprio interno i dati da spedire, e nell'intestazione contengono i due numeri di porta, il numero d'ordine, la checksum e l'eventuale indicatore d'urgenza.
  2. Il computer B, ogni volta che riceve correttamente un pacchetto, spedisce al computer A un pacchetto che significa "tutto OK" (spesso detto ACK). Questo pacchetto non contiene dati; è semplicemente una intestazione contenente i due numeri di porta (che ovviamente saranno invertiti rispetto ai pacchetti normali: per questo pacchetto, il mittente è B e il destinatario è A), il numero di riconoscimento e la finestra. Tramite il numero di riconoscimento, B dice ad A: "Guarda che mi sono arrivati correttamente i primi ... (500, 1000, 1500... ) byte del messaggio"; tramite la finestra, B dice ad A: "Guarda che posso ancora ricevere altri ... (0, 2000, 20000, 200000) byte prima di non poter più leggere i pacchetti che mi mandi". Si noti che B deve ricevere i pacchetti in ordine: se ad esempio riceve i primi due pacchetti e poi il quarto, i byte correttamente ricevuti saranno 1000 e non 2000, perchè mancano i byte dal 1000 al 1499; il quarto, nel caso vi sia spazio disponibile nella memoria del ricevitore, potrà essere conservato, oppure sarà buttato via. Difatti, scopo del TCP al ricevitore è ricostruire in maniera ordinata il flusso di dati che è stato consegnato al trasmettitore, per poterlo fornire ai livelli superiori; non posso quindi tollerare buchi, e non posso certo consegnare ai livelli superiori il quarto pacchetto prima del terzo! Scopo del TCP è proprio quello di fornire al livello superiore del destinatario i dati in perfetto ordine e senza errori.
  3. Se tutto sta andando bene, il computer A legge la finestra disponibile in B, dà un'occhiata a quanti pacchetti ha spedito nel frattempo (ossia nel tempo in cui il pacchetto di ACK ha viaggiato da B ad A) e decide se può spedirne altri oppure deve aspettare un po' di tempo per lasciare che B abbia il tempo di trattare i pacchetti già ricevuti ed aumentare quindi la sua finestra, liberando spazio per nuovi pacchetti. Se invece A ha mandato ad esempio i primi quattro pacchetti, ma è già trascorso un certo periodo di tempo (prefissato e detto timeout) ed ha ricevuto il corrispondente ACK solo per i primi due (ossia l'ultimo ACK portava come numero di riconoscimento 1000 e non 2000), decide che qualcosa deve essere andato storto nella trasmissione del terzo e del quarto pacchetto e li ritrasmette. In realtà, il quarto pacchetto potrebbe anche essere giunto correttamente; tuttavia, il trasmettitore non può sapere se questo è effettivamente avvenuto e se il ricevitore aveva abbastanza memoria per conservarlo, per cui, nel dubbio, ritrasmette tutto. In questo modo, si evitano anche lunghi e complessi dialoghi in cui il ricevitore informa il trasmettitore su quali dati siano arrivati e quali no.

Per ottimizzare le cose, è possibile fare il cosiddetto piggy-backing degli ACK: invece di trasmettere gli ACK in un apposito messaggio, li si "infila" nell'intestazione del primo blocco di dati che deve andare in senso contrario, dal destinatario al mittente!

Il TCP non prevede, nel caso si verifichi un errore di trasmissione, la correzione dell'errore direttamente da parte del destinatario (cosa per cui sarebbe necessario aggiungere ulteriori informazioni), ma piuttosto prevede che il destinatario richieda al mittente la ritrasmissione dei pacchetti che non sono giunti correttamente; questa è una caratteristica delle reti dati, dove è più importante la correttezza dei dati che la velocità complessiva del trasferimento.

Il meccanismo delle finestre serve anche al controllo di flusso: se il trasmettitore si accorge che il ricevitore non riceve correttamente i pacchetti, ne deduce che da qualche parte in rete c'è una situazione di congestione, e quindi rallenta la trasmissione.

Segnalibro La quantità di dati contenuta in ciascun pacchetto, infine, non è sempre la stessa; difatti i due computer che devono parlarsi possono essere molto diversi ed avere quindi capacità diverse. Nell'ambito del TCP/IP è quindi molto importante il parametro chiamato MTU (Maximum Transmission Unit), che corrisponde alla massima lunghezza di un pacchetto IP, espressa in byte; ad esso è associato il parametro MSS (Maximum Segment Size), che corrisponde alla massima lunghezza di un segmento di dati del TCP. Poichè, come abbiamo appena detto, un pacchetto IP è generato dal TCP e dall'IP aggiungendo le proprie intestazioni a ciascun segmento di dati, e poichè le due intestazioni sono di norma lunghe 20 byte ciascuna, il MTU è normalmente (almeno) 40 byte più grosso del MSS. D'altra parte, ciascuna rete locale ha una propria dimensione massima dei pacchetti; quando i due computer stabiliscono il collegamento, prima di cominciare a mandarsi i pacchetti veri e propri, decidono seguendo una procedura standard quale sarà la grandezza dei pacchetti stessi, scegliendo la minore delle due dimensioni ottimali per i due computer. Si tratta di un problema non di scarso rilievo, perchè nel caso che il pacchetto sia più lungo della dimensione massima compatibile con la rete su cui deve essere trasmesso, esso deve essere frammentato in sotto-pacchetti, e poi ricomposto dal destinatario, il che provoca inefficienza nell'uso della rete.


Segnalibro 13.11. Come viene decisa la strada che percorrono i pacchetti?

Il compito di indirizzare i pacchetti verso la destinazione finale è assolto dal livello IP dei router (indirizzatori), ossia da computer dedicati e costruiti a questo scopo, a cui tutti gli utenti trasmettono i messaggi perchè essi vengano girati ai destinatari. Teoricamente è sufficiente un normale computer con software adatto, ma di fatto esistono industrie che costruiscono macchine specializzate per garantire alte prestazioni in questi campi: un normale PC non potrebbe certo reggere efficientemente il traffico generato da un centinaio o un migliaio di altri PC collegati alla rete... In realtà, il modello a router non è l'unico possibile: ad esempio la rete Ethernet (lo standard di basso livello più diffuso per le reti locali) indirizza i messaggi in modo molto semplice: tutti i messaggi vengono spediti a tutti i computer, e poi ciascuno controlla se il messaggio è diretto a lui. Ovviamente, su una rete di grandi dimensioni questa politica sarebbe folle.

Come primo passo della trasmissione, il computer dell'utente spedisce i propri pacchetti al router che collega la sua rete locale al resto di Internet; il router è a sua volta collegato ad almeno un'altra rete locale (e, per poter essere accessibile da ciascuna delle reti a cui è connesso, possiede un diverso indirizzo IP numerico per ognuna di esse). Ogni router può spedire direttamente dati a tutti i computer collegati alle reti locali a cui è connesso, e quindi anche a tutti gli altri router che sono collegati ad esse. Esso dispone quindi di una lunga tabella contenente un elenco il più possibile completo delle migliaia di reti locali connesse ad Internet; per ciascuna di esse, nell'elenco figura l'indirizzo IP di uno degli altri router a cui è collegato direttamente, che rappresenta la "direzione giusta" verso tale rete. Esso spedirà quindi i propri pacchetti a tale router, che a sua volta avrà una tabella con le ulteriori "direzioni giuste".

In sostanza, ogni router è un "incrocio" di reti locali, e la tabella rappresenta un grosso insieme di cartelli indicatori che indicano la strada migliore da prendere per raggiungere le varie destinazioni finali; ciascun router non ha idea di come sia fatta la rete al di là delle singole reti locali a cui è connesso, ma sa che ogni volta che gli arrivano pacchetti per una determinata destinazione li deve indirizzare in una determinata direzione. Di router in router, alla fine i pacchetti arrivano ad un router che è direttamente collegato alla rete locale del computer destinatario, e vengono consegnati.

Poichè nessuno è perfetto, tuttavia, può succedere che per qualche motivo alcuni pacchetti continuino a girare in circolo (il router A li manda al router B, B al router C e C ad A). Per evitare che piano piano questo tipo di pacchetti, continuando a girare in tondo e accumulandosi, saturi la rete, ad ogni pacchetto IP è associato un tempo di vita (time to live o TTL), che rappresenta il massimo numero di router che esso può incontrare nel suo cammino. Ogni router attraverso cui transita il pacchetto sottrae uno al suo tempo di vita; quando esso arriva a zero, il pacchetto viene distrutto.

Le cose sono ulteriormente complicate dal fatto che la rete è in continua evoluzione: esistono metodi e protocolli che permettono ai vari router di imparare nuove strade. Se un router non conosce la rete locale a cui sono destinati i pacchetti, ad esempio, solitamente li spedisce ad un "gateway di default" che è supposto essere il più aggiornato. Inoltre, un router può rispedire i pacchetti ricevuti a quello che glieli ha mandati, con l'indicazione "questa non è la strada giusta, la prossima volta usa l'altra".

Teoricamente, anche il computer dell'utente dovrebbe avere una tabella di routing, almeno nel caso in cui la sua rete locale abbia più di un router. In realtà, per non caricare i computer degli utenti anche con questo tipo di problemi, solitamente i programmi di TCP/IP stack utilizzano un default gateway a cui mandano tutti i pacchetti; soltanto lì le strade dei vari pacchetti si divideranno. (Con certi sistemi, ad esempio lo SLIP, non è neppure richiesto il default gateway.)

Se vi interessa sapere quale strada percorrono i vostri pacchetti, è sufficiente che vi procuriate un programma di Traceroute.


Segnalibro 13.12. Cosa sono UDP, ICMP, ARP?

Il TCP è il principale protocollo per la gestione dei messaggi e il controllo della trasmissione, ma non è l'unico: talvolta accade difatti di avere messaggi estremamente corti, come le segnalazioni d'errore o le richieste di conversione DNS da nome a numero IP e viceversa. Per questo tipo di messaggi, è inutile usare il grosso e complesso TCP; si possono usare altri protocolli di controllo della trasmissione, che continueranno peraltro a servirsi del protocollo IP per l'indirizzamento.

La scelta più gettonata è l'UDP (User Datagram Protocol), che spedisce messaggi che non siano più lunghi di un pacchetto, e sostanzialmente si limita ad assegnare al messaggio un numero di porta e una checksum. Per i messaggi diretti al software di gestione della rete, come ad esempio i messaggi d'errore tra i router, esiste poi l'ICMP (Internet Control Message Protocol). Comunque, quasi tutti i protocolli di alto livello (HTTP, FTP, SMTP...) si servono del TCP come protocollo per il controllo di trasmissione.

Segnalibro L'ARP (Address Resolution Protocol) è invece il sistema per tradurre indirizzi IP in indirizzi fisici relativi alla particolare rete locale a cui è collegato il computer. Poichè la maggior parte delle reti locali (ad esempio Ethernet) è di tipo broadcast, ossia i messaggi viaggiano su un solo cavo a cui tutti sono attaccati, arrivano fisicamente a tutti, e poi ciascuno decide se il messaggio è diretto a lui o no, basta inviare un messaggio a tutti chiedendo "Di chi è questo indirizzo IP?", e il proprietario dell'indirizzo risponderà con il proprio indirizzo fisico, che sarà annotato e memorizzato. Su reti non broadcast, invece, è necessario predisporre server con tabelle di risoluzione degli indirizzi (è il caso di ATM).


Leggi il quattordicesimo capitolo

(C) 1996-1998 Vittorio Bertola - v.bertola@goemon.polito.it