Sei sulla pagina 1di 20

Corso di Laurea in Scienze e Tecnologie Informatiche

Università degli Studi della Basilicata

Reti di Calcolatori

6° Lezione – Programmazione delle socket

Sommario
¨ Socket API
¨ Esempio di applicazione TCP
¨ Esempio di applicazione UDP
¨ Packet Sniffer

1
Socket API
¨ Le API per la programmazione delle socket sono
state introdotte in BSD4.1 UNIX nel 1981
¤ Per questo motivo solitamente le funzioni di
programmazione delle socket vengono chiamate
Berkley socket API
¨ Utilizzano il paradigma client/server
¨ Offrono due tipologie di servizi di trasporto
¤ Datagramma inaffidabile
¤ Affidabile, orientato ai byte

Definizione di socket

Una socket è un’interfaccia di un host locale, creata


dalle applicazioni, controllata dal S.O. (una “porta”) in
cui il processo di un’applicazione può
inviare e ricevere messaggi al/dal processo di un’altra
applicazione

2
Sommario
¨ Socket API
¨ Esempio di applicazione TCP
¨ Esempio di applicazione UDP
¨ Packet Sniffer

Programmazione delle socket TCP


¨ Socket: una porta tra il processo di un’applicazione e il protocollo di
trasporto end-to-end (UDP o TCP)
¨ Servizio TCP: trasferimento affidabile di byte da un processo all’altro

Controllato dallo Controllato dallo


sviluppatore sviluppatore
dell’applicazione dell’applicazione

Controllato Controllato
dal sistema dal sistema
operativo TCP con TCP con operativo
buffer e buffer e
variabili variabili

3
Programmazione delle socket TCP
¨ Lato server
¤ Il processo server deve essere sempre in
esecuzione
¤ Il server ha creato precedentemente una socket
che dà il benvenuto al contatto con il client,
welcoming socket
¨ Lato client
¤ Il client crea una socket TCP
¤ Specifica indirizzo IP e il numero di porta del
processo server
¤ Quando il client crea la socket: il client TCP
stabilisce una connessione con il server TCP
(handshaking a tre vie)
¨ Al termine della connessione del client, il
server TCP crea una nuova socket, connection
socket, per il processo server per comunicare
con il client
¤ Consente al server di comunicare con più client
¤ Numeri di porta origine usati per distinguere i
client

Alcuni termini: flusso


¨ Un flusso (stream) è una sequenza di caratteri che
fluisce da/verso un processo

abcdeabcdfeg
Processo A Processo B

4
Alcuni termini: flusso di ingresso
¨ Un flusso d’ingresso (input stream) è un’origine di
dati in input per il processo, ad esempio la tastiera
o la socket

abcdeabcdfeg

abcdeabcdfeg

Alcuni termini: flusso di uscita


¨ Un flusso di uscita (output stream) è un’uscita di
dati per il processo, ad esempio il monitor o la
socket

abcdeabcdfeg

abcdeabcdfeg

10

5
Esempio di applicazione TCP
client/server
¨ Il client legge una riga dall’input
standard (flusso inFromUser) e la
invia al server tramite la socket
(flusso outToServer)

¨ Il server legge la riga dalla socket

¨ Il server converte la riga in lettere


maiuscole e la invia al client

¨ Il client legge nella sua socket la


riga modificata e la visualizza
(flusso inFromServer)

11

Interazione delle socket TCP


client/server
Server Client
Crea la socket port=x per la
richiesta in arrivo
welcomeSocket =
ServerSocket()

Attende la richiesta di Setup della Crea la socket connessa a


connessione in ingresso connessione TCP hostid, port=x
connectionSocket = clientSocket =
welcomeSocket.accept() socket()

Legge la richiesta da Invia la richiesta usando


connectionSocket clientSocket

Scrive la risposta Leggi la risposta da


connectionSocket clientSocket

Chiude Chiude
connectionSocket clientSocket

12

