Fondamenti di Internet e Reti. Antonio Capone, Matteo Cesana, Ilario Filippini, Guido Maier

Documenti analoghi
Fondamenti di Internet e Reti. Achille Pattavina, Francesco Musumeci

Fondamenti di Internet e Reti. Antonio Capone, Achille Pattavina, Francesco Musumeci, Matteo Cesana

Esempi di programmi client/server in Python

Applicazioni di rete. Applicazioni di rete

Reti di Calcolatori:

Programmare con le Socket TCP

Programmare con le Socket

Applicazioni di rete

Laboratorio 1 Appello /7/2019

Programmare con le Socket TCP in java. 2: Application Layer 1

Programmazione in Rete

Prova in itinere 5 Maggio 2016

Laboratorio 1 Appello /7/2019

Introduzione alle applicazioni di rete

Compito. Fondamenti di Internet e Reti Proff. A. Capone, M. Cesana, I. Filippini. Prova in itinere 2 Maggio Cognome Nome Matricola

Prova in itinere 4 Maggio 2016

Prova in itinere 4 Maggio Tempo complessivo a disposizione per lo svolgimento: 2h Usare lo spazio dopo ogni Esercizio/Quesito per la risposta.

Esame Completo - 26 Luglio 2017

Cenni di programmazione distribuita in C++ Mauro Piccolo

Esame completo - 25 Luglio 2016

Programmazione dei socket con TCP #2

Esame completo 13 Febbraio 2018

Prova in itinere 2 Maggio Tempo complessivo a disposizione per lo svolgimento: 2h Usare lo spazio dopo ogni Esercizio/Quesito per la risposta.

Prova in itinere 4 Maggio Tempo complessivo a disposizione per lo svolgimento: 2h Usare lo spazio dopo ogni Esercizio/Quesito per la risposta.

Prova in itinere 1 - Esempio A

Esame completo - 25 Luglio 2016

Laboratorio. Fa0/ /24. Fa0/ /24. Fa0/ /24. Fa0/ H1 H2 H3

Parte II: Reti di calcolatori Lezione 10

Parte II: Reti di calcolatori Lezione 12

UDP. Livello di Trasporto. Demultiplexing dei Messaggi. Esempio di Demultiplexing

Telematica II 12. Esercitazione/Laboratorio 4

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

Altri tipi di connessione

Reti di Telecomunicazione Lezione 8

Applicazioni distribuite

J+... J+3 J+2 J+1 K+1 K+2 K+3 K+...

I Socket. Laboratorio Software M. Grotto R. Farina

CORSO DI RETI SSIS. Lezione n.2. 2 Novembre 2005 Laura Ricci

DNS: Domain Name System

Laboratorio di Programmazione in rete

TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI E DI TELECOMUNICAZIONI

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Esercizio 2. Client e server comunicano attraverso socket TCP

I name server DNS. DNS: Domain Name System. Esempio di DNS. DNS: Root name server. DNS: queries ripetute

Esercitazione [6] Client/Server con Socket

Esercitazione [5] Input/Output su Socket

Socket & RMI Ingegneria del Software - San Pietro

DNS: Domain Name System

Esame Completo - 12 Settembre 2017

Esercizi (1-2): da: TCP/IP Sockets in C (Donahoo-Calvert)

Esame Completo - 27 Giugno 2018

Il client deve stampare tutti gli eventuali errori che si possono verificare durante l esecuzione.

Transmission Control Protocol

HTTP adaptation layer per generico protocollo di scambio dati

Esame Completo - 27 Giugno 2018

DNS: Domain Name System

Capitolo 2: Livello di applicazione

Prova di Esame - Rete Internet (ing. Giovanni Neglia) Lunedì 24 Gennaio 2005, ore 15.00

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

Esame Completo - 11 Luglio 2017

Manuale per la configurazione di AziendaSoft in rete

Università degli Studi di Pisa Dipartimento di Informatica. NAT & Firewalls

