MokaByte Numero 01 - Ottobre 1996
Introduzione alla programmazione in rete:
affrontiamo per i neofiti il TCP/IP e connesioni tramite socket
 
di
Luca Bertoncello 
 

 


 


In questo articolo il nostro collaboratore ci introduce nel mondo delle comunicazioni via internet e ci da un assaggio su come realizzare un esempio di comunicazione. Si noti bene che le righe di codice presenti più avanti sono da considerarsi solo come direttiva di lavoro , e nel caso si voglia implementarle si tenga conto che vanno completate con altre routine non presenti in questo articolo. In questo numero per i più curiosi è presente un articolo che presenta una applet funzionante per inviare posta elettronica realizzata con la tecnica dei socket.
 
 

 

Nel presente articolo saranno affontati i seguenti argomenti in maniera introduttiva:


 
 

Cos’è un Socket
 
 

Domanda fondamentale per poter passare ad approfondire l’argomento è “Cos’è un Socket?” Un socket è una porta di comunicazione tra due computer che utilizzino il protocollo TCP/IP (vedi in seguito). Tramite queste porte è possibile scambiare messaggi in maniera bi-direzionale. I provider Internet devono necessariamente dedicare alcune porte della loro macchina per alcune azioni fondamentali. Ad esempio le porte socket dedicate alla posta sono la 23 (per SMTP) e la 110 (per POP3). Il proxy, generalmente è sulla porta 8080, Telnet sulla 35, FTP sulla 21 e così via. È naturalmente possibile usare porte lasciate libere per i propri scopi, previo accordo con il provider che potrebbe non gradire l’intrusione e chiudervi l’applicativo (non provate a cercare di utilizzare una delle porte dette precedentemente, otterreste un messaggio di errore e nient’altro). Un esempio (che si vedrà dettagliatamente in seguito) è quello di usare una porta per poter scambiare messaggi come se fosse un telefono. Da notare il fatto che, se si hanno due o più computer collegati in rete e si usa il protocollo TCP/IP, è possibile usare le socket come se si fosse collegati ad Internet (per gli amanti della precisione dirò che è vero il contrario, su Internet si usano le porte esattamente come se fossimo tra due o più computer nella stessa stanza). Detto ciò si può ragionevolmente pensare di entrare nel dettaglio e di far comunicare due programmi tramite socket. È però fondamentale una constatazione. Come nella posta elettronica, se il messaggio tra due applicativi passa solo da un provider (i due applicativi sono sulla stessa macchina o uno è sul provider e l’altro su un computer collegato fisicamente ad esso) la comunicazione è intercettabile solo dal provider stesso (che però, generalmente, non ha interesse a farlo), mentre se si passa attraverso la rete (un’applicazione è su un provider e l’altra su un altro) allora si può lasciar perdere il discorso sulla segretezza. Non esiste segretezza su Internet! Per ovviare a questo inconveniente si possono criptare i messaggi, cosicché, se qualcuno li intercetta, non sia poi in grado di leggerli. Per fare ciò si può usare un sistema di criptatura fatto da se, appoggiarsi alle sicurissime routine di PGP, o usare le S.S.L. (Secur Socket Layer) di cui si accennerà in seguito. Breve teoria di TCP/IP

Bene, a questo punto è doveroso parlare, almeno in termini generali, di cos’è il protocollo TCP/IP, cosa serve, quali sono le sue caratteristiche e come usarlo. Allora, per prima cosa: “cos’è un protocollo di comunicazione e, in particolare TCP/IP”. Un protocollo di comunicazione è un sistema (un insieme di programmi, detto molto terra-terra) che consente a più computer collegati tra loro in una qualche maniera di scambiarsi dei dati. Un esempio classico è Internet, un altro sono i computer collegati tra di loro con schede rete. I protocolli più usati sono NetBEUI¸ TCP/IP, IPS/SPX. Nel nostro caso (e in quello di Internet) adoperiamo TCP/IP. Questo protocollo consente di condividere risorse in rete “chiamando” ogni computer con una serie di 4 numeri (l’indirizzo IP e l’indirizzo DNS). È anche possibile assegnare a questo numero un nome. Esempio: 194.243.65.1 è l’indirizzo del mio provider, ma se lo cerco come www.biella.alpcom.it lo trovo e ho il vantaggio di ricordarmelo più facilmente. In ogni computer è presente un name-server che traduce il formato numerico in alfanumerico e viceversa. Ad ogni indirizzo c’è la possibilità di usare più porte (vedi quanto detto prima), per cui per usare la posta di Biella Multimedia (il mio provider) devo usare l’indirizzo 194.243.65.1 e la porta 23. Do tutto in pasto al mio programma e spedisco la mia lettera. Questo in breve è TCP/IP, rimando ogni discussione dettagliata in un’altra sede, in quanto la cosa è molto lunga e complessa.

Come si usa un Socket con Java

Al contrario di com’era in C, scrivere un’applicazione in Java che comunichi via socket è alquanto semplice. Per prima cosa è necessario aprire questo socket creando un’istanza della classe Socket, poi si procede ad assegnare uno Stream per l’output e uno per l’input, in maniera tale che sia possibile usare le funzioni println() e read(), come se si avesse a che fare con l’input/output da tastiera. Finito il tutto si deve, naturalmente, chiudere gli Stream e il Socket. Vediamo un po’ in dettaglio le varie classi utilizzate. La classe Socket è l’asse portante del programma. Tramite questa classe è possibile comunicare. I parametri da passare sono l’indirizzo (in formato alfanumerico) e la porta. Le altre classi sono molto utilizzate e conosciute e c’è poco da dire. PrintStream e InputStream a cui si deve passare rispettivamente getOutputStream() e getInputStream(), sono quelle che permettono di usare il Socket come se fosse uno stream locale. Infatti, come si potrà vedere, stampare una stringa su schermo (System.out.println(“Stringa”)), o mandarla via Socket (Sock.println(“Stringa”)) è praticamente la stessa cosa. Caso analogo è per l’input. È fondamentale, per evitare che il vostro provider vi linci per aver inchiodato una loro porta, chiudere il socket, una volta terminato il programma, usando l’istruzione Sock.close(). Semplice applicativo per comunicazione tramite Socket sviluppato in Java

Vediamo adesso con un esempio un pratico di come si possa trasmettere e ricevere una stringa tramite connessioni via socket.

Programma che spedisce
        try {
             Socket Sock = new Socket(“biella.alpcom.it”, 20000);
             PrintStream os = new PrintStream(Sock.getOutputStream());
             os.println(“Heila!!”);
             os.close();
             Sock.close();
        }

        catch(Exception e) {
             System.out.println(e);
        }

Programma che riceve

         try {
            Socket Sock = new Socket(“biella.alpcom.it”, 20000);
            InputStream is = new InputStream(Sock.getInputStream());
            byte s=new byte[100];
            is.read(s);
            is.close();
            Sock.close();
        }

        catch(Exception e) {
            System.out.println(e);
        }
Come si può vedere, il programma si basa su quanto detto al paragrafo precedente e prende o manda una la stringa Heila!! Attraverso la porta 20000 di biella.alpcom.it. Vi sconsiglio di usare questo provider per i vostri esperimenti, anche perché se ne accorgerebbe e non vi lascerebbe fare questo genere di cose.

Cenni sulla Sicurezza dei Dati

Come si è detto nella prima parte, i dati trasmessi via Socket possono essere intercettati. E allora cosa si può fare per tenerli segreti? La risposta è semplice: basta criptarli. Visto che non vi è modo per evitare l’intercettante, è sufficiente rendere illeggibili i dati, come fanno i militari con le loro comunicazioni, solo che in informatica la criptatura è molto più sicura. Come si era accennato, tre sono i metodi fondamentali per proteggere i dati. Vediamo ora molto superficialmente quali sono e come funzionano. Il primo è quello classico. Si prende una parola chiave e si cripta il messaggio in base ad essa. Per decriptarlo occorre possedere la stessa parola chiave, altrimenti non se ne fa niente. È questo un metodo semplice da realizzare, ma di scarsa efficacia, infatti è relativamente semplice provare e, alla fine, trovare la parola chiave. Il secondo metodo, ritenuto il più sicuro di tutti, si chiama PGP che sta per Pretty Good Privacy, e si basa su due chiavi (una pubblica, da dare in giro e una privata) e una frase segreta. Hanno calcolato che per decriptare un messaggio “illegalmente” una rete di 1000 computer dovrebbe lavorare per circa 10^10 anni, quindi mi sembra un metodo sicuro. Per maggiori informazioni su questo sistema è possibile trovare informazioni all’indirizzo http://www.geocities.com/SiliconValley/7502. L’ultimo sistema è il più usato. Si chiama SSL, che sta per Secur Socket Library, ed è lo stesso sistema usato per il protocollo https, le cosiddette pagine sicure, che si usano per accettare numeri di carta di credito. Anche questo sistema si basa su due chiavi, una pubblica, con la quale criptare il messaggio e una privata con la quale decodificarla. Esistono alcune routine, per Java si chiamano SSLava, che permettono si usare in maniera quasi trasparente questo protocollo. Non è però in questa sede il posto per parlarne, quindi lo rimando in un futuro.

Conclusioni

In questo articolo si è visto cosa sono i Socket e come utilizzarli in propri applicativi scritti in Java. La teoria su TCP/IP, Socket e tutto il resto è trasportabile su qualunque piattaforma e qualunque linguaggio, salvo per il fatto che Java offre, tra tutti, le maggiori facilitazioni. In seguito si potrà pensare di vedere nel dettaglio alcuni programmi che utilizzino i socket riservati per esempio per la posta (SMTP e POP).
 
Luca Bertoncello è un programmatore in C++ e Java (da poco dopo i suoi esordi). Diplomato in Informatica all'ITIS di Ivrea, lavora presso una ditta che ha creato due anni fa. È specializzato in programmi sistemistici per il gioco del Lotto, ma non disdegna altri programmi e speculazioni mentali sui vari sistemi. Può essere contattato a: lucabert@biella.alpcom.it (per messaggi privati) bdb@usa.net softserv@biella.alpcom.it (per lavoro) 

 
 
  

 

MokaByte rivista web su Java

MokaByte ricerca nuovi collaboratori
Chi volesse mettersi in contatto con noi può farlo scrivendo a mokainfo@mokabyte.it