# Piattaforme Software per la Rete - lesson 2 #### Giacomo Verticale ###### 11 March 2016 ## Modulo 1 - Endnodes __collo di bottiglia__ della velocità può essere - velocità del collegamento in uscita: serve link più veloce - in una delle funzioni dei nodi: si possono migliorare le prestazioni Le __astrazioni__ sono il primo nemico delle prestazioni Le comunicazioni ad esempio email non sono implementate direttamente sul cavo ma ci sono multipli strati di astrazione, ognuno dei quali nasconde gli strati sottostanti. La stessa __interfaccia__ (ad es socket) deve andare bene per applicazioni multiple ad esempio trasferimento di file (possibilmente lento) o pagine web (poss. veloce) Il nostro obiettivo è ottenere una velocità __wirespeed__ ## Endnodes __Struttura__: - architettura a strati per *semplificare lo sviluppo* - sistemi di protezione - implementazione più generale possibile: ad es. scelgo algoritmi in base al funzionamento generale e non al funzionamento in un caso specifico. __Scala__: La tabella di un pc desktop viene gestita da un algoritmo molto più semplice e meno sofisticato della tabella di un core router tra autonomous systems (~6 entries vs ~100'000 entries) ### Architettura hardware BSD - Net Interface (scheda di rete che implementa lo strato ethernet) - I/O BUS - Bus Adaptor - System Bus - Memory - MMU + Cache - CPU La prestazione degli endnodes dipende molto dalla velocità della cache, quindi si cerca di massimizzare l'utilizzo della cache. Le cache in genere sono efficaci quando si ha una *località temporale* e *spaziale* tra le informazioni richieste. Il caching non è sfruttabile facilmente nei sistemi di rete, ad esempio se si guarda un film in streaming, non è utile mettere i pacchetti ricevuti in una cache, perchè i dati vicini non sono ancora arrivati, e quelli appena visti non serve mantenerli in cache. Ad esempio se una macchina apre tante (~1000) connessioni TCP, non serve avere tutti i socket pronti in cache, ma potrebbe essere utile copiare il descrittore del socket in cache nel momento in cui viene ricevuto un pacchetto. Gli algoritmi BSD degli anni '80 non sono più adatti alle velocità (~300Mb/s) perchè sono adatti solo a velocità di (10-30Mbit/s). ### Architettura software BSD - Processi p1,p2,p3... - Kernel (coda IP) - Net Interface - Trama ethernet Quando la scheda di rete riceve una trama, questa viene copiata in un buffer, poi viene controllato il checksum, se non torna butto la trama, dopo viene controllato il MAC addr. se non è il mio butto la trama. La scheda di rete per interagire col S.O. alza un interrupt hardware La routine di gestione degli interrupt comunica alla scheda di mettere le trame sul buffer Può avvenire - Senza DMA: la CPU copia 1 byte per volta in RAM - Con DMA: la scheda di rete copia la trama direttamente in RAM A questo punto il pacchetto viene messo in una coda IP (nella memoria centrale) Del pacchetto guardo: - Indiritto IP destinazione, se non è il mio scarto o forwardo - Guardo campo protocollo (TCP o UDP) - Identifico socket tramite numero di porta sorg-dest (TCP) o dest (UDP) - Metto il pacchetto nella coda ad (es. UDP) del processo - Se il processo era in attesa bloccante, il processo viene cambiato a pronto - Quando verrà schedulato il processo va in esecuzione e legge dal socket. Per un pacchetto TCP la questione è simile a parte la gestione della finestra, ad esempio se il pacchetto non è arrivato in ordine, non può essere consegnato finchè non arrivano i pacchetti mancanti. ### Problemi __Livelock__ Se il sistema è configurato male: - la scheda di rete riceve spesso pacchetti - il sistema operativo è troppo impegnato dagli interrupt della scheda di rete - il sistema non riesce a dividere i pacchetti nelle code - il sistema non riesce ad eseguire i processi che smaltiranno i pacchetti ### Invio di un pacchetto Se consideriamo l'architettura hardware BSD con l'aggiunta di un disco sul bus I/O Ad un server può essere richiesta una pagina web tramite una richiesta HTTP GET - Il S.O. chiede al disco la pagina web richiesta e viene caricata in RAM (cache disco) - L'applicazione webserver legge dalla cache il file e lo copia nel proprio spazio utente - L'applicazione invoca la SEND sul socket buffer della connessione. - Il pacchetto viene copiato dal socket buffer alla scheda di rete Abbiamo 4 operazioni per ogni pacchetto, quindi la banda richiesta per ogni pacchetto viene amplificata di 4 volte. All'avvicinarsi della velocità del bus alla velocità del link aumenta la latenza della trasmissione, e quindi il throughput della connessione non è determinato dal link ma dalla macchina che non riesce a gestire le connessioni. Ad esempio nei sistemi solaris l'applicazione invia i dati direttamente alla scheda di rete, senza passare dalla memoria, il checksum lo calcola la scheda di rete Anche la ricezione può essere ottimizzata facendo calcolare il checksum delle trame IP in hardware alla scheda di rete. Ad esempio in un datacente di Amazon vengono usate macchine virtuali che scambiano pacchetti tramite l'hypervisor facendo calcolare i checksum alla scheda di rete, a cui però i pacchetti non arrivano Quindi in questo modo si aveva un tasso di errore sui pacchetti molto alto.