# Piattaforme Software per la Rete - lesson 3 #### Giacomo Verticale ###### 15 March 2016 ## Demultiplexing Un __sistema finale__(endnode) implementa l'intera pila protocollare dal livello fisico a quello applicativo I __nodi interni__ alla rete implementano un numero ridotto di livelli (1,2,3 e a volte 4). La __demultiplazione__ è lo spacchettamento della trama di livello 2 e tirare fuori il pacchetto di livello applicativo. - __Layered demultiplexing__ rispetta l'astrazione della stratificazione protocollare è possibile ottenere un implementazione semplificata ma più efficiente Ad esempio nel *video streaming* si usa UDP perchè TCP introduce affidabilità e ritardo - __Early demultiplexing__ Nel caso UDP venga bloccato, si può mascherare UDP da TCP, in occasioni come questa si gestisce tutta la pila protocollare a livello kernel(modulo del kernel) o a livello applicativo. Può servire a: - Prioritizzare i pacchetti - Usare codice specializzato - Saltare la pila protocollare. C'è un problema di __sicurezza__, in quanto un processo avrebbe accesso a tutti i pacchetti che transitano nel sistema. Vogliamo garantire __wirespeed processing__, il collo di bottiglia deve essere il link fisico. Vorremmo la proprietà di __composability__: Il costo complessivo deve essere minore alla somma dei protocolli attraversati. Lo standard attuale (usato ad esempio da wireshark o tcpdump) è il meccanismo __Berkeley Packet Filter__ è un grafo di controllo di flusso (un qualsiasi grafo diretto aciclico). Il BPF viene eseguito nel kernel in parallelo (divisione di tempo OS) e gestisce gli stessi pacchetti inviati allo stack TCP/IP layered, per ogni pacchetto ricevuto il BPF controlla se corrisponde ad alcuno dei filtri e nel caso viene copiato nel buffer corrispondente, altrimenti viene scartato. Il buffer serve perchè il costo di portare il pacchetto a livello utente è alto, e questo aumenterebbe il tempo di esecuzione del filtro, abbassando le prestazioni. La API si chiama __pcap__, e tcpdump è il programma più diffuso per usarle. --- Nota: *rarpd* è il nonno del protocollo DHCP e non viene più usato BootP consente di copiare informazioni per il boot DHCP consente di trasferire DNS, durata del lease, ecc.. Per questo è inutile eseguire rarp in kernelspace ma basta eseguirlo in userspace, e lo stesso vale per lo sviluppo di nuovi protocolli. Il filtro viene specificato usando una sintassi BPF che viene compilata ed eseguita nella virtual machine BPF (Originariamente pseudo-machine) VM-BPF ha un suo set di istruzioni limitato e specifico. ### BPF syntax ### Tcpdump and wireshark __Tcpdump__ stampa pacchetti in stdout, e può salvare pacchetti in file pcap __Wireshark__ dispone di filtri aggiuntivi per riconoscere traffico a livello applicativo. I pacchetti salvati nel formato pcap vengono tagliati ai primi 64byte ad esempio per salvare solo gli header utili senza memorizzare tutto il pacchetto sprecando spazio.