6
Esempio client Java in TCP - 1
import java.io.*;
import java.net.*;
class TCPClient {

public static void main(String argv[]) throws Exception


{
String sentence;
String modifiedSentence;

BufferedReader inFromUser = Crea un flusso di ingresso


new BufferedReader(new InputStreamReader(System.in));

Crea una socket client


Socket clientSocket = new Socket("hostname", 6789); connessa al server

DataOutputStream outToServer =
Crea un flusso di uscita
new DataOutputStream(clientSocket.getOutputStream()); collegato al server

13

Esempio client Java in TCP - 2


BufferedReader inFromServer =
Crea un flusso di ingresso
new BufferedReader(new collegato al socket
InputStreamReader(clientSocket.getInputStream()));

sentence = inFromUser.readLine();

outToServer.writeBytes(sentence + '\n'); Invia una riga al server

modifiedSentence = inFromServer.readLine(); Riceve una riga dal server

System.out.println("FROM SERVER: " + modifiedSentence);

clientSocket.close();
}
}

14

7
Esempio server Java in TCP - 1
import java.io.*;
import java.net.*;

class TCPServer {

public static void main(String argv[]) throws Exception


{
String clientSentence;
String capitalizedSentence;

ServerSocket welcomeSocket = new ServerSocket(6789);


Crea una socket di benvenuto
sulla porta 6789
while(true) {
Socket connectionSocket = welcomeSocket.accept(); Attende sulla socket di
benvenuto un contatto con il
client

BufferedReader inFromClient = Crea un flusso di


new BufferedReader(new ingresso collegato alla
InputStreamReader(connectionSocket.getInputStream())); socket

15

Esempio server Java in TCP - 2


DataOutputStream outToClient = Crea un flusso di
uscita collegato al
new DataOutputStream(connectionSocket.getOutputStream());
socket
Legge la riga dal
clientSentence = inFromClient.readLine(); socket

Scrive la riga sul


capitalizedSentence = clientSentence.toUpperCase() + '\n';
socket

outToClient.writeBytes(capitalizedSentence);
}
}
}
Termina il ciclo while, ricomincia
il ciclo in attesa di un nuovo
client

16

8
Sommario
¨ Socket API
¨ Esempio di applicazione TCP
¨ Esempio di applicazione UDP
¨ Packet Sniffer

17

Programmazione delle socket UDP


¨ In UDP: non c’è “connessione” tra client e server
¤ Non c’è handshaking
¤ Il mittente allega esplicitamente a ogni pacchetto
l’indirizzo IP e la porta di destinazione
¤ Il server deve estrarre l’indirizzo IP e la porta
del mittente dal pacchetto ricevuto
¨ UDP: i dati trasmessi possono perdersi o arrivare a
destinazione in un ordine diverso da quello d’invio

18

9
Interazione delle socket UDP
client/server
Server Client
Crea la socket port=x per la
richiesta in arrivo Crea la socket clientSocket
serverSocket = = DatagramSocket()
DatagramSocket()

Crea la richiesta contenente


Legge la richiesta da hostid, port=x
serverSocket e invia il datagramma usando
clientSocket

Scrive la risposta usando


serverSocket
e specificando l’indirizzo
dell’host client e il numero di Leggi la risposta da
porta clientSocket

Chiude
clientSocket

19

Esempio di applicazione UDP


client/server
¨ Il client legge una riga dall’input
standard (flusso inFromUser) e la
invia al server tramite la socket
(flusso outToServer)

¨ Il server legge la riga dalla socket

¨ Il server converte la riga in lettere


maiuscole e la invia al client

¨ Il client legge nella sua socket la


riga modificata e la visualizza
(flusso inFromServer)

20

10
Esempio client Java in UDP - 1
class UDPClient {

public static void main(String args[]) throws Exception


{
BufferedReader inFromUser = Crea un flusso di
new BufferedReader(new InputStreamReader(System.in)); ingresso

DatagramSocket clientSocket = new DatagramSocket(); Crea un socket client

Traduce il nome
InetAddress IPAddress = InetAddress.getByName("hostname"); dell’host nell’indirizzo
IP usando il DNS

byte[] sendData = new byte[1024];


byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();

21

Esempio client Java in UDP - 2


Crea il datagramma con i
DatagramPacket sendPacket = dati da trasmettere,
new DatagramPacket(sendData, sendData.length, lunghezza, indirizzo IP,
IPAddress, 9876); porta
Invia il datagramma al
clientSocket.send(sendPacket);
server
DatagramPacket receivePacket =
new DatagramPacket(receiveData, receiveData.length);

clientSocket.receive(receivePacket);
Legge il datagramma
String modifiedSentence = dal server
new String(receivePacket.getData());

System.out.println("FROM SERVER:" + modifiedSentence);


clientSocket.close();
}
}

