• Non ci sono risultati.

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 1

N/A
N/A
Protected

Academic year: 2021

Condividi "© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 1"

Copied!
9
0
0

Testo completo

(1)

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 1

RETI DI CALCOLATORI

Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI

Facoltà di Ingegneria Università degli Studi di Udine

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 2 Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni dei trattati internazionali. Il titolo ed i copyright relativi alle slides (ivi inclusi, ma non limitatamente, ogni immagine, fotografia, animazione, video, audio, musica e testo) sono di proprietà degli autori prof. Pier Luca Montessoro e ing. Davide Pierattoni, Università degli Studi di Udine.

Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca, scolastici ed universitari afferenti al Ministero della Pubblica Istruzione e al Ministero dell’Università e Ricerca Scientifica e Tecnologica, per scopi istituzionali, non a fine di lucro. In tal caso non è richiesta alcuna autorizzazione.

Ogni altro utilizzo o riproduzione (ivi incluse, ma non limitatamente, le riproduzioni su supporti magnetici, su reti di calcolatori e stampe) in toto o in parte è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte degli autori.

L’informazione contenuta in queste slide è ritenuta essere accurata alla data della pubblicazione. Essa è fornita per scopi meramente didattici e non per essere utilizzata in progetti di impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza preavviso. L’autore non assume alcuna responsabilità per il contenuto di queste slide (ivi incluse, ma non limitatamente, la correttezza, completezza, applicabilità, aggiornamento dell’informazione).

In ogni caso non può essere dichiarata conformità all’informazione contenuta in queste slide.

In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono mai essere rimossi e devono essere riportati anche in utilizzi parziali.

Nota di Copyright

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 3

Scrittura dei programmi applicativi di rete

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 4

Argomenti della lezione

Î L’interfaccia Socket Î Client e server TCP e UDP Î Esempi

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 5

Interfaccia Socket

Î Originariamente sviluppata per i sistemi Unix

Î Consente al livello delle

applicazioni di richiedere/ottenere servizi del livello di trasporto (TCP/UDP)

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 6

Tipi di dato

u_char u_short u_long

unsigned char (8 bit)

unsigned short int (16 bit)

unsigned long int (32 bit)

(2)

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 7

Indirizzo IP

/* internet address */

struct in_addr {

u_long s_addr;

};

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 8

Indirizzo socket

/* aggiunge all’indirizzo IP la porta e la famiglia a cui appartiene il protocollo */

struct sockaddr_in {

u_char sin_len;

u_short sin_family;

u_short sin_port;

struct in_addr sin_addr;

u_long s_addr;

char sin_zero[8];

};

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 9

Indirizzo socket

/* aggiunge all’indirizzo IP la porta e la famiglia a cui appartiene il protocollo */

struct sockaddr_in {

u_char sin_len;

u_short sin_family;

u_short sin_port;

struct in_addr sin_addr;

u_long s_addr;

char sin_zero[8];

};

normalmente non utilizzati!

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 10

Struttura socket

sin_len

sin_family

sin_port

sin_zero indirizzo socket remoto

sin_len

sin_family

sin_port

sin_zero indirizzo socket locale famiglia

tipo

protocollo

sin_addr sin_addr

Tipi di socket

livello data-link e livello fisico

TCP UDP

socket

stream socket

datagram socket raw applicazione

IP

Compatibilità dei formati Sistema big-endian

MSB LSB

00001101 A

10111101 A+1

00000001 A+2

11100001 A+3

00001101 10111101 00000001 11100001

(3)

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 13

Compatibilità dei formati Sistema little-endian

00001101 10111101 00000001 11100001

MSB LSB

00001101 A

10111101 A+1 00000001 A+2

11100001

A+3

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 14

Compatibilità dei formati

I protocolli della famiglia TCP/IP usano il formato big-endian

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 15

u_short htons (u_short host_short);

u_short ntohs (u_short network_short);

u_long htonl (u_long host_long);

u_long ntohl (u_long network_long);

Funzioni di conversione di formato

Convertono un intero (signed, long) dal formato “host”

al formato “network” e viceversa

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 16

unsigned long inet_addr (const char *);

int inet_aton (const char *, struct in_addr *);

char *inet_ntoa (struct in_addr);

Funzioni di conversione di indirizzo

Convertono la rappresentazione decimale (stringa ASCII) di un indirizzo IP nella rappresentazione

numerica interna e viceversa

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 17

Chiamata al DNS

struct hostent {

char *hname;

char *haliases[];

int h_addrtype;

int h_length;

char *h_addr_list[];

};

