Swappa : Uni / Temi d'esame di Sistemi - 16/04/2009
Creative Commons License

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:

  1. Creazione socket e configurazione per l'invio di pacchetti ogni minuto a tutti gli host
  2. 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.
(Printable View of http://www.swappa.it/wiki/Uni/TemiEsameSED14)