22

11
Esempio server Java in UDP - 1
import java.io.*;
import java.net.*;

class UDPServer {

public static void main(String args[]) throws Exception


{ Crea una socket per
DatagramSocket serverSocket = new DatagramSocket(9876); datagrammi sulla porta
9876
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];

while(true)
{
DatagramPacket receivePacket = Crea lo spazio per i
new DatagramPacket(receiveData, receiveData.length); datagrammi

serverSocket.receive(receivePacket);
String sentence = Fino a quanto non si riceve un
new String(receivePacket.getData()); Datagramma il metodo receive si blocca

23

Esempio server Java in UDP - 2


InetAddress IPAddress = receivePacket.getAddress(); Ottiene l’indirizzo IP e
la porta del mittente
int port = receivePacket.getPort();

String capitalizedSentence = sentence.toUpperCase();

sendData = capitalizedSentence.getBytes();

DatagramPacket sendPacket =
new DatagramPacket(sendData, sendData.length, Crea il datagramma da
IPAddress, port); inviare al client

serverSocket.send(sendPacket); Scrive il datagramma


} sulla socket
}
}

Termina il ciclo while, ricomincia


il ciclo in attesa di un nuovo
client

24

12
Costruire un semplice server web
¨ Un server web deve svolgere i seguenti compiti
¤ Gestire una richiesta HTTP
¤ Accettarla e analizzarla

¤ Prendere il file richiesto dal file system del server

¤ Creare un messaggio di risposta HTTP costituito dal file


richiesto preceduto da righe di intestazione
¤ Inviare la risposta direttamente al client

25

Sommario
¨ Socket API
¨ Esempio di applicazione TCP
¨ Esempio di applicazione UDP
¨ Packet Sniffer

26

13
Studiare i protocolli di rete
¨ Due modalità
¤ Simulazione (tool di simulazione, applet, ..)
¤ Osservazione in un ambiente di rete reale

“Tell me and I forget. Show me and I remember.


Involve me and I understand.” proverbio cinese

¨ Vogliamo comprendere come funzionano i protocolli di rete


attraverso l’osservazione
¤ La sequenza di messaggi scambiati
¤ Le operazioni del protocollo
¤ Le cause e le conseguenze delle azioni

27

Packet sniffer
¨ Sniffing
¤ Attività di intercettazione passiva dei dati che transitano in
una rete telematica
¤ Per scopi leciti (e.g. l'individuazione di problemi di
comunicazione o di tentativi di intrusione)
¤ Per scopi illeciti (e.g. intercettazione fraudolenta di
password o altre informazioni sensibili)
¨ Packet sniffer
¤ Cattura i messaggi inviati/ricevuti dal proprio computer
¤ Memorizza e/o visualizza i contenuti dei vari campi del
protocollo nei messaggi catturati (packet analyzer)
¤ Non invia mai pacchetti di per sé, ovvero è passivo

28

14
Struttura Packet Sniffer

29

Packet analyzer
¨ Visualizza i contenuti di tutti i campi presenti in un
messaggio
¨ Comprendere la struttura di tutti i messaggi
scambiati tra i protocolli:
¤ Comprende il formato degli Ethernet frame
¤ Identifica il datagramma IP

¤ Estrae il segmento TCP dal datagramma IP

¤ Estrae il messaggio HTTP dal segmento TCP

¤ Analizza il messaggio HTTP

30

15
Wireshark

31

TCP/IP Tools
¨ Windows/Linux possiedono degli utili strumenti per
la gestione delle reti o degli host
¨ Alcuni di questi tool sono:
¤ ipconfig
¤ ping

¤ tracert

¤ netstat

¤ nslookup

32

