Linux Kernel e TCP/IP Stack



Documenti analoghi
Lezione 4 La Struttura dei Sistemi Operativi. Introduzione

Virtualizzazione di macchine Linux tramite XEN

Introduzione ai Moduli del Kernel di Linux. E.Mumolo, DEEI

Approccio stratificato

Esercitazione [5] Input/Output su Socket

Il sistema di I/O. Hardware di I/O Interfacce di I/O Software di I/O. Introduzione

Architettura di un sistema operativo

Sistemi Operativi STRUTTURA DEI SISTEMI OPERATIVI 3.1. Sistemi Operativi. D. Talia - UNICAL

Introduzione ai Device Drivers in Linux. E.Mumolo, DEEI

Il Software. Il software del PC. Il BIOS

Kernel Linux (per sysadm)

Gestione della Connessione in TCP

I/O su Socket TCP: read()

INFORMATICA 1 L. Mezzalira

Struttura di un sistema operativo. Struttura dei Sistemi Operativi. Servizi per l utente generico. Servizi per l utente generico

Il Sistema Operativo (1)

Il Sistema Operativo. Di cosa parleremo? Come si esegue un programma. La nozione di processo. Il sistema operativo

FONDAMENTI di INFORMATICA L. Mezzalira

costruttori e distruttori

MODULO 02. Iniziamo a usare il computer

Organizzazione Monolitica

Il Sistema Operativo. C. Marrocco. Università degli Studi di Cassino

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

ASPETTI GENERALI DI LINUX. Parte 2 Struttura interna del sistema LINUX

Processi in Linux. Igino Corona 20 Ottobre 2009

Digressione: man 2...

Computazione multi-processo. Condivisione, Comunicazione e Sincronizzazione dei Processi. Segnali. Processi e Threads Pt. 2

GESTIONE DEI PROCESSI

Capitolo 2 -- Silberschatz

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

Introduzione a GCC: GNU Compiler Collection

Drivers. Introduzione Tipologie Struttura Interazione con il kernel

Introduzione alle tecnologie informatiche. Strumenti mentali per il futuro

Setup dell ambiente virtuale

Il computer: primi elementi

Introduzione ai sistemi operativi

Modello dei processi. Riedizione delle slide della Prof. Di Stefano

Gianluigi Magnasco easitec S.r.l. Parma, 16 Settembre 2010

Guida Rapida all uso del License Manager di ROCKEY4Smart (V )

Linguaggio C. Fondamenti. Struttura di un programma.

La gestione di un calcolatore. Sistemi Operativi primo modulo Introduzione. Sistema operativo (2) Sistema operativo (1)

Sistemi operativi. Esempi di sistemi operativi

Definizione Parte del software che gestisce I programmi applicativi L interfaccia tra il calcolatore e i programmi applicativi Le funzionalità di base

The Onion PC. Virtualizzazione strato dopo strato

Dispensa di Informatica I.1

Transmission Control Protocol

Il SOFTWARE DI BASE (o SOFTWARE DI SISTEMA)

Introduzione alle applicazioni di rete

La Gestione delle risorse Renato Agati

Interprocess Communications - II. Franco Maria Nardini

Processi e thread. Dipartimento di Informatica Università di Verona, Italy. Sommario

MODEM USB MDC525UP Guida Rapida LINUX

I Thread. I Thread. I due processi dovrebbero lavorare sullo stesso testo

Il sistema operativo TinyOS

Sistemi Operativi. Processi GESTIONE DEI PROCESSI. Concetto di Processo. Scheduling di Processi. Operazioni su Processi. Processi Cooperanti

Prova di Esame - Rete Internet (ing. Giovanni Neglia) Prova completa Mercoledì 14 Settembre 2005, ore 9.00

Software. Algoritmo. Algoritmo INFORMATICA PER LE DISCIPLINE UMANISTICHE 2 (13042)

Sistemi Operativi GESTIONE DELLA MEMORIA CENTRALE. D. Talia - UNICAL. Sistemi Operativi 6.1

VIRTUALIZZAZIONE LUG - CREMONA. Linux Day - 25 Ottobre 2008

Inizializzazione, Assegnamento e Distruzione di Classi

Prova di Esame - Rete Internet (ing. Giovanni Neglia) Prova completa Mercoledì 2 Marzo 2005, ore 14.30

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. D. Talia - UNICAL. Sistemi Operativi 9.1

