• Non ci sono risultati.

applicativi di rete

N/A
N/A
Protected

Academic year: 2021

Condividi "applicativi di rete"

Copied!
56
0
0

Testo completo

(1)

Scrittura dei programmi applicativi di rete

Scrittura dei programmi Scrittura dei programmi

applicativi di rete

applicativi di rete

(2)

Contenuti del corso Contenuti del corso

Æ La progettazione delle reti Æ La progettazione delle reti

Æ Il routing nelle reti IP Æ Il routing nelle reti IP

Æ Il collegamento agli Internet Service Provider e problematiche di sicurezza

Æ Il collegamento agli Internet Service Provider e problematiche di sicurezza

Æ Analisi di traffico e dei protocolli applicativi

Æ Analisi di traffico e dei protocolli applicativi

Æ Multimedialità in rete Æ Multimedialità in rete

Æ Tecnologie per le reti future Æ Tecnologie per le reti future

(3)

Contenuti del corso Contenuti del corso

Æ La progettazione delle reti Æ La progettazione delle reti

Æ Il routing nelle reti IP Æ Il routing nelle reti IP

Æ Il collegamento agli Internet Service Provider e problematiche di sicurezza

Æ Il collegamento agli Internet Service Provider e problematiche di sicurezza

Æ Analisi di traffico e dei protocolli applicativi

Æ Analisi di traffico e dei protocolli applicativi

Æ Multimedialità in rete Æ Multimedialità in rete

Æ Tecnologie per le reti future Æ Tecnologie per le reti future

(4)

Argomenti della lezione Argomenti della lezione

Î L’interfaccia Socket Î

L’interfaccia Socket

Î Client e server TCP e UDP Î

Client e server TCP e UDP

Î Esempi Î

Esempi

(5)

Interfaccia Socket Interfaccia Socket

Originariamente sviluppata per i sistemi Unix

Originariamente sviluppata per i sistemi Unix

ÎÎ

Consente al livello delle

applicazioni di richiedere/ottenere servizi del livello di trasporto

(TCP/UDP)

Consente al livello delle

applicazioni di richiedere/ottenere servizi del livello di trasporto

(TCP/UDP) ÎÎ

(6)

Tipi di dato Tipi di dato

u_char

u_char

u_short

u_short

u_long

u_long

unsigned char (8 bit) unsigned char (8 bit)

unsigned short int (16 bit) unsigned short int (16 bit)

unsigned long int (32 bit) unsigned long int (32 bit)

(7)

Indirizzo IP Indirizzo IP

/* internet address */

struct in_addr {

u_long s_addr;

};

/* internet address */

struct in_addr {

u_long s_addr;

};

(8)

Indirizzo socket 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];

};

