1. Lezione 4: Comunicazione
con UDP
Corso di Programmazione in Rete
Laurea Magistrale in Ing. Informatica
Università degli Studi di Salerno
1
2. Outline
✦ Introduzione
✦ Comunicazione con DatagramSocket
✦ Comunicazione con MulticastSocket
2
3. Introduzione
✦ Protocollo UDP
• non richiede l’instaurazione di una connessione
tra le due parti che comunicano
• minore latenza, perché non c’è un acknowledge
dei pacchetti
‣ utile ad esempio per applicazioni di streaming
• possibilità di inviare un pacchetto a più destinatari
simultaneamente
• non viene garantita la consegna dei pacchetti
• non viene garantito l’ordine dei pacchetti
3
4. Datagram
✦ Lo scambio di informazioni avviene in
unità dette datagram
✦ Il contenuto di un datagram è un array di
byte (max. 65507 byte)
✦ Il protocollo garantisce l’integrità dei
datagram
• un datagram o non arriva o arriva per intero
• i datagram non vengono mai spezzati o
raggruppati (a livello 4)
4
5. La classe InetAddress
✦ Per specificare gli indirizzi da usare per le
comunicazioni UDP occorre usare la
classe InetAddress
✦ Un InetAddress rappresenta un indirizzo
IP
✦ Gli oggetti InetAddress si costruiscono
con il metodo:
• static InetAddress getByName(String name);
‣ name è il nome simbolico o la rappresentazione
dell’indirizzo numerico
5
6. La classe DatagramSocket
✦ DatagramSocket rappresenta un socket
per inviare o ricevere datagram UDP
✦ Costruttori:
• DatagramSocket()
‣ il socket è associato a una porta scelta dal sistema
• DatagramSocket(int port)
6
7. Uso di un DatagramSocket
✦ Una volta creato, un DatagramSocket può
essere usato per inviare/ricevere
messaggi
✦ A tale scopo occorre usare oggetti della
classe DatagramPacket
7
8. La classe DatagramPacket
✦ Costruttori:
• DatagramPacket(byte buf[], int maxLen);
‣ packet usato come buffer per ricevere datagram
• DatagramPacket(byte buf[], int len, InetAddress
addr, int port);
‣ packet per inviare un datagram
✦ Metodi:
• int getLength();
• byte[] getData();
• InetAddress getAddress();
• int getPort();
8
9. Invio di un datagram
✦ Si usa il metodo:
• void send(DatagramPacket packet);
✦ Esempio:
public static void main(String args[]) throws IOException {
DatagramSocket sock=new DatagramSocket();
byte [] mess={'H', 'e', 'l', 'l', 'o'};
InetAddress addr=InetAddress.getByName(args[0]);
DatagramPacket packet=new DatagramPacket(mess, mess.length, addr, PORT);
sock.send(packet);
}
9
10. Ricezione di un datagram
✦ Si usa il metodo:
• void receive(DatagramPacket packet);
✦ Esempio:
public static void main(String args[]) throws IOException {
DatagramSocket sock=new DatagramSocket(PORT);
byte [] mess=new byte[MAX];
DatagramPacket packet=new DatagramPacket(mess, mess.length);
sock.receive(packet);
System.out.println("Ricevuti: "+packet.getLength()+" bytes");
}
10
11. Uso di DatagramPacket
✦ Per trasmettere informazioni diverse da
byte:
• Si può usare un ByteArrayOutputStream per
scrivere una serie di informazioni in un array di
byte
• La lettura può essere fatta con un
ByteArrayInputStream
‣ Per specificare la lunghezza del buffer può essere utile il
costruttore:
- ByteArrayInputStream(byte[] arr, int offset, int length);
11
12. Multicast
✦ Con UDP è possibile inviare datagram a
indirizzati a un gruppo di destinatari
utilizzando una modalità detta multicast
✦ Un datagram multicast viene trasmesso
una sola volta su ciascuna rete locale
indipendentemente dal numero di
destinatari che lo riceveranno
• risparmio di tempo e di banda
12
13. Indirizzi multicast
✦ Ciascun gruppo di destinatari viene
individuato attraverso un indirizzo
multicast:
• in IPv4, indirizzi compresi tra 224.0.0.1 e
239.255.255.255
✦ Alcuni indirizzi multicast sono riservati ad
applicazioni di larga diffusione
• gli indirizzi 239.*.*.* sono riservati per uso locale
13
14. Time to live
✦ Un datagram multicast viene distribuito
dai router verso tutte le reti collegate
(broadcast)
✦ Per evitare l’inondazione della rete il
datagram ha un numero massimo di salti
(hops) da una rete all’altra
• questo parametro, detto Time To Live (TTL), può
avere un valore tra 0 e 255
✦ I router possono applicare ulteriori
restrizioni rispetto al TTL impostato nel
datagram
14
15. La classe MulticastSocket
✦ Sottoclasse di DatagramSocket per
inviare/ricevere in multicast
✦ Costruttori e metodi simili a
DatagramSocket:
• MulticastSocket();
• MulticastSocket(int port);
15
16. La classe MulticastSocket
✦ Per poter ricevere un messaggio
multicast, il socket deve essere “iscritto”
al gruppo con il metodo:
• void joinGroup(InetAddress group);
‣ group rappresenta un indirizzo IP multicast
✦ Il socket può rimuoversi dal gruppo con il
metodo:
• void leaveGroup(InetAddress group);
16
17. La classe MulticastSocket
✦ È possibile specificare il TTL dei datagram
inviati con il metodo:
• void setTimeToLive(int ttl);
✦ Per default il TTL è 1 (solo rete locale)
• Nota: impostando il TTL a 0 i datagram vengono
inviati solo all’indirizzo di loopback (cioè
raggiungono solo eventuali altre applicazioni sullo
stesso computer)
17