16
ipconfig
¨ ipconfig mostra tutti i parametri associati alla connessione TCP/IP
ipconfig [/all] [/renew [Adapter]] [/release [Adapter]] [/flushdns] [/displaydns]
[/registerdns] [/showclassid Adapter] [/setclassid Adapter [ClassID]]
¨ Esempi
¤ ipconfig
n Mostra la configurazione TCP/IP per tutti gli adattatori
¤ ipconfig /all
n Mostra tutte le configurazioni TCP/IP per tutti gli adattatori
¤ ipconfig /release
n Disconnette tutte le schede di rete
¤ ipconfig /renew
n Assegna a tutte le schede di rete le configurazioni per una connessione
TCP/IP
¤ Ipconfig /flushdns
n Svuota la cache DNS

33

ping
¨ Il comando ping è utilizzato per verificare lo stato della connessione del
proprio host verso una destinazione indicando se è stata restituita una
risposta dalla destinazione e quanto tempo è trascorso prima di riceverla
¤ Se si verifica un errore nella consegna, il comando ping visualizza un messaggio
di errore
¨ Le opzioni disponibili sono:
¤ -n conteggio
n Determina il numero di richieste echo da inviare. Il numero di richieste predefinito è 4
¤ -w timeout
n Consente di regolare il valore di timeout (in millisecondi). Il valore predefinito è 1000
(corrispondente a un timeout di un secondo)
¤ -l dimensione
n Consente di regolare la dimensione del pacchetto di ping. La dimensione predefinita è
32 byte
¤ -f
n Imposta il bit di Non frammentazione nel pacchetto di ping. Per impostazione
predefinita, il pacchetto di ping consente la frammentazione

34

17
tracert
¨ tracert è un comando che può essere utilizzata per rilevare
il percorso seguito da un pacchetto IP per giungere alla
relativa destinazione
¤ Invia pacchetti echo ICMP (Internet Control Message Protocol)
alla destinazione
¤ Utilizza valori TTL (Time-To-Live) diminuiti di 1 ad ogni inoltro
¤ Quando il TTL di un pacchetto raggiunge lo zero (0), il router
invia di nuovo un messaggio ICMP "Tempo scaduto" al computer
di origine
¨ Utile per scoprire il punto della rete in cui un pacchetto si è
interrotto
¨ Visualroute http://www.visualroute.it/vr.asp

35

Opzioni tracert
¨ -d
¤ Specifica di non risolvere gli indirizzi relativi ai nomi host
¨ -h numeromassimo_hop
¤ Specifica il numero massimo di hop per cercare la destinazione
¨ -j elenco-host
¤ Specifica l'origine di routing ampia in base all'elenco di host
¨ -w timeout
¤ Attende per il numero di millisecondi specificato dal timeout per
ogni risposta
¨ host_destinazione
¤ Specifica il nome o l'indirizzo IP dell'host di destinazione

36

18
netstat
¨ netstat permette di vedere lo stato delle connessioni
instaurate sul computer locale
¨ Fornisce le seguenti informazioni:
¤ Il nome del protocollo (TCP o UDP)
¤ L’indirizzo locale e la porta utilizzata
¤ L’indirizzo remoto e la porta utilizzata
¤ Lo stato della connessione TCP
n CLOSE_WAIT, CLOSED, ESTABLISHED, FIN_WAIT_1,
FIN_WAIT_2, LAST_ACK, LISTEN, SYN_RECEIVED,
SYN_SEND e TIME_WAIT

37

netstat
¨ Esempi di utilizzo di netstat
¤ Fornisce statistiche sulle connessioni TCP e UDP
n netstat -sp tcp
n netstat -sp udp

¤ Mostra le connessioni attive ogni 5 secondi


n netstat –o 5
¤ Mostra le connessioni ed i processi ID
n netstat -no

38

19
nslookup
¨ nslookup consente di effettuare delle query
(interrogazioni) ad un server DNS per la risoluzione
di indirizzi IP dagli Hostname o viceversa
¨ Funziona in due modalità:
¤ Modalità interattiva
n Permette di effettuare più query e visualizza i singoli
risultati
n Abilitato in modo automatico quando il comando non è
seguito da argomenti
¤ Modalità non interattiva
n Abilitato ogni qualvolta si specifica un hostname

39

20

Potrebbero piacerti anche