Sistemi Operativi. Interfaccia del File System FILE SYSTEM : INTERFACCIA. Concetto di File. Metodi di Accesso. Struttura delle Directory

Ricompilazione del Kernel a modo mio :

FASE DEBUGGING: Compiler Linker. controllando che la voce Genera le informazioni per il debug cioè. "Generate debugging information"

Virtualizzazione e Macchine Virtuali

NOZIONI BASE PER ESERCITAZIONI

Sistema operativo: Gestione della memoria

CdL in Medicina Veterinaria - STPA AA

Sistemi operativi e reti A.A Lezione 2

Coordinazione Distribuita

Funzioni in C. Violetta Lonati

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Informatica. Il software (S.O.) e ancora sulle basi numeriche

Architetture software. Virtualizzazione

Il Sistema Operativo

Parte V. Sistemi Operativi & Reti. Sistemi Operativi. Sistemi Operativi

SPSS Statistics per Windows - Istruzioni di installazione per (Licenza per utenti singoli)

Sistema di protezione (1)

Sistema di protezione (2) Protezione (1)

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

SISTEMI OPERATIVI. Prof. Enrico Terrone A. S: 2008/09

Sistema Operativo Compilatore

Avoidance, Fast Retransmit, And Fast Recovery

Progettazione : Design Pattern Creazionali

Introduzione al Linguaggio C

Una prima applicazione in C per l utilizzo delle socket

Calcolatori Elettronici A a.a. 2008/2009

Setup e installazione

CAPITOLO 5 - Sistemi Operativi Moderni

Corso di Informatica (Programmazione) Lezione 6 (31 ottobre 2008)

Corso di Sistemi Operativi Ingegneria Elettronica e Informatica prof. Rocco Aversa. Raccolta prove scritte. Prova scritta

Prof. Ing. Maurizio Casoni Dipartimento di Ingegneria dell Informazione Università degli Studi di Modena e Reggio Emilia

L API socket ed i daemon

Riferimento rapido per l'installazione SUSE Linux Enterprise Server 11

Compilazione Kernel 2.6x con supporto BootSplash

Introduzione alla programmazione in C

Sistema Operativo. Fondamenti di Informatica 1. Il Sistema Operativo

Transcript:

Internals e kernel hacking 23, 30 Ottobre 2007

Outline 1 Introduzione Generalità sui kernel Linux kernel 2 Introduzione al kernel hacking Basics Linux Kernel Modules 3 TCP Congestion control Introduzione Nel linux kernel Hacking the TCP Stack

Generalità sui kernel Outline 1 Introduzione Generalità sui kernel Linux kernel 2 Introduzione al kernel hacking Basics Linux Kernel Modules 3 TCP Congestion control Introduzione Nel linux kernel Hacking the TCP Stack

Generalità sui kernel Cosa è un kernel Eettua il controllo e l'accesso alle risorse hardware. Implementa livelli di astrazione: processi, le, device Eettua lo scheduling ed il managment delle risorse di sistema: Memoria: Virtual Memory manager CPU: CPU scheduler Dischi: lesystem Fornisce un livello di astrazione all'utente tramite le chiamate di sistema (syscall) Implementa lo stack protocollare TCP/IP Cosa NON è Una Shell Una interfaccia graca

Generalità sui kernel Struttura di un kernel

Generalità sui kernel Hello GNU/Linux! hello.c #include <stdio.h> int main(int argc, char* argv[]) { printf("hello GNU/Linux!\n"); } esecuzione $ gcc hello.c -o hello $./hello Hello GNU/Linux! $

Generalità sui kernel Dietro le quinte (1/1) Utilizzando il comando strace è possibile visualizzare le chiamate di sistema: strace./hello execve("./hello", ["./hello], [/* 28 vars */]) = 0 /* nome_syscall(arg1,arg2,...) = return_value */ [...] /* Apre la libreria libc */ open("/lib/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\[...]"..., 512) = 512 [...] /* Scrive sullo standard output (fd=1) 17 byte */ write(1, "Hello GNU/Linux!\n", 17) = 17 [...]

Generalità sui kernel Dietro le quinte (2/2) Guardiamo la pagina man della chiamata di sistema write: $ man 2 write NAME write - write to a file descriptor SYNOPSIS #include <unistd.h> ssize_t write(int fd, const void *buf, size_t count); DESCRIPTION write() writes up to count bytes from the buffer pointed buf to the file referred to by the file descriptor fd.

Linux kernel Outline 1 Introduzione Generalità sui kernel Linux kernel 2 Introduzione al kernel hacking Basics Linux Kernel Modules 3 TCP Congestion control Introduzione Nel linux kernel Hacking the TCP Stack

Linux kernel Caratteristiche del Linux kernel Scritto quasi esclusivamente in C Kernel UNIX like Portato su 24 architetture diverse Licenza GPL Architettura Monolitica Modulare (Linux Kernel Module infrastructure) Preemptible Kernel (dalla versione 2.6) Supporto SMP (Simmetric Multi Processor) POSIX (The Portable Operating System Interface) compliant Supporta la paravirtualizzazione (da 2.6.20)

Basics Outline 1 Introduzione Generalità sui kernel Linux kernel 2 Introduzione al kernel hacking Basics Linux Kernel Modules 3 TCP Congestion control Introduzione Nel linux kernel Hacking the TCP Stack

Basics Cosa serve 1 Installazione di una distribuzione GNU/Linux sul proprio PC 2 Un compilatore C: GCC 3 I sorgenti del kernel (http://www.kernel.org) 4 Buona conoscenza del linguaggio C 5 Buona conoscenza della shell sh 6 Molta pazienza (mandatory) 7 Opzionale ma consigliabile, una installazione di una macchina virtuale User Mode Linux (UML) oppure VMware, XEN, KVM,...)

Basics Regole del Kernel Hacking Non esistono operazioni in virgola mobile: il kernel linux deve funzionare sulla maggior parte dei sistemi anche quelli non dotati di FPU (oating point unit) come ad esempio gli embedded devices. Lo stack ha una dimensione ssa e ridotta utilizzare ricorsione in kernel space non è indicato inizializzare array statici di grandi dimensioni non è indicato meglio usare allocazione dinamica Il kernel linux è portabile il codice del kernel deve essere indipendente dalla endianness della macchina Il codice in assembler va evitato a meno che non si includa in arch/ Quando si sviluppa si deve pensare di avere un sistema SMP

Basics Congurare e compilare il kernel Linux Ottenere il tarball dei sorgenti del kernel da http://www.kernel.org/ Spostare il tarball in /usr/src e decomprimerlo Creare un link simbolico a /usr/src/linux Congurare il kernel Compilare il kernel ed i moduli Installare il kernel Riavviare il sistema per provare il nuovo kernel Build del kernel in /usr/src # wget http://kernel.org/pub/linux/ kernel/v2.6/linux-2.6.23.1.tar.bz2 # tar xjf linux-2.6.23.1.tar.bz2 # ln -s linux-2.6.23.1 linux # cd linux # make menucong # make && make modules_install # cp /usr/src/linux/arch/i386/boot/bzimage /boot/vmlinuz-2.6.23.1 # mkinitrd -r /dev/<root_dev> -o /boot/initrd.img-2.6.23.1 2.6.23.1 # grub-update

Basics Compilare il kernel linux (Debian way) Se si utilizza una distribuzione basata su Debian (es. Ubuntu, Knoppix,...), è possibile ricompilare il kernel con il comando: /usr/src/linux $ make-kpkg --initrd --rootcmd fakeroot --revision 1 kernel_image In questo modo verrà creato un paccketto.deb installabile contenente l'immagine del kernel e i moduli: $ sudo dpkg -i /usr/src/linux-image-2.6.23.1_1_i386.deb

Basics Il tree dei sorgenti Le subdirectories più importanti sono: arch/ Codice dipendente dall'architettura scritto in assembler ipc/ Memoria condivisa, semafori, messaggi inter process... kernel/ CPU scheduler, DMA... fs/ Implementazione di svariati le systems (compresi quelli virtuali) mm/ Gestore della memoria drivers/ Implementazione dei drivers dei dispositivi supportati ucialmente net/ Implementazione dei livelli ISO/OSI: LLC, stack TCP/IP, ipv6, netlter

Basics Congurare il kernel Utilizzando make menuconfig è possibile customizzare il kernel. Ad esempio, per abilitare tutti gli algoritmi di controllo di congestione entrare nella sezione TCP Congestion Control nel seguente modo: Networking Networking Options TCP: advanced congestion control e abilitare come moduli (M) tutti gli algoritmi desiderati.

Linux Kernel Modules Outline 1 Introduzione Generalità sui kernel Linux kernel 2 Introduzione al kernel hacking Basics Linux Kernel Modules 3 TCP Congestion control Introduzione Nel linux kernel Hacking the TCP Stack

Linux Kernel Modules Introduzione ai LKM Un Linux Kernel Module (LKM) è un pezzo di codice che serve ad estendere le funzionalità del kernel. Un LKM ha estensione.ko e può essere caricato e rimosso dal kernel a runtime (senza dover eettuare il reboot) tramite i comandi insmod ed rmmod. Si possono ricavare informazioni sui moduli caricati con il comando lsmod Il comando modprobe serve a caricare o rimuovere i moduli installati in /lib/modules/<versione>/ Il codice di un LKM viene eseguito in kernel space come qualunque altre parte del kernel e quindi può bloccare il sistema o danneggiarlo.

Linux Kernel Modules Hello Kernel Space /* Header files da includere per un LKM */ #include <linux/kernel.h> #include <linux/module.h> #include <linux/tty.h> /* Serve per console_print() */ /* Inizializzazione del LKM */ int init_module() { console_print("hello Kernel Space!\n"); /* Ritornare 0 se non ci sono errori */ return 0; } /* Cleanup */ void cleanup_module() { console_print("goodbye Kernel Space!\n"); }

Linux Kernel Modules Compilazione di un LKM Makele obj-m += hello.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean Compilazione # make # insmod hello.ko Message from syslogd@localhost at Tue Feb 28 21:50:51 2006 localhost kernel: Hello Kernel Space! # rmmod hello Message from syslogd@localhost at Tue Feb 28 21:51:33 2006 localhost kernel: Goodbye Kernel Space!

Introduzione Outline 1 Introduzione Generalità sui kernel Linux kernel 2 Introduzione al kernel hacking Basics Linux Kernel Modules 3 TCP Congestion control Introduzione Nel linux kernel Hacking the TCP Stack

Introduzione Il controllo di congestione nel kernel Example Fino alla versione 2.6.12 tutti gli algoritmi di controllo di congestione erano implementati in un unico le (net/ipv4/tcp_input.c) Nel 2005 Steven Hemminger ha riscritto il codice per il congestion control rendendolo modulare e a plug-in: Ogni congestion control algorithm è implementato in un LKM E' possibile selezionare l'algoritmo tramite l'utilizzo di una sysctl o utilizzando il le system virtuale procfs # modprobe tcp_westwood # sysctl net.ipv4.tcp_congestion_control=westwood # echo "reno" > /proc/sys/net/ipv4/tcp_congestion_control

Introduzione Linux TCP state machine (1/3) Al congestion control di linux e' associata una macchina a 5 stati: Open: Alla ricezione di un ACK in sequenza il TCP sender aumenta la congestion window di un valore che dipende se si e' in congestion avoidance o in slow start. Disorder: Quando si riceve un ACK fuori sequenza o duplicato si entra in questo stato. Cwnd non viene modicata, ma ogni qual volta si riceve un ACK si invia un nuovo pacchetto (self-clocking).

Introduzione Linux TCP state machine (2/3) CWR (congestion window reduced): Quando si riceve un evento esplicito di congestione (Explicit Congestion Notication - ECN) si entra in questo stato e la cwnd viene ridotta di un pacchetto per ogni ACK ricevuto nche' non si arriva a dimezzare cwnd. Questa fase puo' essere interrotta dalle fasi di Recovery o di Loss. Loss: Se il retransmission timeout (RTO) espira si entra in questo stato. Si considerano persi tutti i pacchetti outstanding. cwnd viene impostata a 1 la cwnd viene incrementata utilizzando l'algoritmo slow start si permane in questo stato nche' non sono ritrasmessi con successo tutti i pacchetti considerati persi

Introduzione Linux TCP state machine (3/3) Recovery state: il Rate Halving Il Rate Halving e' una feature del CC del Linux kernel non standardizzata in RFC. L'algoritmo agisce nella fase di Fast Recovery (attivata alla ricezione di 3 DUPACK): 1 Ogni due ACK ricevuti: 1 si decrementa cwnd di un pacchetto no ad arrivare alla ssthresh 2 si invia un nuovo pacchetto sulla rete (il pacchetto perso o nuovi pacchetti) 2 Si esce dalla fase di Fast Recovery quando arrivano gli ACK di tutti i pacchetti che erano in volo all'inizio di questa fase o quando espira un RTO (e si nisce nel Loss state)

Nel linux kernel Outline 1 Introduzione Generalità sui kernel Linux kernel 2 Introduzione al kernel hacking Basics Linux Kernel Modules 3 TCP Congestion control Introduzione Nel linux kernel Hacking the TCP Stack

Nel linux kernel Implementazione I le responsabili del congestion control in Linux ( versione 2.6.13) sono: tcp_cong.c: Implementazione della architettura a plugin. tcp_register_congestion_control: Inserisce un nuovo algoritmo di CC alla lista degli algoritmi di CC disponibili tcp_set_congestion_control: Cambia il CC al socket passato come argomento tcp_reno_cong_avoid, tcp_reno_ssthresh, tcp_reno_min_cwnd: Implementazione di Reno TCP tcp_westwood.c, tcp_bic.c, tcp_vegas.c, tcp_hybla.c, tcp_scalable.c, tcp_highspeed.c: Implementazione di Westdood+, BIC, Vegas, Hybla, Scalable, HSTCP. tcp.h: denizione della struttura tcp_congestion_ops

Nel linux kernel tcp.h (1/2) Ad ogni congestion control algorithm e' associata una struttura tcp_congestion_ops cosi' fatta: tcp.h struct tcp_congestion_ops { struct list_head list; /* return slow start threshold (required) */ u32 (*ssthresh)(struct sock *sk); /* do new cwnd calculation (required) */ void (*cong_avoid)(struct sock *sk, u32 ack,u32 rtt, u32 in_ight, int good_ack); [...] char name[tcp_ca_name_max]; };

Nel linux kernel tcp.h (2/2) init/release: inizializza/distrugge la (eventuale) sezione privata dei dati ssthresh: Ritorna il valore della Slow Start Threshold min_cwnd: Ritorna il valore della congestion window dopo un congestion episode cong_avoid: Funzionamento del CC in congestion avoidance rtt_sample: Ritorna un campione di RTT (Round Trip Time) cwnd_event: Gestisce gli eventi del Congestion Control (vedi slide successiva)

Nel linux kernel Gli eventi del Congestion Control In tcp.h sono deniti gli eventi che vengono triggerati quando si vericano certe condizioni durante il funzionamento dell'algoritmo di Congestion Control: CA_EVENT_LOSS: E' attivato quando si rileva una perdita (in tcp_input.c funzione tcp_enter_loss) CA_EVENT_FAST_ACK: E' attivato quando si riceve un ACK in sequenza (in tcp_input.c funzione tcp_ack) CA_EVENT_SLOW_ACK: E' attivato quando si riceve un ACK fuori sequenza (in tcp_input.c funzione tcp_ack) CA_EVENT_COMPLETE_CWR: La fase di congestion recovery e' terminata (in tcp_input.c funzione tcp_complete_cwr)

Nel linux kernel Esempio

Hacking the TCP Stack Outline 1 Introduzione Generalità sui kernel Linux kernel 2 Introduzione al kernel hacking Basics Linux Kernel Modules 3 TCP Congestion control Introduzione Nel linux kernel Hacking the TCP Stack

Hacking the TCP Stack Scrivere un nuovo modulo Cosa serve per scrivere un nuovo algoritmo di controllo di congestione? 1 Progettare l'algoritmo su carta specicando il comportamento nelle fasi di slow start, congestion avoidance e di shrinking (reazione ad un episodio di congestione) 2 Validare l'algoritmo con NS-2 (richiede la scrittura di codice...) 3 Individuare le parti dell'algoritmo diverse da quelle standard di new reno. 4 Implementare le parti dell'algoritmo che dieriscono da quelle standard. 5 Validare l'implementazione

Hacking the TCP Stack Esempio TCP Reno Mod Si supponga di voler modicare TCP Reno in modo da incrementare la nestra di due pacchetti per RTT quando si e' in congestion avoidance Suggerimento Studiare il le net/ipv4/tcp_cong.c, funzione: tcp_reno_cong_avoid()

Riferimenti Riferimenti http://c3lab.poliba.it/index.php/metodidicontrollo http://kernel.org http://tldp.org/howto/module-howto/ http://www.tldp.org/ldp/lkmpg/2.6/html/index.html http://kvm.qumranet.com http://www.vmware.com/download/player/ http://www.vmware.com/appliances/directory/1028 http://gapil.truelite.it/