You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
server. Risultato finale: entrambi i lati fermi in attesa dell'ar-<br />
rivo di n. situazione nota anche come stallo.<br />
La principale causa di perdita di pacchetti è il congestiona-<br />
mento dei cosiddetti router o instradatori, responsabili del-<br />
la gestione del traffico su Internet e paragonabili agli atleti<br />
di una corsa a staffetta. Se in un determinato momento un<br />
router riceve una quantità di dati superiore alle sue capa-<br />
cità di smistamento, esso si limita a ignorare i pacchetti IP<br />
in più (fenomeno noto come dropping), contando sul fatto<br />
che i protocolli superiori provvedano a rispedirli prima o<br />
poi.<br />
In molti casi di stallo non resta che aspettare. Esistono am-<br />
biti però in cui tale approccio è poco conveniente. Suppo-<br />
nendo di lavorare inviando blocchi di dati, per esempio<br />
una struttura, perché attendere n se l'applicazione sa che il<br />
suo contenuto è reso obsoleto da n+l? Un caso tipico è un<br />
gioco che informi l'altro computer dello stato del personag-<br />
gio, inviando continuamente le sue coordinate, energia, abi-<br />
lità, oggetti posseduti e via dicendo. Oppure, ancora, esisto-<br />
no applicazioni come la trasmissione audio in cui il fattore<br />
tempo è critico e in cui si fa uso di algoritmi adattivi in gra-<br />
do di lavorare anche se viene persa una parte dei dati.<br />
In tali situazioni è quindi utile UDP, protocollo "ombra" di<br />
TCP, il quale è ben più famoso in virtù dei tanti protocolli<br />
superiori che ad esso fanno ricorso (tra i tanti, HTTP, FTP,<br />
SMTP, Telnet e NNTP).<br />
Trasmissione fai-&-te<br />
Se da parte sua TCP stabilisce una connessione con il com-<br />
puter remoto, negozia alcuni parametri, scambia dati (con<br />
tanto di bufferizzazione bidirezionale) e infine chiude il<br />
collegamento, UDP non prevede nulla di tutto ciò. Esso in-<br />
via direttamente i blocchi di dati, non garantendone l'arri-<br />
vo. Ciò comporta un carico molto minore, innanzitutto per-<br />
ché viene a mancare totalmente la fase di apertura e chiu-<br />
sura del collegamento, ma anche perché in fase di scambio<br />
dati non awiene gestione di buffer in uscita, verifica di av-<br />
venuta ricezione o riordinamento dei dati. In virtù di ciò,<br />
TCP è definito come un protocollo con connessione e afJZ-<br />
dabile, mentre UDP è senza connessione e inaffidabile.<br />
Per capire meglio le differenze, si possono paragonare i<br />
protocolli a una comunicazione che avvenga rispettiva-<br />
mente tramite telefono (TCP) o posta (UDP). Nel primo ca-<br />
so, si invia una richiesta di connessione (si compone il nu-<br />
mero finché l'abbonato non risponde), si negoziano alcuni<br />
parametri (si chiede di parlare con la persona a cui si è in-<br />
teressati), awiene lo scambio di dati (si parla con l'interlo-<br />
cutore), si chiude infine la connessione (si riaggancia).<br />
Nel secondo caso, invece, ci si limita a preparare i dati (si<br />
scrive la lettera) e inoltrarli al destinatario (la si invia), nella<br />
speranza che il protocollo (il servizio postale) li recapiti<br />
con successo e che all'indirizzo indicato vi sia una applica-<br />
zione in attesa di dati (qualcuno che legga la lettera). Nel<br />
caso di invii multipli, inoltre, può capitare che due lettere<br />
spedite in giorni diversi siano consegnate e quindi lette in<br />
ordine inverso.<br />
L'apparente povertà di funzionalità di UDP viene bilanciata<br />
dalla maggiore flessibiliti. A seconda delle sue esigenze, in<br />
caso di mancato arrivo di pacchetti, l'applicazione può ri-<br />
spedirne alcuni ritenuti "chiave" o proseguire normalmen-<br />
te. Tocca quindi al programmatore stabilire l'approccio più<br />
consono, modellando opportunamente il codice.<br />
Dalla teoria a h pratica<br />
Un esempio, si sa, vale mille parole. Vediamo quindi un sem-<br />
plice programma, il cui sorgente appare nel Listato 1. Esso si<br />
limita a inviare e ricevere pacchetti a un'altra copia del pro-<br />
gramma, in esecuzione sullo stesso computer o su una<br />
macchina remota. Una comunicazione UDP awiene usan-<br />
do funzioni analoghe a quelle usate per TCP e descritte nel<br />
numero 81 di TransAction, analizzeremo quindi solo le dif-<br />
ferenze rispetto al precedente articolo. Per maggiore como-<br />
dità, si è fatto ricorso alle funzioni di autoinizializzazione e<br />
di chiusura della libreria statica netlib, che aprono e chiu-<br />
dono automaticamente SocketBase. Lo stesso socket viene<br />
deallocato automaticamente dalla libreria bsdsocket.<br />
Innanzitutto viene fatto uso di una ottimizzazione, duran-<br />
te la ricerca dell'indirizzo remoto, viene provata prima la<br />
funzione:<br />
ULONG inet-addr(const UBYTE *);<br />
Passando come parametro una stringa contenente un indirizzo<br />
numerico (es. "192.168.12.45"), sarà restituito un valore<br />
a 32 bit, mentre per un qualsiasi altro tipo di stringa (es.<br />
"host.dominio.it") sarà restituita la costante INADDR-NO-<br />
NE. Solo in quest'ultimo caso ricorreremo a gethostbyname(<br />
), la quale è ben più dispendiosa, dovendo effettuare<br />
la ricerca dell'indirizzo nei file di configurazione dello stack<br />
o presso il nameserver.<br />
I1 passo successivo è l'apertura del socket. Siamo interessati<br />
a una comunicazione per pacchetti, quindi impostiamo il<br />
parametro sockettype a SOCK-DGRAM:<br />
sock = socket(AF-INET, SOCK-DGRAM, O);<br />
A questo punto associamo il socket a una porta, ricorrendo a<br />
bind( ), i cui parametri sono gli stessi di connect( ). Diversa-<br />
mente da quest'ultima, però, la struttura sockaddrè relativa a<br />
una porta locale. In tal modo il programma dall'altro lato sa<br />
chi è stato a inviare i dati (per filtrare eventualmente pac-<br />
chetti indesiderati) e a quale porta spedire le sue risposte:<br />
struct sockaddr-in mysockaddr;