+\section{Il protocollo TCP/IP}
+\label{sec:net_tpcip}
+
+Come già affermato il protocollo TCP/IP è un insieme di protocolli diversi,
+che operano su 4 livelli diversi. Per gli interessi della programmazione di
+rete però sono importanti principalmente i due livelli centrali, e soprattutto
+quello di trasporto, su cui è innestata l'interfaccia fra kernel space e user
+space.
+
+Il livello 4 infatti è normalmente gestito dal kernel, e si accede ad esso
+solo quando si vogliono fare applicazioni di sistema per il controllo della
+rete (locale) a basso livello, un uso quindi molto specialistico. Il livello 1
+invece dipende dalle singole applicazioni ed è di nuovo troppo specifico per
+essere affrontato qui.
+
+\subsection{Il quadro generale}
+
+Benché si parli di TCP/IP questa famiglia di protocolli è composta anche da
+altri membri. In \nfig si è riportato una figura di quadro che mostra un
+panorama sull'intera famiglia, e di come i vari protocolli vengano usati dalle
+applicazioni.
+
+La figura è da fare ...
+
+I vari protocolli mostrati in figura sono i seguenti:
+
+\begin{list}{}{}
+\item \textsl{IPv4} \textit{Internet Protocol version 4}. È quello che
+ comunemente si chiama IP. Ha origine negli anni '80 e da allora è la base su
+ cui è cotriuta internet. Usa indirizzi a 32 bit e provvede la trasmissione
+ dei pacchetti TCP, UDP, ICMP e IGMP.
+\item \textsl{IPv6} \textit{Internet Protocol version 6}. È stato progettato a
+ metà degli anni '90 per rimpiazzare IPv4. Ha indirizzi a 128 bit e effettua
+ lo stesso servizio di trasporto di IPv4 per i pacchetti TCP, UDP e ICPMv6.
+\item \textsl{TCP} \textit{Trasmission Control Protocol}. È un protocollo
+ orientato alla connessione che provvede un trasporto affidabile e
+ bidirezionale di un flusso di dati. I socket TCP sono esempi di
+ \textit{stream socket}. Il protocollo ha cura di tutti gli aspetti del
+ trasporto, come l'acknoweledgment, i timout, la ritrasmissione, etc. È usato
+ dalla maggior parte delle applicazioni. Può essere usato sia con IPv4 che
+ con IPv6.
+\item \textsl{UDP} \textit{User Datagram Protocol}. È un protocollo senza
+ connessione a pacchetti. I socket UDP sono esempi di \textit{datagram
+ socket}. Contrariamente al TCP in protocollo non è affidabile e non c'è
+ garanzia che i pacchetti raggiungano la loro destinazione, né sull'eventuale
+ ordine di arrivo. Può essere usato sia con IPv4 che con IPv6.
+\item \textsl{ICMP} \textit{Internet Control Message Protocol}. Gestisce gli
+ errori e trasporta l'informazione di controllo fra stazioni remote e
+ instradatori (\textit{router} e \textit{host}). I messaggi sono normalmente
+ generati dal software del kernel che gestisce la comunicazione TCP/IP, anche
+ se può venire usato direttamente da alcuni programmi come \texttt{ping}. A
+ volte ci si riferisce ad esso come ICPMv4 per distinguerlo da ICMPv6.
+\item \textsl{ICMP} \textit{Internet Group Management Protocol}. É un
+ protocollo usato per il \textit{multicasting} (vedi
+ \ref{sec:xxx_multicast}), che è opzionale in IPv4.
+\item \textsl{ARP} \textit{Address Resolution Protocol}. È il protocollo che
+ mappa un indirizzo IP in un indirizzo hardware (come un indirizzo
+ internet). È usato in reti di tipo broadcast come ethernet, token ring o
+ FDDI ma non serve in connessioni punto-punto.
+\item \textsl{RARP} \textit{Reverse Address Resolution Protocol}. È il
+ protocollo che mappa un indirizzo hardware in un indirizzo IP. Viene usato a
+ volte per durante il boot per assegnare un indirizzo IP ad una macchina.
+\item \textsl{ICMPv6} \textit{Internet Control Message Protocol, version 6}.
+ Combina per IPv6 le funzionalità di ICMPv4, IGMP e ARP.
+\item \textsl{NETLINK} \textit{Netlink}.
+ Provvede l'interfaccia di accesso alla comunicazione a basso livello.
+\end{list}
+
+Gran parte delle applicazioni comunicano usando TCP o UDP, ed alcune si
+rifanno ad IP (ed i suoi correlati ICMP e IGMP); benché sia TCP che UDP siano
+basati su IP e sia possibile intervenire a questo livello con i \textit{raw
+ socket} questa tecnica è molto meno diffusa e a parte applicazioni
+particolari si preferisce sempre usare i servizi messi a disposizione dai due
+protocolli precedenti. Per questo motivo a parte alcuni brevi accenni su IP
+in questa sezione ci concentreremo sul livello di trasporto.
+
+\subsection{Internet Protocol (IP)}
+\label{sec:net_ip}
+
+Quando si parla di IP ci si riferisce in genere alla versione attualmente in
+uso che è la versione 4 (e viene pertanto chiamato IPv4). Questa versione
+venne standardizzata nel 1981 dall'RFC~719.
+
+Internet protocol nasce per disaccoppiare le applicazioni della struttura
+hardware delle reti di trasmissione, e creare una interfaccia di trasmissione
+dei dati indipendente dal sottostante substrato di rete, che può essere
+realizzato con le tecnologie più disparate (Ethernet, Token Ring, FDDI, etc.).
+Il compito di IP è pertanto quello di trasmettere i pacchetti da un computer
+all'altro della rete; le caratteristiche essenziali con cui questo viene
+realizzato in IPv4 sono due:
+
+\begin{itemize}
+\item \textit{Universal addressing} la comunicazione avviene fra due host
+ identificati univocamente con un indirizzo a 32 bit che può appartenere ad
+ una sola interfaccia di rete.
+\item \textit{Best effort} viene assicurato il massimo impegno nella
+ trasmissione, ma non c'è nessuna garanzia per i livelli superiori né sulla
+ percentuale di successo né sul tempo di consegna dei pacchetti di dati.
+\end{itemize}
+
+Negli anni '90 la crescita vertiginosa del numero di macchine connesse a
+internet ha iniziato a far emergere i vari limiti di IPv4, per risolverne i
+problemi si è perciò definita una nuova versione del protocollo, che (saltando
+un numero) è diventata la versione 6. IPv6 nasce quindi come evoluzione di
+IPv4, mantendone inalterate le funzioni che si sono dimostrate valide,
+eliminando quelle inutili e aggiungendone poche altre ponendo al contempo una
+grande attenzione a mantenere il protocollo il più snello e veloce possibile.
+
+I cambiamenti apportati sono comunque notevoli e si possono essere riassunti a
+grandi linee nei seguenti punti:
+\begin{itemize}
+\item l'espansione delle capacità di indirizzamento e instradamento, per
+ supportare una gerarchia con più livelli di indirizzamento, un numero di
+ nodi indirizzabili molto maggiore e una autoconfigurazione degli indirizzi
+\item l'introduzione un nuovo tipo di indirizzamento, l'\textit{anycast} che
+ si aggiungono agli usuali \textit{unycast} e \textit{multicast}
+\item la semplificazione del formato della testata, eliminando o rendendo
+ opzionali alcuni dei campi di IPv4, per eliminare la necessità di
+ riprocessamento della stessa da parte dei router e contenere l'aumento di
+ dimensione dovuto ai nuovi indirizzi
+\item un supporto per le opzioni migliorato, per garantire una trasmissione
+ più efficiente del traffico normale, limiti meno stringenti sulle dimensioni
+ delle opzioni, e la flessibilità necessaria per introdurne di nuove in
+ futuro
+\item il supporto per delle capacità di qualità di servizio (QoS) che permetta
+ di identificare gruppi di dati per i quali si può provvedere un trattamento
+ speciale (in vista dell'uso di internet per applicazioni multimediali e/o
+ ``real-time'')
+\end{itemize}
+
+Per maggiori dettagli riguardo al protocollo si può consultare
+\ref{sec:appA_ip}.
+
+
+\subsection{UDP: User Datagram Protocol)}
+\label{sec:net_udp}
+
+UDP è un protocollo di trasporto molto semplice, la sua descizione completa è
+contenuta dell'RFC768, ma in sostanza esso è una semplice interfaccia a IP dal
+livello di trasporto. Quando un'applicazione usa UDP essa scrive un pacchetto
+di dati (il cosiddetto \textit{datagram} che da il nome al protocollo) su un
+socket, al pacchetto viene aggiunto un header molto semplice
+(\ref{sec:appA_udp}, e poi viene passato al livello superiore (IPv4 o IPv^
+che sia) che lo spedisce verso la destinazione. Dato che né IPv4 né IPv6
+garantiscono l'affidabilità niente assicura che il pacchetto arrivi a
+destinazione, né che più pacchetti arrivino nello stesso ordine in cui sono
+stati spediti.
+
+Pertanto il problema principale che si affronta quando si usa UDP è la
+mancanza di affidabilità, se si vuole essere sicuri che i pacchetti arrivino
+
+
+\subsection{TCP: Transport Control Protocol)}
+\label{sec:net_tcp}
+
+