Reti di Telecomunicazione Lezione 6

I casi d uso corrispondono ai compiti che l attore (che può essere una persona fisica e non) può svolgere.

Interprocess Communications - II. Franco Maria Nardini

NetMonitor. Micro guida all uso per la versione di NetMonitor

Codifica: dal diagramma a blocchi al linguaggio C++

Client - Server. Client Web: il BROWSER

Controllo Winsock di Visual Basic

Dal protocollo IP ai livelli superiori

Tesina esame Programmazione di Sistemi Mobile realizzata da Roberto Giuliani matricola Sockets e DatagramSocket

Gestione degli indirizzi

1. RETI INFORMATICHE CORSO DI LAUREA IN INGEGNERIA INFORMATICA SPECIFICHE DI PROGETTO A.A. 2013/ Lato client

Reti di Calcolatori. Il software

Reti di Telecomunicazioni Mobile IP Mobile IP Internet Internet Protocol header IPv4 router host indirizzi IP, DNS URL indirizzo di rete

Reti di Telecomunicazione Lezione 7

Esame Completo - 11 Luglio 2017

Prova di Esame - Rete Internet (ing. Giovanni Neglia) Lunedì 24 Gennaio 2005, ore 15.00

DATAGRAM SOCKET. Angelastro Sergio Diomede Antonio Viterbo Tommaso

DNS: Domain Name System

Corso di Reti di Calcolatori T

Stampe in rete Implementazione corretta

CONFIGURAZIONE NUOVO SISTEMA DI POSTA ELETTRONICA CON THUDERBIRD

Firewall e NAT A.A. 2005/2006. Walter Cerroni. Protezione di host: personal firewall

Datagrammi. NOTA: MulticastSocket estende DatagramSocket

Indirizzi Internet e. I livelli di trasporto delle informazioni. Comunicazione e naming in Internet

Reti. Reti. IPv4: concetti fondamentali. arp (address resolution protocol) Architettura a livelli (modello OSI)

Approfondimento di Marco Mulas

Connessioni di rete. Progetto di reti di Calcolatori e Sistemi Informatici - Stefano Millozzi. PdR_ Stefano Millozzi

Comunicazione tra Computer. Protocolli. Astrazione di Sottosistema di Comunicazione. Modello di un Sottosistema di Comunicazione

Esercitazione. Formato di compitini e compiti: domande ed esercizi "closed book" G. Ferrari - Reti di calcolatori.

Gestione degli indirizzi

PARTE 1 richiami. SUITE PROTOCOLLI TCP/IP ( I protocolli di Internet )

Rete Internet Prova in Itinere Mercoledì 23 Aprile 2008

Il sistema di I/O. Hardware di I/O Interfacce di I/O Software di I/O. Introduzione

E possibile modificare la lingua dei testi dell interfaccia utente, se in inglese o in italiano, dal menu [Tools

API e socket per lo sviluppo di applicazioni Web Based

Assegnamento di un indirizzo IP temporaneo a dispositivi Barix

Corsi di Reti di Calcolatori (Docente Luca Becchetti)

Transcript:

Fondamenti di Internet e Reti Antonio Capone, Matteo Cesana, Ilario Filippini, Guido Maier Fondamenti di Internet e Reti

Programmazione Socket Antonio Capone, Matteo Cesana, Ilario Filippini, Guido Maier Fondamenti di Internet e Reti

Attività di laboratorio Versioni software Gli esempi mostrati a lezione usano: python versione 2.7 python 3 ha alcune differenze sintattiche che richiedono modifiche agli esempi pycharm IDE education edition include python 2.7 Tutti gli esempi sono testati nella macchina locale usiamo i socket per far comunicare processi in esecuzione sulla stessa macchina gli esempi funzionano altrettanto bene se i processi sono in esecuzione in due macchine distinte

Programmazione Socket Obiettivo: imparare a sviluppare applicazioni client/server che comunicano utilizzando i sockets Socket: porta tra il processo applicativo e il protocollo di trasporto end-to-end application process socket application process controlled by app developer transport transport network link Internet network link controlled by OS physical physical

Programmazione Socket API = Application Programming Interface Socket API Introdotto in BSD4.1 UNIX, 1981 Creati, utilizzati e rilasciati esplicitamente dalle applicazioni Paradigma client/server Socket API offre due tipi di servizio di trasporto: UDP TCP socket È un interfaccia (porta) creata dall applicazione e controllata dal SO attraverso la quale un processo applicativo può inviare e ricevere messaggi a/da un altro processo applicativo BSD = Berkeley Software Distribution

Programmazione Socket - Basi Il serve deve essere in esecuzione prima che il client possa inviare dati ad esso (deamon) Il server deve avere un socket (porta) attraverso il quale riceve ed invia segmenti Allo stesso modo anche il client necessità di un socket Il client deve conoscere l indirizzo IP del server e il numero di port del processo server

Programmazione Socket con UDP UDP: non c è connessione tra client and server no handshaking Il mittente inserisce esplicitamente indirizzo IP e porta destinazione ad ogni segmento Il SO inserisce l indirizzo IP e la porta del socket origine ad ogni segmento Il server può ricavare indirizzo IP e porta del mittente dai segmenti ricevuti Punto di vista dell applicazione UDP fornisce trasporto non affidabile di gruppi di bytes all interno di datagrammi scambiati tra client e server Nota: il termine corretto per pacchetto UDP sarebbe datagramma, ma in questa lezione useremo invece il termine segmento UDP.

Esempio Client: L utente inserisce una riga di testo L applicazione client invia la riga al server Server: Il server riceve la riga di testo Rende maiuscole tutte le lettere Invia la riga modificata al client Client: Riceve la riga di testo La visualizza Useremo Python come linguaggio di programmazione

Interazione tra socket Client/server: UDP Server (running on hostid) Client create socket, port= x. serversocket = socket(af_inet,sock_dgram) read datagram from serversocket create socket, clientsocket = socket(af_inet,sock_dgram) Create datagram with server IP and port=x; send datagram via clientsocket write reply to serversocket specifying client address, port number read datagram from clientsocket close clientsocket

Interazione tra socket Client/server: UDP Server (running on hostid) Client crea socket, port= x. serversocket = socket(af_inet,sock_dgram) Legge datagram da serversocket Crea socket, clientsocket = socket(af_inet,sock_dgram) Crea datagram con server IP e port=x; invia il datagram via clientsocket Scrive una risposta su serversocket specificando indirizzo di host e numero di porta del client Legge il datagrama di risposta da clientsocket chiude clientsocket

Interazione tra socket Client/server: UDP Server (running on hostid) crea socket, port= x. serversocket = socket(af_inet,sock_dgram) Legge datagram da serversocket Scrive una risposta su serversocket specificando indirizzo di host e numero di porta del client Well-known o registered port # - deve essere noto al client Client Crea socket, clientsocket = socket(af_inet,sock_dgram) Crea datagram con server IP e port=x; invia il datagram via clientsocket Legge il datagrama di risposta da clientsocket chiude clientsocket IP del server deve essere noto al client serversocket = socket(af_inet,sock_dgram) Nome oggetto (metodo) Nome classe

clientsocket.sendto clientsocket.recvfrom raw_input Esempio: Python client (UDP) keyboard monitor Processo Process Client Output: invia un pacchetto (nota che TCP invia un byte stream ) input stream UDP packet infromuser sendpacket receivepacket UDP packet Input: riceve un pacchetto (nota che TCP riceve un byte stream ) Buffer di datagrammi client clientsocket UDP socket UDP socket to network from network 12

Applicazione esempio: UDP client include Python s socket library Crea un socket UDP per il server Legge l input da tastiera Aggiunge il nome del server e la porta al messaggio; lo invia nel socket Legge i caratteri della risposta del server dal socket e li memorizza in una stringa Mostra la stringa ricevuta e chiude il socket Python UDPClient from socket import * servername = localhost serverport = 12000 clientsocket = socket(af_inet, # porta dinamica SOCK_DGRAM) message = raw_input( Input lowercase sentence: ) clientsocket.sendto(message,(servername, serverport)) modifiedmessage, serveraddress = print modifiedmessage clientsocket.close() Nome simbolico del server 12000: # porta processo server SOCK_DGRAM UDP Dimensione del buffer clientsocket.recvfrom(2048) Il socket si pone in ascolto (l esecuzione procede quando arriva un segmento UDP) La chiamata al DNS per traduzione servername (hostname) IP server è fatta dal sistema operativo

Applicazione esempio: UDP server Python UDPServer Crea un socket UDP Assegna il socket all porta locale 12000 loop infinito Legge dal socket UDP message, memorizzando l indirizzo del client (IP e porta) Risponde al client con la stringa tutta in maiuscolo from socket import * serverport = 12000 serversocket = socket(af_inet, SOCK_DGRAM) serversocket.bind(('', serverport)) print The server is ready to receive while 1: message, clientaddress = serversocket.recvfrom(2048) modifiedmessage = message.upper() serversocket.sendto 12000: registered port # Il socket si pone in ascolto (l esecuzione procede quando arriva un segmento UDP) I dati per costruire la risposta sono esplicitamente ricavati dal pacchetto UDP ricevuto (modifiedmessage, clientaddress) Elaborazione strettamente seriale dei pacchetti Dimensione del buffer

UDP: osservazioni e domande Client e server utilizzando entrambi DatagramSocket IP destinazione e porta sono esplicitamente inseriti nel segmento Il client non può inviare un segmento al server senza conoscere l indirizzo IP e la porta del server Il server può essere utilizzato da più di un client, ma tutti invieranno i pacchetti tramite lo stesso socket La separazione dei dati da/a diversi client è un compito che spetta interamente al server

Eseguire il server In pycharm il server si può lanciare dal menu contestuale (tasto destro sul nome dello script) oppure con la sequenza di tasti Ctrl+Shift+F10

Messaggi del server

Verifica nell elenco dei processi Il server è in esecuzione

Eseguire il client Analogamente al server anche il client si può lanciare dal menu contestuale (tasto destro sul nome dello script).

Inserimento input inserire la frase da convertire

Ricezione e visualizzazione output output

Passi successivi Il server è ancora in esecuzione. Il client può essere eseguito altre volte e il sistema operativo assegna una porta diversa ogni volta. Esercizio: modificare il server in modo che scriva l indirizzo IP e numero di porta del client.

Per fermare il server premere il pulsante rosso

indirizzo IP del client 127.0.0.1 = loopback porte UDP sorgente del client (per ogni riga un esecuzione del client)

Gestione degli errori Vediamo cosa accade se inviamo dati (e aspettiamo dati) da un server inesistente. Nel client modifichiamo la porta destinazione in 12001 (nessun processo è in ascolto su tale porta) Di norma il server risponde con un messaggio di errore, che deve essere gestito dal client. Tuttavia il messaggio di errore potrebbe perdersi oppure arrivare quando il client è bloccato sulla socket.recvfrom. In tal caso il messaggio viene ignorato. Due possibili esiti: 1) il messaggio di errore dal server diventa un eccezione python 2) il client aspetta all infinito un messaggio dal server Soluzione: impostare un timeout alle operazioni sui socket catturare le eccezioni python scadenza timeout messaggi di errore

Impostare un timeout Si usa il comando clientsocket.settimeout(<timeout>) Può essere inserito ovunque prima della chiamata a recvfrom il timeout è un valore con virgola espresso in secondi

Catturare le eccezioni Gli errori di socket (compresi i timeout) lanciano eccezioni python Per catturare l eccezione racchiudere il codice che può lanciare l eccezione in un blocco try except try: clientsocket.sendto(message,(servername, serverport)) modifiedmessage, serveraddress = clientsocket.recvfrom(2048) print modifiedmessage except error, v: print "Failure" print v

Esercizio a) Scrivere un nuovo client UDP che non dia errore nel caso di server inesistente. b) Scrivere un client UDP errato che termina prima di ricevere la risposta dal server. Cosa accade al server? Che modifiche sono necessarie?

Programmazione socket con TCP Servizio TCP: trasferimento affidabile di bytes da un processo all altro Controllato dallo sviluppatore dell app Controllato dal Sistema operativo process socket TCP con buffers, variabili internet process socket TCP con buffers, variabili Controllato dallo sviluppatore dell app Controllato dal Sistema operativo host o server host o server

Programmazione socket con TCP Il client deve contattare server Il processo server deve essere eseguito per primo e deve aver creato un socket (porta) per accogliere le richieste del client Il client contatta il server: Creando un socket TCP Welcome socket: assomiglia un po a socket UDP; può ricevere da tutti Punto di vista dell applicazione TCP fornisce trasferimento affidabile e ordinato di bytes ( pipe ) tra client e server specificando indirizzo IP e numero di porta del processo server Quando il client crea il socket: il client TCP instaura una connessione col server TCP Quando contattato dal client, il server TCP crea un nuovo socket per la comunicazione tra processo server e client Permettendo al server di comunicare con diversi client Usando i numeri di porta sorgente per distinguere i client

Interazione tra socket Client/server: TCP Server (running on hostid) crea socket, port=x, for incoming request: serversocket = socket() wait for incoming connection request connectionsocket = serversocket.accept() read request from connectionsocket Passive open TCP connection setup Active open Client crea socket, connect to hostid, port=x clientsocket = Socket() send request using clientsocket write reply to connectionsocket close connectionsocket Active close read reply from clientsocket close clientsocket

clientsocket.send clientsocket. recv raw_input Stream jargon Uno stream (flusso) è una sequenza di caratteri che scorrono in/fuori da un processo. Un input stream viene associato ad una sorgente di input per un processo es: una tastiera o un socket Processo Process client input stream keyboard infromuser monitor Un output stream viene associato ad una sorgente d uscita es: un monitor o un socket Buffer di byte output stream outtoserver to network infromserver client TCP clientsocket socket input stream from network TCP socket

Programmazione socket con TCP Esempio applicazione client-server: 1) Il client legge una riga dallo standard input (infromuser stream) e la invia al server attraverso un socket (outtoserver stream) 2) Il server legge una riga dal socket 3) Il server converte la riga in maiuscola e le invia al client 4) Il client legge la riga dal socket (infromserver stream) e la mostra all utente

Applicazione d esempio: client TCP Crea un socket TCP verso il server remoto, porta 12000 Non è necessario appendere indirizzo e porta del server Python TCPClient from socket import * servername = servername serverport = 12000 clientsocket = socket(af_inet, SOCK_STREAM) clientsocket.connect((servername,serverport)) sentence = raw_input( Input lowercase sentence: ) clientsocket.send(sentence) Nome simbolico del server Server port # SOCK_STREAM TCP modifiedsentence = clientsocket.recv(1024) print From Server:, modifiedsentence clientsocket.close() Dimensione del buffer La chiamata al DNS per traduzione hostname IP server è fatta dal sistema operativo

Applicazione d esempio: server TCP Crea welcoming socket TCP Il server si mette in ascolto per connessioni TCP in ingresso loop infinito Il server resta in attesa di richieste di connessione sull accept(); a connessione instaurata viene ritornato un nuovo socket Legge bytes dal socket (non legge anche l indirizzo, come in UDP) Chiude la connessione col client corrente (ma non il welcoming socket!) Python TCPServer from socket import * serverport = 12000 serversocket = socket(af_inet,sock_stream) serversocket.bind((,serverport)) serversocket.listen(1) Socket di ascolto (passive open) print The server is ready to receive while 1: All arrivo di una active open (accept) la server socket crea una connection socket dedicata a quel client connectionsocket, addr = serversocket.accept() sentence = connectionsocket.recv(1024) capitalizedsentence = sentence.upper() connectionsocket.send(capitalizedsentence) connectionsocket.close()

Esercizio Eseguire il server TCP e il client TCP.

Connessioni persistenti Una coppia client e server TCP possono usare una socket aperta più volte. TCP non fornisce un meccanismo di delimitazione dei messaggi applicativi. Quindi un protocollo applicativo deve determinare quando iniziano/finiscono i messaggi quando terminare la connessione Nel nostro esempio di connessioni persistenti> ogni messaggio è terminato da un carattere «a capo» e la connessione va terminata quando il messaggio è un singolo punto «.»

Client persistente from socket import * servername = 'localhost' serverport = 12000 clientsocket = socket(af_inet, SOCK_STREAM) clientsocket.connect((servername, serverport)) while True: sentence = raw_input('input lowercase sentence (. to stop):') clientsocket.send(sentence) if sentence == '.': break modifiedsentence = clientsocket.recv(1024) print 'From Server:', modifiedsentence clientsocket.close()

Server persistente from socket import * serverport = 12000 serversocket = socket(af_inet, SOCK_STREAM) serversocket.bind(('', serverport)) serversocket.listen(1) while True: print 'The server is ready to receive' connectionsocket, addr = serversocket.accept() while True: sentence = connectionsocket.recv(1024) if sentence == '.': break capitalizedsentence = sentence.upper() connectionsocket.send(capitalizedsentence) connectionsocket.close()

Exercise 2 a) Eseguire il client persistente e inviare messaggi multipli b) Senza chiudere il primo client, aprirne un secondo e poi un terzo. Cosa accade? c) Terminare il primo client. Cosa accade al secondo client?

Coda delle connessioni incomplete Le richieste di apertura di connessione si accodano in una coda di connessioni incomplete. Il comando accept preleva la prima connessione incompleta e crea una socket. Con il comando serversocket.listen(1) abbiamo istanziato una coda delle connessioni incomplete di lunghezza 1. Quando il server sta servendo il primo client, la seconda richiesta rimane in coda, mentre la terza viene rifiutata.

Multithreaded servers Per gestire client multipli il server deve attivare più worker: un worker per gestire le richieste di connessione entranti (listening socket) un worker per gestire ciascuna connessione (active socket) Due paradigmi: ogni worker è un thread facile e veloce alcune limitazioni (numero max di thread paralleli, tutti i thread hanno gli stessi permessi etc ) ogni worker è un processo aggiunge complessità e latenza Esiste un terzo paradigma: un solo worker che serve a turno un messaggio da ogni socket (molto efficiente, ma più complicato da gestire).

Multithreaded servers in python from socket import * import thread def handler(connectionsocket): while True: sentence = connectionsocket.recv(1024) if sentence ==.': break capitalizedsentence = sentence.upper() connectionsocket.send(capitalizedsentence) connectionsocket.close() serverport = 12000 serversocket = socket(af_inet, SOCK_STREAM) serversocket.setsockopt(sol_socket, SO_REUSEADDR, 1) serversocket.bind(('', serverport)) serversocket.listen(1) while True: print 'The server is ready to receive' newsocket, addr = serversocket.accept() thread.start_new_thread(handler, (newsocket,)) Il codice per gestire ogni connessione attiva va in una funzione Bisogna consentire al socket locale di usare più volte la stessa porta Ogni connessione viene servita in un nuovo thread

Esercizio Scrivere un client che invia 100 caratteri, usando una chiamata send alla volta. Scrivere un server che scriva il numero di caratteri ricevuti ad ogni recv. a) Cosa accade? b) Inserire una breve pausa dopo ogni send. Cosa accade?