Torna alla pagina di Sistemi per l'elaborazione delle informazioni
:: Temi d'esame di Sistemi - 16/04/2009 ::
Esercizio 1 (8 punti)
Un browser WEB deve scaricare una pagina che contiene 6 immagini da 1 Mbyte ciascuna,
3 delle quali sono memorizzate sullo stesso server e 3 se su un server diverso,
Si consideri sia l'utilizzo di HTTP 1.0 che 1.1.
(1)Quante connessioni TCP vengono aperte?
(2)Supponendo che la max banda vista dal browser sia 100 kbps su ciascuna connessione
TCP, che RTT sia costante su tutte le connessioni e pari a 100 msec, e che la banda
di partenza per tutte le connessioni sia 16 kbps, quanto è il tempo totale di
scaricamento di tutte le immagini?
Esercizio 2 (6 punti)
Un utente si collega al web della rete di un'azienda utilizza un proxy http che lavora
sulla porta 8080. Si supponga che il browser generi il seguente pacchetto di richiesta
HTTP:
GET http://www.unimi.it/HTTP/1.1
Accept: */*
Accept-Language: en
Accept-Encoding: gzip, deflate
Cookie: monster_728x240_expAnsa_091006=00238b6afa1ff3e8e1393f86619f
6837;
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en)
AppleWebKit/418.9
Pragma: no-cache
Connection: keep-alive
Host: www.unimi.it
a. Si descriva il significato di tutti i campi del pacchetto
b. Si illustri passo per passo cosa fa il proxy quando riceve la richiesta del
browser, supponendo che per quest'ultimo sia configurato per utilizzare come proxy la
porta 4040.
Esercizio 3 (12 punti)
Questo esercizio ha una soluzione grazie agli appunti inviati durante la chiusura della sezione Unicrema:) Non ne siete felici?:)
Il servizio ruptime fornisce il nome degli host attivi sulla sottorete e il loro tempo
totale di attività. Ecco la relativa pagina man:
NAME
ruptime -- show host status of local machines
SYNOPSIS
ruptime [-alrtu]
DESCRIPTION
Ruptime gives a status line like uptime for each machine on the local network;
these are formed from packets broadcast by each host on the network once a minute.
Machines for which no status report has been received for 11 minutes are shown
as being down.
Fornite lo pseudocodice per un client ruptime, facendo tutte le opportune ipotesi e
mettendo in evidenza le chiamate alla socket library che utilizzate.
Soluzione
Ecco le operazioni da fare:
- Creazione socket e configurazione per l'invio di pacchetti ogni minuto a tutti gli host
- Creazione socket ricezione (IP/porta host mittente richiesti da command line) + utilizzo
select()+utilizzo recvfrom()
//creo il socket per la trasmissione agli host della rete con modalita connectionless
if ((sock_upt = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
exit(1);
}
//attraverso la funzione si setsockopt abilito il broadcast
if (setsockopt(sock_upt, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) < 0) {
perror("setsockopt");
exit(1);
}
//inizializzo il socket
sin.sin_family = PF_INET;
sin.sin_addr.s_addr = INADDR_BROADCAST;
sin.sin_addr.s_port = htons(5555);
while(1) {
@adesso = localtime(time);
// solo nei primi due secondi di ogni minuto
if($adesso[0]<2) {
sendto(sock_upt,&info,lenght_uptime,0,sockadrr*)&sin,add_lenght);
}
}
// Creo l’array di descrittori di socket
for (port = 0; port < lenght; port++){
// Recupero la porta da utilizzare dalla lista di porte
// specificata a linea di comando
portNo = atoi(argv[port + 2]);
//richiedo indirizzo ip dell'host da cui voglio ricevere
//le informazioni sull'uptime
printf("Inserire indirizzo ip dell'host");
scanf(%c,add_client);
// Creo il socket relativo a quella porta
//e a quell'indirizzo e faccio il bind
servSock[port] = CreateUDPServerSocket(portNo,add_client);
}
while (running) {
// Azzero l’insieme dei socket controllati
//che saranno controllati dalla select.
//Deve essere chiamata prima di ogni select().
FD_ZERO(&rset);
// Inserisco i socket creati nella lista di descrittori che la select controlla
for (port = 0; port < noPorts; port++) {
FD_SET(servSock[port], &rset);
}
// Imposto il timeout prima di ogni select()
selTimeout.tv_sec = 6600; // secondi
if (select(servSock + 1, &rset, NULL, NULL, &selTimeout) == 0) {
//suppongo che se l'host non mi risp entro 11 min vuol dire che non è
// collegato e quindi non avrò richieste in lettura
printf("Timeoout");
} else {
//ricevo l'uptime del client di cui ho fatto richiesta
//specificando l'indirizzo del mittente
n=recvfrom(servSock + 1,&uptime,lenght,flags,sockaddr*) &add_client,add_lenght);
if(n<0) {
printf("errore");
} else {
printf(uptime);//visualizza le informazioni legate all'uptime del host richiesto
}
close(servSock+1);
}
}
Esercizio 4 (4 punti)
Sun XDR converte i dati nello standard big-endian prima di trasmetterli. Spiegate in
cosa consiste questa conversione attraverso un esempio. (Opzionale) Discutete vantaggi
e svantaggi di questa tecnica rispetto a Receiver Make it Right.