[Socket/SOAP/REST]

Obiettivi:
- Scrivere la porzione di codice Java che serve per aprire un socket TCP in modalità client.
- Scrivere la porzione di codice Java che serve per aprire un socket TCP in modalità server in grado di gestire una sola connessione alla volta.
- Scrivere la porzione di codice Java che serve per aprire un socket TCP in modalità server in grado di gestire più connessioni contemporaneamente.
- Scrivere la porzione di codice Java che serve per spedire un messaggio UDP.
- Scrivere la porzione di codice Java che serve per ricevere un messaggio UDP.

Esempi di esercizio di programmazione:

Implementare un servizio di calcolo remoto: il client spedisce al server due numeri interi e il tipo di operatore (somma, sottrazione, moltiplicazione, divisione) e il server, dopo aver svolto il calcolo, restituisce al client il risultato. Il server gestisce una richiesta alla volta.
- si discuta la scelta del protocollo di livello trasporto
- che modifiche occorre fare al server per fargli gestire più richieste contemporaneamente?

Implementare un servizio di telepass: quando l'auto si avvicina al casello spedisce al server il proprio numero di targa e il server tiene traccia in un vettore del numero di passaggi per ogni targa. Il server deve gestire più richieste contemporaneamente. Si discuta la scelta del protocollo di livello trasporto.

Implementare un meccanismo Stop&Wait minimale. Blabla blabla. Si discuta la scelta del protocollo di livello trasporto. Spiegare come si potrebbe estendere per distinguere la perdita del dato da quella dell'ack. 
NOTA: per sospendere un processo per un certo numero di millisecondi+nanosecondi si usa
static void Thread.sleep(long millis, int nanos) throws InterruptedException

Implementare un servizio di monitoraggio della temperatura all'interno di un edificio. Ogni sensore di temperatura è dotato di interfaccia WiFi e si comporta da client nei confronti di un'applicazione che raccoglie i valori su tutto l'edificio per visualizzare dei grafici con l'andamento temporale. Il dato viene trasmesso ogni 5 secondi. Se il dato non è disponibile, il server applica una semplica interpolazione lineare. Si scriva il codice del client e del server che non necessita di gestire più ricezioni contemporaneamente. Si discuta la scelta del protocollo di livello trasporto.
NOTA: per sospendere un processo per un certo numero di millisecondi+nanosecondi si usa
static void Thread.sleep(long millis, int nanos) throws InterruptedException

Implementare un servizio di monitoraggio dei terminali Bancomat di un certo istituto bancario. Ogni terminale bancomat si comporta da client nei confronti di un'applicazione che raccoglie dei report testuali (log) sull'attività del bancomat. Il dato viene trasmesso ogni 5 minuti. Si scriva il codice del client e del server che necessita di gestire più ricezioni contemporaneamente. Si discuta la scelta del protocollo di livello trasporto.
NOTA: per sospendere un processo per un certo numero di millisecondi+nanosecondi si usa
static void Thread.sleep(long millis, int nanos) throws InterruptedException


Implementare un semplice servizio di webproxy. Il client si collega al proxy sulla porta 8000, gli comunica un URL e riceve la corrispondente pagina web (solo HTML) che stampa a video. Il proxy deve gestire molti client contemporaneamente. Si discuta:
- la scelta del protocollo di livello trasporto
- il posizionamento del proxy in una intranet protetta da firewall


