Unnikked - Esperienze personali in campo informatico

Java Networking : introduzione

I computer che si collegano ad Internet comunicano tra di loro utilizzando sia Transmission Control Protocol (TCP) che User Datagram Protocol (UDP), come mostra il diagramma[1] schematicamente:

1netw

Quando si scrive un programma Java che comunica sulla rete si programma sullo strato applicazione. Tipicamente non è necessario conoscere lo strato TCP o UDP. Si possono usare, invece, le classi del package java.net. Queste classi forniscono un sistema indipendente per la comunicazione sulla rete. Per decidere quale classe usare, bisogna conoscere le differenze tra TCP e UDP.

TCP

Quando due applicazioni vogliono comunicare tra loro in modo affidabile essi stabiliscono una connessione (connection oriented) e si inviano a vicenda dati tramite essa. Ciò è analogo ad una chiamata telefonica. Quando due persone comunicano tramite una linea telefonica, viene stabilita una connessione tra i due terminali telefonici, si inviano dati (la voce) parlando attraverso il dispositivo. Come per le compagnie telefoniche TCP garantisce che i dati, inviati tra i terminali, vengano correttamente consegnati nello stesso ordine in cui sono stati spediti.

TCP fornisce un canale punto-punto per le applicazioni che richiedono una connessione affidabile. L’Hypertext Trasfer Protocol (HTTP) e File Transfer Protocol (FTP) sono esempi di protocolli che fanno uso di TCP. L’ordine in cui i dati vengono inviati e ricevuti sulla rete è critico per il corretto funzionamento di queste applicazioni. Quando HTTP è usato per leggere da un Uniform Resource Locator (URL), i dati devono essere ricevuti nello stesso ordine in cui sono stati spediti, altrimenti si otterrà una pagina HTML senza senso, un file zip corrotto o qualche altra informazione non valida.

UDP

Il protocollo UDP fornisce una connessione non affidabile tra due applicazioni sulla rete. UDP non è basata su connessione (connectionless) come TCP. Piuttosto invia pacchetti indipendenti di dati chiamati datagrammi (datagrams) da una applicazione all’altra. Inviare un datagramma è come inviare una lettera tramite il servizio di posta: l’ordine di consegna non è importante e non è garantito e ogni messaggio è indipendente dall’altro.

Per diverse applicazioni, la garanzia di affidabilità è critica per il successo del trasferimento dell’informazione tra due punti della connessione. Però, altre forme di comunicazioni non richiedono questo standard rigoroso. Infatti, potrebbero esserne rallentati dall’overhead del protocollo o l’affidabilità potrebbe invalidare completamente il servizio.

Si consideri, per esempio, un orologio che invia l’ora corrente ai suoi client quando richiesto. Se un client perde un pacchetto non ha senso rispedirlo dal momento che l’ora sarebbe inesatta quando il client riceve il pacchetto al secondo tentativo. Se il client effettua due richieste e riceve i pacchetti da un server guasto, non ha importanza perché il client può capire che i pacchetti sono inesatti e può effettuare un’altra richiesta. L’affidabilità di TCP non è necessaria in questo caso poiché causa un degrado delle prestazioni e potrebbe ostacolare l’utilità del servizio.

Un altro esempio di servizio che non richiede la garanzia di affidabilità del canale è il comando ping. Lo scopo di questo comando è di verificare la comunicazione tra due programmi sulla rete. Infatti ping ha bisogno di conoscere i pacchetti scartati o non ordinati per determinare la qualità della connessione. Un canale affidabile renderebbe vano il servizio.

Conoscere le porte

In generale un computer ha una singola connessione alla rete. Tutti i dati destinati per un computer particolare arrivano attraverso tale connessione. Tuttavia i dati possono essere destinati a diverse applicazioni eseguiti sul computer. Perciò come fa il computer a conoscere verso quale applicazione inoltrare i dati? Attraverso l’uso delle porte.

I dati trasmessi tramite Internet sono accompagnati da una informazione di indirizzamento che identificano il computer e la porta verso la quale sono destinati. Il computer è identificato da un indirizzo IP (Internet Protocol) a 32-bit (IPv4)[2] che viene usato per consegnare i dati al computer corretto sulla rete. Le porte sono identificate da un numero a 16-bit che TCP e UDP usano per consegnare i dati alla giusta applicazione.

Nella comunicazione basata su connessione come TCP, una applicazione server lega un socket ad una specifica porta. Questo ha l’effetto di registrare il server con il sistema per ricevere tutti i dati destinati a questa porta. Un client può comunicare con il server sulla porta, come specificato:

2tcp

Definizione: i protocolli TCP e UDP usano le porte per mappare il traffico in entrata su un particolare processo che viene eseguito dal computer.

Nella connessione basata su datagrammi come UDP, il pacchetto datagramma contiene il numero di porta di destinazione e UDP smista il pacchetto verso la giusta applicazione, come illustrato in figura:

3tcpudp

I numeri di porta vanno da ** a **65.535 poiché rappresentate da un numero a 16 bit (216). I numeri di porta che vanno da ** a **1023 sono riservati; sono riservati per l’uso da parte dei sevizi noti come HTTP e FTP e altri servizi di sistema. Queste porte sono chiamate well-known ports. Le applicazioni scritte non dovrebbero cercare di legarsi (bind) a queste.


[1] Il così detto stack TPC/IP, va comunque menzionato lo standard ISO/OSI.
[2] Attualmente si è alla versione 6 dello standard (IPv6).