/* 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];

};

(9)

Indirizzo socket 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];

};

/* 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!

(10)

Struttura socket Struttura socket

sin_len sin_len

sin_family sin_family

sin_port sin_port

sin_zero sin_zero

indirizzo socket remotoindirizzo socket remoto

sin_len sin_len

sin_family sin_family

sin_port sin_port

sin_zero sin_zero

indirizzo socket localeindirizzo socket locale

famiglia famiglia

tipotipo

protocollo protocollo

sin_addr

sin_addr sin_addrsin_addr

(11)

Tipi di socket Tipi di socket

livello data-link e livello fisico livello data-link

e livello fisico

TPC TPC

TPC UDP UDP UDP socket

stream socket

stream socket datagram socket

datagram socket socket raw

raw

applicazione

applicazione

IPIP

(12)

Compatibilità dei formati Compatibilità dei formati

Sistema big-endian

Sistema big-endian

MSB MSB LSB LSB

00001101 00001101 AA

10111101 10111101 A+1A+1

00000001 00000001 A+2A+2

11100001 11100001 A+3A+3

00001101

00001101 1011110110111101 0000000100000001 1110000111100001

(13)

Compatibilità dei formati Compatibilità dei formati

Sistema little-endian

Sistema little-endian

00001101

00001101 1011110110111101 0000000100000001 1110000111100001

MSB MSB LSB LSB

00001101 00001101 AA

10111101 10111101 A+1A+1 0000000100000001 A+2A+2

11100001 11100001

A+3A+3

(14)

Compatibilità dei formati Compatibilità dei formati

I protocolli della famiglia TCP/IP I protocolli della famiglia TCP/IP

usano il formato

usano il formato

big

big

-

-

endian

endian

(15)

Funzioni di conversione di formato

Funzioni di conversione di formato

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);

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);

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

al formato “network” e viceversa Convertono un intero (signed, long)

dal formato “host”

al formato “network” e viceversa

(16)

Funzioni di conversione di indirizzo

Funzioni di conversione di indirizzo

unsigned long inet_addr (const char *);

int inet_aton (const char *,

struct in_addr *);

char *inet_ntoa (struct in_addr);

unsigned long inet_addr (const char *);

int inet_aton (const char *,

struct in_addr *);

char *inet_ntoa (struct in_addr);

Convertono la rappresentazione decimale (stringa ASCII) di un

indirizzo IP nella rappresentazione numerica interna e viceversa

Convertono la rappresentazione decimale (stringa ASCII) di un

indirizzo IP nella rappresentazione numerica interna e viceversa

(17)

Chiamata al DNS 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);

struct hostent {

char *hname;

char *haliases[];

int h_addrtype;

int h_length;

char *h_addr_list[];

};

struct hostent *gethostbyname

(const char *hostname);

(18)

Chiamata al DNS 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);

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

(19)

Chiamata al DNS 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);

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)

(20)

Chiamata al DNS 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);

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”)

(21)

Chiamate di sistema Chiamate di sistema

socket bind

connect listen accept socket bind

connect listen accept

sendto

recvfrom read

write close sendto

recvfrom read

write

close

(22)

Chiamate di sistema Chiamate di sistema

int socket

(int family, int type, int protocol);

int socket

(int family, int type, int protocol);

AF_INET

AF_INET SOCK_DGRAM SOCK_STREAM SOCK_DGRAM

SOCK_STREAM 00

Î Crea un descrittore socket Î Crea un descrittore socket

Î R

estituisce un intero che sarà usato per i riferimenti al socket

Î R

estituisce un intero che sarà

usato per i riferimenti al socket

(23)

Chiamate di sistema Chiamate di sistema

int bind

(int sockfd,

const struct sockaddr_in *localaddr, int localaddrlen);

int bind

(int sockfd,

const struct sockaddr_in *localaddr, int localaddrlen);

Î A

ggiunge un indirizzo socket ad socket già creato

Î A

ggiunge un indirizzo socket

ad socket già creato

(24)

Chiamate di sistema Chiamate di sistema

int bind

(int sockfd,

const struct sockaddr_in *localaddr, int localaddrlen);

int bind

(int sockfd,

const struct sockaddr_in *localaddr, int localaddrlen);

Î V

iene utilizzata dai server

per dichiarare la porta su cui ascoltano

Î V

iene utilizzata dai server

per dichiarare la porta su

cui ascoltano

(25)

Chiamate di sistema Chiamate di sistema

int connect (int sockfd,

const struct sockaddr_in *serveraddr, int serveraddrlen);

int connect (int sockfd,

const struct sockaddr_in *serveraddr, int serveraddrlen);

Î P

ermette ad un processo

(tipicamente il client) di aprire una connessione

Î P

ermette ad un processo

(tipicamente il client) di aprire

una connessione

(26)

Chiamate di sistema Chiamate di sistema

int listen

(int sockfd, int backlog);

int listen

(int sockfd, int backlog);

Î U

sata dai server TCP

Î U

sata dai server TCP

Î I

nforma il sistema operativo che il server è pronto ad accettare

connessioni (creazione di un

“socket passivo”)

Î I

nforma il sistema operativo che il server è pronto ad accettare

connessioni (creazione di un

“socket passivo”)

(27)

Chiamate di sistema Chiamate di sistema

int accept

(int sockfd,

const struct sockaddr_in *clientaddr, int *clientaddrlen);

int accept

(int sockfd,

const struct sockaddr_in *clientaddr, int *clientaddrlen);

Î U

sata dai server TCP

Î U

sata dai server TCP

Î R

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

Î R

imuove la prima richiesta di

connessione dalla coda delle

connessioni in attesa

(28)

Chiamate di sistema Chiamate di sistema

int accept

(int sockfd,

const struct sockaddr_in *clientaddr, int *clientaddrlen);

int accept

(int sockfd,

const struct sockaddr_in *clientaddr, int *clientaddrlen);

Î R

estituisce (in serveraddr e in serveraddrlen) l’indirizzo del client

Î R

estituisce (in serveraddr e in

serveraddrlen) l’indirizzo del

client

(29)

Chiamate di sistema Chiamate di sistema

int accept

(int sockfd,

const struct sockaddr_in *clientaddr, int *clientaddrlen);

int accept

(int sockfd,

const struct sockaddr_in *clientaddr, int *clientaddrlen);

Î R

estituisce il descrittore

socket da usare per questa connessione

Î R

estituisce il descrittore

socket da usare per questa

connessione

(30)

Chiamate di sistema Chiamate di sistema

int sendto

(int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *toaddr, int toaddrlen);

int sendto

(int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *toaddr, int toaddrlen);

Î I

nvia un messaggio UDP

Î I

nvia un messaggio UDP

(31)

Chiamate di sistema Chiamate di sistema

int sendto

(int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *toaddr, int toaddrlen);

int sendto

(int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *toaddr, int toaddrlen);

Î I

flag normalmente sono a zero

Î I

flag normalmente sono a zero

(32)

Chiamate di sistema Chiamate di sistema

int sendto

(int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *toaddr, int toaddrlen);

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

Î R

estituisce il numero di byte

inviati

(33)

Chiamate di sistema Chiamate di sistema

int recvfrom (int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *fromaddr, int *fromaddrlen);

int recvfrom (int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *fromaddr, int *fromaddrlen);

Î R

iceve un messaggio UDP

Î R

iceve un messaggio UDP

(34)

Chiamate di sistema Chiamate di sistema

int recvfrom (int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *fromaddr, int *fromaddrlen);

int recvfrom (int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *fromaddr, int *fromaddrlen);

Î I

flag normalmente sono a zero

Î I

flag normalmente sono a zero

(35)

Chiamate di sistema Chiamate di sistema

int recvfrom (int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *fromaddr, int *fromaddrlen);

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

Î R

estituisce il numero di byte

ricevuti

(36)

Chiamate di sistema Chiamate di sistema

int recvfrom (int sockfd,

const void *buf, int buflen, int flags,

const struct sockaddr_in *fromaddr, int *fromaddrlen);

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

Î R

estituisce (in fromaddr e in

fromaddrlen) l’indirizzo del

mittente

(37)

Chiamate di sistema Chiamate di sistema

int read

(int sockfd,

const void *buf, int buflen);

int write

(int sockfd,

const void *buf, int buflen);

int read

(int sockfd,

const void *buf, int buflen);

int write

(int sockfd,

const void *buf, int buflen);

Î L

eggono/scrivono sulla connessione TCP

Î L

eggono/scrivono sulla

connessione TCP

(38)

Chiamate di sistema Chiamate di sistema

int read

(int sockfd,

const void *buf, int buflen);

int write

(int sockfd,

const void *buf, int buflen);

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

Î R

estituiscono il numero di byte

letti/scritti

(39)

Chiamate di sistema Chiamate di sistema

int close (int sockfd);

int close (int sockfd);

Î C

hiude un socket e interrompe una connessione TCP

Î C

hiude un socket e interrompe

una connessione TCP

(40)

Librerie semplificate Librerie semplificate

Æ Sviluppate dal prof. Montessoro per agevolare la scrittura di semplici

esempi didattici di applicazioni client-server

Æ Sviluppate dal prof. Montessoro per agevolare la scrittura di semplici

esempi didattici di applicazioni client-server

Æ Per TCP: tcpsocketlib Æ Per TCP: tcpsocketlib

Æ Per UDP: udpsocketlib Æ Per UDP: udpsocketlib

(41)

Libreria tcpsocketlib 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 tcp_send (int sk, char *buffer);

int tcp_receive (int sk, char *buffer);

void server_handler (int sk);

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 tcp_send (int sk, char *buffer);

int tcp_receive (int sk, char *buffer);

void server_handler (int sk);

(42)

Libreria udpsocketlib Libreria udpsocketlib

int create_udp_client (void);

int create_udp_server

(char *ip_address, int port);

int close_udp_socket (int sk);

int udp_send (int sk, char *buffer,

char *ip_address, int port);

int udp_receive (int sk, char *buffer);

int udp_reply (int sk, char *buffer);

void server_handler (int sk);

int create_udp_client (void);

int create_udp_server

(char *ip_address, int port);

int close_udp_socket (int sk);

int udp_send (int sk, char *buffer,

char *ip_address, int port);

int udp_receive (int sk, char *buffer);

int udp_reply (int sk, char *buffer);

void server_handler (int sk);

(43)

Esempio: UDP Esempio: UDP

Î I client inoltrano al server l’offerta e l’identificativo dell’offerente

Î I client inoltrano al server l’offerta e l’identificativo dell’offerente

Scrivere un’applicazione

client-server per gestire le offerte in un’asta:

Scrivere un’applicazione

client-server per gestire le offerte in un’asta:

Î Il server mantiene in memoria

soltanto l’offerta migliore e risponde

al client se l’offerta è stata accettata o no

Î Il server mantiene in memoria

soltanto l’offerta migliore e risponde

al client se l’offerta è stata accettata o no

(44)

asta.c asta.c

socket

bind (TSAP server)

while (recvfrom

(dati offerta, TSAP client)) { sendto

(TSAP client, risposta)

}

socket

bind (TSAP server)

while (recvfrom

(dati offerta, TSAP client)) { sendto

(TSAP client, risposta)

} socket

sendto

(TSAP server, dati offerta)

receive (risposta) close

socket sendto

(TSAP server, dati offerta)

receive (risposta) close

processo server processo server n processi client

n processi client

(45)

Esempio: TCP Esempio: TCP

Scrivere un’applicazione client-server per raccogliere

le iscrizioni per una gara:

ogni client invia il nome del concorrente e riceve dal server

il numero di pettorale

(progressivo) assegnato a quel concorrente

Scrivere un’applicazione client-server per raccogliere

le iscrizioni per una gara:

ogni client invia il nome del concorrente e riceve dal server

il numero di pettorale

(progressivo) assegnato a quel concorrente

(46)

Esempio: TCP Esempio: TCP

Il server, inoltre, salva su un file tutti i nomi e i relativi numeri L’elenco degli iscritti può essere

richiesto da qualsiasi client

Il server, inoltre, salva su un file tutti i nomi e i relativi numeri L’elenco degli iscritti può essere

richiesto da qualsiasi client

(47)

gara.c gara.c

socket

bind (TSAP server) listen

while (TRUE)

{ accept (connessione) while

(comandi utente) { read

(comando e dati) write (risposta)

close (connessione)} }

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 socket connect

(TSAP server)

while (comandi utente) { write

(comando e dati) read (risposta)

}

close

processo server processo server n processi client

n processi client

(48)

Comandi dal client al server e messaggi di risposta:

Comandi dal client al server e messaggi di risposta:

ISCRIVI <nome>

Æ <nome> <numero di pettorale>

ISCRIVI <nome>

Æ <nome> <numero di pettorale>

gara.c gara.c

LISTA

Æ elenco "<nome> <numero>\n"

terminato da '.' LISTA

Æ elenco "<nome> <numero>\n"

terminato da '.' BYE

Æ "Connessione chiusa\n"

BYE

Æ "Connessione chiusa\n"

(49)

Tipi di server Tipi di server

Î Sequenziale senza connessioni (UDP, singolo processo, viene servito un client alla volta)

Î Sequenziale senza connessioni (UDP, singolo processo, viene servito un client alla volta)

Il server non deve essere

monopolizzato da un singolo client:

Il server non deve essere

monopolizzato da un singolo client:

Î Parallelo con connessioni (TCP, un processo per ogni client) Î Parallelo con connessioni

(TCP, un processo per ogni client)

(50)

Server sequenziale senza connessioni

Server sequenziale senza connessioni

Un client Un client alla volta alla volta

UDPUDP Porta Portanota

nota Server

Server

UDPUDP Client Client

Porta effimeraPorta effimera

UDPUDP Client Client

Porta effimeraPorta effimera UDPUDP

Client Client

Porta effimeraPorta effimera

(51)

TCPTCP

Porte effimerePorte effimere

Server Server

Server parallelo con connessioni

Server parallelo con connessioni

TCPTCP Client Client

Porta effimeraPorta effimera TCPTCP

Client Client

Porta effimeraPorta effimera TCPTCP

Client Client

Porta effimeraPorta effimera

Server child Server

child Server

child Server

child Server child Server

child

Porta nota usata solo per Porta nota usata solo per l’apertura della connessione l’apertura della connessione

(52)

Client Client Client

socket (…)

socket

socket (…)(…)

recvfrom (…)

recvfrom

recvfrom (…)(…)

close (…)

close

close (…)(…)

sendto (…) sendto

sendto (…)(…)

Ripetuto in base Ripetuto in base

alle necessita alle necessita

Server Server Server

bind (…)

bindbind (…)(…)

Ripetuto infinite Ripetuto infinite

volte volte

Process Process Process recvfrom (…)

recvfrom

recvfrom (…)(…)

socket (…) socket

socket (…)(…)

sendto (…)

sendto

sendto (…)(…)

Risposte Risposte Risposte Richieste Richieste Richieste

(53)

Server parent Server

Server parentparent Server

Server

Server socketsocketsocket(…)(…)(…)

bind (…)

bindbind (…)(…)

listen (…)

listen

listen (…)(…)

Ripetuto all’infinito Ripetuto all’infinito Ripetuto all’infinito

accept (…)

accept

accept (…)(…)

fork (…) forkfork (…)(…)

close

(accepting)closeclose

(accepting(accepting))

close

(listening)closeclose

(listening(listening))

Ripetuto in base alle necessita Ripetuto in base Ripetuto in base

alle necessita alle necessita

write (…)

write

write (…)(…)

Processo Processo Processo read (…)

readread (…)(…)

close

(accepting)closeclose

(accepting(accepting))

socket (…)

socket

socket (…)(…)

connect (…) connect connect (…)(…)

Client Client Client

Ripetuto in base alle necessita Ripetuto in base Ripetuto in base

alle necessita alle necessita

read (…)

readread (…)(…)

write (…)

write

write (…)(…)

close (…)

close

close (…)(…) Server child Server Server

child child Risposta Risposta Risposta

Richiesta di connessioneRichiesta di Richiesta di connessione connessione

Richiesta Richiesta Richiesta

(54)

Esempio:

Esempio:

Server sequenziale e server parallelo Server sequenziale

e server parallelo

(55)

Acknowledgements/

bibliografia

Acknowledgements/

bibliografia

Behroutz A. Forouzan

“I protocolli TCP/IP”

McGraw-Hill Behroutz A. Forouzan

“I protocolli TCP/IP”

McGraw-Hill

(56)

Scrittura dei programmi applicativi di rete

Scrittura dei programmi Scrittura dei programmi

applicativi di rete

applicativi di rete

Riferimenti

Documenti correlati

La riforma dell’istituto, intervenuta nell’ambito del complesso provvedimento in tema di giustizia penale varato al termine della precedente legislatura, si inserisce in

Installazione Client Rete MediData Versione 1.6, 01.07.2019 / MediData INTERNO 12 / 12 Fatturazione delle prestazioni, questi dati devono essere trasmessi assolutamente al

Nota: se la spia di stato del Box MediData continua ad essere gialla o rossa, il Box MediData non è collegato alla Rete MediData.. Si metta in contatto con il Suo

Il suo spostamento è determinato dalla variazione spazio-temporale di tutti quei fattori fisici che ne determinano l’esistenza.... Il suo spostamento è determinato dalla

Per trasferire un file usando il protocollo ftp occorre avere a disposizione un'applicazione ftp chiamata client ftp (ce ne sono diverse anche di tipo freeware) che viene

„ Il campo “window” del pacchetto TCP indica quanti byte possono ancora essere trasmessi prima di un ACK. TCP: Timeout

48 Santa Maria di Palmas San Giovanni Suergiu Campestre. 49 San Giacomo Maggiore di Carloforte

Un semaforo di mutua eslusione per writer (meW) I writer sono soggetti a starvation, in quanto possono attendere per sempre. Sono possibili soluzioni più complesse senza starvation