Domande teoria:
- A cosa serve il package java.net?
- Cos'è un URL?
- Che differenza c'è tra i ruoli di client e server un'applicazione di rete indipendentemente dal tipo di protocollo di livello trasporto utilizzato?
- Qual è l'intervallo in cui varia una porta TCP o UDP? Quali messaggi di errore possono venire visualizzati quando lancio un server su una certa porta?
- Quale comando devo usare per conoscere l'indirizzo IP associato ad una certa interfaccia di rete del mio computer?
- E' possibile col protocollo TCP collegare due client allo stesso server? Se sì, come?
- Guardando l'implementazione in Java di un client TCP e un client UDP che differenza principale si può notare?
- Quali sono i vantaggi dei web service?
- Per quali diversi motivi ci può essere interesse che l'implementazione di un certo algoritmo avvenga su un server a cui accedere mediante un client? 
- Che cos'è e a cosa server un application server (o application container o web container)?
- Qual è il ciclo di vita di un web service?
- Qual è la funzione di stub e skeleton? Qual è la sequenza di messaggi scambiata durante l'esecuzione di un web service basato su SOAP?
- Che cos'è e a cosa serve il WSDL?
- Che cos'è e a cosa serve il protocollo SOAP?
- Quali dei seguenti componenti (righe della tabella) devo ricompilare quando si verificano i cambiamenti riportati in colonna? (Colonne: cambio della logica applicativa, cambio di tipo di parametri passati, cambio del linguaggio di implementazione del client, cambio del linguaggio di implementazione della logica implementativa, cambio di indirizzo del server. Righe: main del client, stub, skeleton, implementazione della logica applicativa)
- Qual è la differenza principale tra web service basato su SOAP e su REST?
- Perché nell'esercizio con la virtual machine e Wireshark è stato utilizzato il comando "sudo iptables -A INPUT -p tcp --dport 11111 -j DROP" ?

[Wireshark]

Domande teoria:
- Come funzionano i programmi di analisi di rete come Wireshark?
- Che differenza c'è tra filtro di cattura e filtro di visualizzazione?
- Come funziona e a cosa serve un filtro di cattura?
- Come funziona e a cosa serve un filtro di visualizzazione?
- Come funziona e a cosa serve una regola di colorazione?
- Quando viene visualizzata una cattura, come è organizzata l'interfaccia grafica di Wireshark?
- Come fa Wireshark a decidere quale protocollo è utilizzato da una PDU (messaggio):
  * di livello 2
  * di livello 3
  * di livello 4
  * di livello applicazione
- A cosa serve il comando "Follow TCP stream"?
- Come è fatto un indirizzo MAC di tipo broadcast? Che comportamento determina sulla rete Ethernet?
- Che ruolo ha il protocollo DNS prima dell'apertura di una connessione TCP?
- Che cosa si può osservare in Wireshark nella prima fase di scambio di messaggi TCP per l'apertura di una connessione? Perché?
- Perché certi protocolli di livello applicazione utilizzano il TCP e altri l'UDP?
- I pacchetti appartenenti ad una connessione sicura (ad es. HTTPS o SSL) vengono catturati da Wireshark? 
- Cosa si può notare in Wireshark quando i pacchetti appartenengono ad una connessione sicura (ad es. HTTPS o SSL)?

[Cablaggio]

Domande teoria:
- Com'è strutturato un normale cavo UTP?
- Com'è strutturato un normale cavo STP?
- Che differenza c'è tra un connettore RJ11 e RJ45? Quale dei due è usato da Ethernet?
- Che differenza c'è tra UTP dritto e incrociato? Che ruoli hanno questi tipi di cavo?
- Qual è il principio di funzionamento della fibra ottica?
- Quali vantaggi presenta la fibra ottica in un collegamento di rete?
- Qual è la struttura interna di un cavo in fibra ottica?

[Switch/Bridge]

Domande teoria:
- Qual è la funzione di uno switch/bridge?
- Si descrivano i concetti di selective flooding e backward learning nel contesto di apparati di rete di tipo switch.
- Quali vulnerabilità presentano gli switch per quanto riguarda la sicurezza?
- A cosa serve e come funziona l'algoritmo/protocollo spanning tree? Esiste uno standard IEEE che lo regola?
- A cosa servono e come funzionano le virtual LAN? 
- Esiste uno standard IEEE per virtual LAN? A cosa serve?