struct hostent *gethostbyname

(const char *hostname);

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 18

Chiamata al DNS

struct hostent {

char *hname;

char *haliases[];

int h_addrtype;

int h_length;

char *h_addr_list[];

};

struct hostent *gethostbyname

(const char *hostname);

nome e lista

degli alias

(4)

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 19

Chiamata al DNS

struct hostent {

char *hname;

char *haliases[];

int h_addrtype;

int h_length;

char *h_addr_list[];

};

struct hostent *gethostbyname

(const char *hostname);

per IPv4:

h_addrtype = AF_INET h_length = 4 (byte)

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 20

Chiamata al DNS

struct hostent {

char *hname;

char *haliases[];

int h_addrtype;

int h_length;

char *h_addr_list[];

};

struct hostent *gethostbyname

(const char *hostname);

puntatori agli indirizzi dell’host (può essere

“multihomed”)

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 21

Chiamate di sistema

socket bind connect listen accept

sendto recvfrom read write close

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 22

Chiamate di sistema

int socket

(int family, int type, int protocol);

AF_INET AF_INET AF_INET

SOCK_DGRAM SOCK_STREAM SOCK_RAW

0 0 prot.

Î Crea un descrittore socket Î R estituisce un intero che sarà

usato per i riferimenti al socket

Chiamate di sistema

int bind (int sockfd,

const struct sockaddr_in *localaddr, int localaddrlen);

Î A ggiunge un indirizzo socket ad socket già creato

Chiamate di sistema

int bind (int sockfd,

const struct sockaddr_in *localaddr, int localaddrlen);

Î V iene utilizzata dai server per dichiarare la porta su

cui ascoltano

(5)

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 25

Chiamate di sistema

int connect (int sockfd,

const struct sockaddr_in *serveraddr, int serveraddrlen);

Î P ermette ad un processo (tipicamente il client) di aprire una connessione

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 26

Chiamate di sistema

int listen

(int sockfd, int backlog);

Î U sata dai server TCP

Î I nforma il sistema operativo che il server è pronto ad accettare connessioni (creazione di un

“socket passivo”)

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 27

Chiamate di sistema

int accept (int sockfd,

const struct sockaddr_in *clientaddr, int *clientaddrlen);

Î U sata dai server TCP

Î R imuove la prima richiesta di connessione dalla coda delle connessioni in attesa

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 28

Chiamate di sistema

int accept (int sockfd,

const struct sockaddr_in *clientaddr, int *clientaddrlen);

Î R estituisce (in clientaddr e in clientaddrlen) l’indirizzo del client

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 29

Chiamate di sistema

int accept (int sockfd,

const struct sockaddr_in *clientaddr, int *clientaddrlen);

Î R estituisce il descrittore socket da usare per questa connessione

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 30

Chiamate di sistema

int sendto (int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *toaddr, int toaddrlen);

Î I nvia un messaggio UDP

(6)

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 31

Chiamate di sistema

int sendto (int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *toaddr, int toaddrlen);

Î I flag normalmente sono a zero

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 32

Chiamate di sistema

int sendto (int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *toaddr, int toaddrlen);

Î R estituisce il numero di byte inviati

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 33

Chiamate di sistema

int recvfrom (int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *fromaddr, int *fromaddrlen);

Î R iceve un messaggio UDP

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 34

Chiamate di sistema

int recvfrom (int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *fromaddr, int *fromaddrlen);

Î I flag normalmente sono a zero

Chiamate di sistema

int recvfrom (int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *fromaddr, int *fromaddrlen);

Î R estituisce il numero di byte ricevuti

Chiamate di sistema

int recvfrom (int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *fromaddr, int *fromaddrlen);

Î R estituisce (in fromaddr e in

fromaddrlen) l’indirizzo del

mittente

(7)

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 37

Chiamate di sistema

Î L eggono/scrivono sulla connessione TCP

int read (int sockfd,

const void *buf, int buflen);

int write (int sockfd,

const void *buf, int buflen);

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 38

Chiamate di sistema

int read (int sockfd,

const void *buf, int buflen);

int write (int sockfd,

const void *buf, int buflen);

Î R estituiscono il numero di byte letti/scritti

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 39

Chiamate di sistema

int close (int sockfd);

Î C hiude un socket e interrompe una connessione TCP

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 40

Tipi di server

Î Sequenziale senza connessioni (UDP, singolo processo, viene servito un client alla volta) Il server non deve essere monopolizzato da un singolo client:

Î Parallelo con connessioni

(TCP, un processo per ogni client)

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 41

Server sequenziale senza connessioni

Un client alla volta

UDP Porta nota Server UDP

Client Porta effimera

UDP Client

Porta effimera UDP Client

Porta effimera

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 42

Server sequenziale UDP

socket

bind (TSAP server)

while (recvfrom

(comando e dati, TSAP client)) {

sendto

(TSAP client, risposta) }

socket sendto

(TSAP server, comando e dati)

receive (risposta) close

processo server

n processi client

(8)

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 43

Server sequenziale TCP (bloccante!)

socket

bind (TSAP server) listen

while (TRUE) {

accept (connessione) while

(comandi utente) {

read

(comando e dati) write (risposta) }

close (connessione) }

socket connect

(TSAP server) while (comandi utente) {

write

(comando e dati) read (risposta) }

close

processo server n processi client

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 44

TCP Porte effimere Server

Server parallelo con connessioni

TCP Client

Porta effimera TCP Client

Porta effimera TCP Client

Porta effimera

Server child Server

child Server child

Porta nota usata solo per l’apertura della connessione

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 45

Client socket (…)

recvfrom (…) close (…) sendto (…) Ripetuto in base

alle necessità

Server bind (…)

Ripetuto infinite volte

Process recvfrom (…)

socket (…)

sendto (…)

Risposte Richieste

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 46 Server parent Server socket (…)

bind (…) listen (…) Ripetuto all’infinito

accept (…) fork (…)

close (accepting) close

(listening) Ripetuto in base

alle necessita

write (…) Processo read (…)

close (accepting) socket (…)

connect

(…)

Client

Ripetuto in base alle necessità

read (…) write (…)

close (…) Server

child Risposta

Richiesta di connessione

Richiesta

Librerie semplificate

Æ Sviluppate dal prof. Montessoro per agevolare la scrittura di semplici esempi didattici di applicazioni client-server

Æ Per TCP: tcpsocketlib Æ Per UDP: udpsocketlib

Æ Per datagram IP senza intestazione di livello di trasporto: rawsocketlib

Libreria tcpsocketlib

int create_tcp_client_connection (char *ip_address, int port);

int create_tcp_server

(char *ip_address, int port);

int close_tcp_connection (int sk);

int server_handler (int sk);

(9)

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 49

Libreria tcpsocketlib

int tcp_send (int sk, char *buffer);

int tcp_receive (int sk, char *buffer);

void tcp_putchar (int sk, int ch);

int tcp_getchar (int sk);

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 50

Libreria udpsocketlib

int create_udp_client (void);

int create_udp_server

(char *ip_address, int port);

int close_udp_socket (int sk);

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 51

Libreria udpsocketlib

int udp_send (int sk, char *buffer, char *ip_address, int port);

int udp_receive (int sk, char *buffer);

int udp_receive_and_get_sender_info (int sk, char *buffer,

char *ip_address, int *pport);

int udp_reply (int sk, char *buffer);

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 52

Libreria rawsocketlib

int create_raw_socket

(char *ip_address, int protocol);

int close_raw_socket (int sk);

int raw_send (int sk, char *buffer, char *ip_address);

int raw_receive_and_get_sender_info (int sk, char *buffer,

char *ip_address);

int raw_reply (int sk, char *buffer);

© 2003 Pier Luca Montessoro (si veda la nota a pagina 2) 53

Acknowledgements/

bibliografia

Behroutz A. Forouzan

“I protocolli TCP/IP”

McGraw-Hill

Riferimenti

Documenti correlati

© 1999 Pier Luca Montessoro ( si veda la nota a pagina 2) 2 Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni

© 1999 Pier Luca Montessoro ( si veda la nota a pagina 2) 2 Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni

© 1999 Pier Luca Montessoro ( si veda la nota a pagina 2) 2 Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni

© 1999 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2) 2 Le tecnologie alla base del World Wide Web (I parte). © 1999 Pier Luca Montessoro ( si veda la nota a

© 2001 Pier Luca Montessoro (si veda la nota a pagina 2) 2 Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni dei

In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono mai essere rimossi e devono essere riportati anche in utilizzi parziali.. Nota

Ogni altro utilizzo o riproduzione (ivi incluse, ma non limitatamente, le riproduzioni su supporti magnetici, su reti di calcolatori e stampe) in toto o in.. Nota

© 2001-2007 Pier Luca Montessoro (si veda la nota a pagina 2) 2 Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni