Connessioni di rete Progetto di reti di Calcolatori e Sistemi Informatici - Stefano Millozzi 1
Socket orientato alla connessione o non orientato alla connessione 2
Socket in astratto 3
Socket modalità di funzionamento Orientata alla connessione (recapito sicuro) Controllo totale da parte del socket Telefono (apertura/chiusura connessione) Flussi di dati (Stream) TCP (Transport Control Protocol) Senza Connessione (recapito non sicuro) Assenza di controllo da parte del socket Posta (spedizione e consegna scorrelate) Datagrammi UDP (User Data Protocol) 4
Classi di base Linguaggio Java in tre punti: Presentazione: packages di GUI (AWT e Swing), packages di input/output, package di rete Logica: package di rete, packages di input/output, packages di linguaggio ed utilità Dati: packages di input/output (files), predisposizione all accettazione di connessione ai dati (drivers per DB) Le basi del networking in Java: package di rete (java.net) package di input/output (java.io) 5
Socket: modalità orientata alla connessione Socket & Server Socket 6
Socket Socket legato ad un indirizzo IP e ad una porta il layer TCP può identificare l'applicazione che comunica e scambia dati sulla rete I Pacchetti su una connessione TCP sono identificati da: indirizzo sorgente porta sorgente indirizzo destinazione porta destinazione Connessione TCP su socket utilizza i 4 parametri sopra Handshake Fase 1: richiesta connessione Fase 2: connessione Fase 3: comunicazione Fase 4: chiusura 7
Esempio: Indirizzo e numero di porta Creare una connessione tcp verso un server ssh e sftp e visualizzare le informazioni relativi alla connessione stabilita Uso del comando netstat Creare due connessioni differenti e con netstat determinare i parametri caratteristici ci ciascuna connessione 8
Fase 1: richiesta connessione Lato server socket in ascolto sulla porta di un indirizzo locale Es. indirizzo 192.168.0.1, porta 4444 attesa di richieste di connessione dal client Lato client effettua il binding sulla porta di un indirizzo locale Es. indirizzo 192.168.0.2, porta 32167 (solitamente assegnata dal sistema) richiede una connessione su indirizzo e porta del server 9
Fase2: connessione Lato server se tutto ok, server accetta connessione un nuovo socket è creato su stesso indirizzo e porta locale e su indirizzo e porta remota del client richiedente (connessione TCP) Lato client se tutto ok, il socket è creato su stesso indirizzo e porta locale e su indirizzo e porta remota del server (connessione TCP) Connessione TCP (socket) identificata dai quattro parametri: indirizzo e porta client, indirizzo e porta server 10
Fase3: comunicazione Client e server possono comunicare leggendo e scrivendo attraverso il socket (connessione TCP) La comunicazione effettiva avviene attraverso canali di comunicazione unidirezionali (stream) costruiti sul socket Stream specifici di lettura specifici di scrittura Fase4: chiusura Chiusura della connessione da ambo le parti Chiusura dei socket Chiusura degli stream dati 11
Socket vs ServerSocket CLIENT Client che vuole connettersi Socket Classi Java di riferimento per socket in modalità orientata alla connessione (TCP): ServerSocket Socket Server che vuole accettare connessioni ServerSocket SERVER 12
Socket 13
Socket 14
Socket 15
Socket 16
public Socket(String host, int port) throws UnknownHostExcetion, IOException Crea un Socket e richiede la sua connessione ad un ServerSocket in ascolto sull'indirizzo host alla porta port public Socket(String host, int port, InetAddress localaddress, int localport) throws UnknownHostExcetion, IOException Come sopra facendo un binding su localaddress e localport public InputStream getinputstream() throws IOException Restituisce un InputStream per questo Socket public OutputStream getoutputstream() throws IOException Restituisce un OutputStream per questo Socket Socket Permette di creare un socket (canale bidirezionale) remoto verso un host in ascolto su una particolare porta 17
ServerSocket 18
public ServerSocket(int port) throws IOException ServerSocket creato su una porta specifica; il valore 0 determina la scelta della prima porta libera disponibile public Socket accept () throws IOException Ascolta le richeste di connessione fatte a questo ServerSocket; il metodo si blocca finchè una connessione non viene impostata ServerSocket Attesa di connessioni esterne dirette alla macchina locale, su una specifica porta. Il metodo accept() ritorna un Socket (già aperto) verso l host remoto che ha effettuato la connessione 19
Richiami A cosa serve la classe Socket? Di quali parametri ha bisogno A cosa serve ServerSocket? Di quali parametri ha bisogno In che modo si gestisce la connessione verso il client? In che modo, una volta stabilita la connessione, è possibile inviare e ricevere dati? 20
Connessione Client / Server Socket s=new Socket( server,port) Connessione via Socket e ServerSocket HOST Input Stream Output Stream Output Stream Input Stream 21 SERVER ServerSocket ss = new ServerSocket(port) Socket s=ss.accept()
Esercizi 1) Implementare un Server in ascolto sulla porta 8080 che riceve richieste da un client (HTTP) e risponde con una semplice pagina HTML che contiene il testo ciao 2) Implementare un client HTTP molto semplice che effettua una richiesta sulla porta 8080 verso un server http (es: apache) Stringa java da inviare come richiesta: "GET / HTTP/1.0\n" + "Host: localhost:8080\n" + "Connection: keepalive\n\n Implementare un sistema client server che permetta di inviare al server un file semplicemente digitando il nome del file (completo di percorso) Il server salverà il file in una cartella predefinita Realizzare un programma Java che stampa la lista delle porte di un sistema occupate da un programma in ascolto per connessioni TCP/IP Il programma dovrà prevedere una modalità per impostare host da controllare e intervallo di porte da scandire 22
Datagram: modalità non orientata alla connessione DatagramSocket e DatagramPacket 23
Datagrammi Pacchetti di informazione (NON flusso continuo ed ordinato) Unità indipendenti con tutte le informazioni necessarie alla consegna Velocità ed efficienza, ma non sicurezza di consegna Classi Java di riferimento da utilizzare DatagramSocket socket, sia client che server DatagramPacket pacchetti da spedire 24
DatagramSocket e DatagramPacket CLIENT Client che vuole connettersi DatagramSocket DatagramPacket DatagramPacket SERVER Server che vuole accettare connessioni DatagramSocket 25
Datagram DatagramSocket Connessione non dedicata Cambiamento destinazione Invio datagrammi ad host diversi Simmetria d uso Ascolto di datagrammi in ingresso Produzione di datagrammi in uscita Utilizzo (in invio ed in ricezione) di DatagramPacket DatagramPacket Informazioni di business (Dati) Sequenza di byte (bufferizzazione: datagramma = sequenza di byte trasmessi/ricevuti a pacchetti di lunghezza stabilita) Lunghezza Informazioni di routing (Connessione) Indirizzo Porta 26
DatagramSocket Metodi di interesse Costruttori Receive Send 27
DatagramPacket Metodi di interesse Costruttori setdata setport setaddress( ) 28
Datagram DatagramSocket DatagramSocket() throws SocketException DatagramSocket creato su una porta libera scelta casualmente DatagramSocket(int port) throws SocketException DatagramSocket creato su una porta specifica; il valore 0 determina il comportamento del costruttore precedente DatagramPacket DatagramPacket(byte buffer[], int length) Usato per ricevere datagrammi buffer è l array di bytes preallocato che contiene l informazione del pacchetto quando arriva; length è il max numero di bytes letto in buffer DatagramPacket(byte buffer[], int length, InetAddress address, int port) Usato per inviare datagrammi i dati di business del pacchetto consistono nei primi length bytes dell array di bytes buffer; il pacchetto viene spedito alla porta port dell indirizzo address 29
Esercizio per casa Realizzare una coppia di classi DGClientTest.java invia 1000 pacchetti di 1000 byte ciascuno verso il server senza attendere la risposta Conteggia il tempo impiegato a trasmettere i dati, il numero di byte totali, il numero di pacchetti spediti DGServerTest.java Legge indefinitamente pacchetti Datagram e conteggia il numero totale di byte di dati ricevuti e lo stampa Effettuare un run e contare quanti byte sono partiti dal client e quanti arrivati nel server e il tempo impiegato e il numero di pacchetti spediti Realizzare poi una coppia di classi SKClientTest.java SKServerTest.java che effettuano le stesse operazioni delle classi datagram ma usando i socket Confrontare i tempi di spedizione e i pacchetti spediti nei due approcci Cambiare il numero di pacchetti da inviare per adattarlo alla velocità della macchina, aggiungendo anche dei tempi di ritardo 30
Datagram e multicast 31
Caso d impiego dei datagrammi: il multicast Trasmissione senza controllo simultanea ad un gruppo di ascoltatori Basato su Internet Group Management Protocol (IGMP) Gruppo multicast: indirizzo IP in classe D nell intervallo [224.0.0.1, 239.255.255.255] Host aderisce ad un gruppo di multicast utilizzando un pacchetto IGMP (informa i router di effettuare il relay dei pacchetti multicast alla rete dell'host) Primitive per aderire (join) ed uscire (leave) da un gruppo di multicast Per trasmettere si seguono le regole classiche del datagram 32
MulticastSocket Classe Java usata per spedire/ricevere pacchetti multicast Estende il DatagramSocket con primitive per l'adesione e l'uscita da gruppi di multicast public void joingroup(inetaddress mcastaddr) public void leavegroup(inetaddress mcastaddr) Veicola DatagramPacket 33
Esempio Realizzare client/server in cui il server trasmette in multicast un testo e vari client stampano i testi ricevuti MulticastServer.java MulticastClient.java 34
Chat Costruire un semplice sistema di chat multiplo con interfaccia testuale basato su multicast e verificarlo in un ambiente di rete (almeno due host tra loro interconnessi). 35
Socket un recapt 36