venerdì 16 ottobre 2009

Commutazione di pacchetto

Da Wikipedia, l'enciclopedia libera.

La commutazione di pacchetto è una tecnica di accesso multiplo a ripartizione nel tempo, utilizzata per condividere un canale di comunicazione tra più stazioni in modo non deterministico, utilizzata generalmente per realizzare reti di calcolatori. Si distingue dalla commutazione di circuito, che è tipicamente usata nelle comunicazioni telefoniche.

Tali tecniche non comportano l'attivazione di una linea di comunicazione dedicata fra un elaboratore ed un altro, ma consentono lo svolgimento simultaneo di più comunicazioni fra computer, massimizzando così l'utilizzazione dei mezzi trasmissivi impiegati.

Pacchetti [modifica]

In una rete a commutazione di pacchetto (PBN, Packet Based Network) l'informazione da trasmettere viene suddivisa in pacchetti di dimensione abbastanza piccola; ad ognuno di essi viene aggiunta un'intestazione che contiene tutta l'informazione necessaria affinché il pacchetto possa venire inoltrato alla sua destinazione finale e sulla sua posizione all'interno dell'informazione che viene trasferita. I pacchetti vengono inviati individualmente attraverso la rete e vengono poi riassemblati nella loro forma originale quando arrivano sul computer di destinazione.

L'intera capacità trasmissiva disponibile viene impegnata per la trasmissione di ciascun pacchetto. Se vi sono più pacchetti da trasmettere contemporaneamente, questi vengono memorizzati in una coda, subendo un ritardo di accodamento e rischiando di essere scartati in caso di esaurimento della memoria disponibile per la coda.

Commutatori [modifica]

Quando un nodo intermedio detto commutatore di pacchetto, generalmente un router o uno switch, riceve un pacchetto, esso decide quale è il percorso migliore che il pacchetto può prendere per raggiungere la sua destinazione. Questa strada può cambiare da pacchetto a pacchetto dipendentemente dalle condizioni della rete, per cui pacchetti appartenenti ad uno stesso messaggio possono intraprendere anche percorsi distinti.

Ritardi [modifica]

Un pacchetto che attraversa una rete subisce un ritardo, legato in parte alle caratteristiche del percorso ed in parte allo stato di carico della rete.

Le componenti del ritardo sono:

È anche possibile che i pacchetti inviati tra due stessi host in momenti diversi subiscano ritardi differenti. La variazione del ritardo subito dai pacchetti è detta jitter.

Perdita di pacchetti [modifica]

La perdita di pacchetti può avvenire in diverse occasioni. Un pacchetto può perdersi in quanto viene ricevuto con un errore e quindi scartato, oppure quando il buffer di un commutatore, sia nelle porte di ingresso che in quelle di uscita, risulta saturo e quindi si trova costretto a scartarlo.

Per questa ragione, una rete a pacchetto non può generalmente garantire che tutti i pacchetti inviati arrivino a destinazione.

TCP risolve questo problema reinviando i pacchetti persi (i pacchetti per i quali non riceve un ACK positivo).

Commutazione di pacchetto e commutazione di circuito [modifica]

In una rete a commutazione di circuito la capacità del canale trasmissivo è interamente dedicata ad una specifica comunicazione. In una rete di questo tipo (ad esempio, quella telefonica), si stabilisce dunque una connessione diretta tra sorgente e ricevente al momento di inizio della comunicazione (ad esempio quando inizia la chiamata telefonica). Invece la commutazione di pacchetto si rivela molto più efficiente nonostante la maggior quantità di dati inviata, in quanto i canali fisici sono utilizzati solo per il tempo strettamente necessario. Inoltre, poiché ogni pacchetto porta con sé la sua identificazione, una rete può trasportare nello stesso tempo pacchetti provenienti da sorgenti differenti.

La commutazione di pacchetto permette quindi a più utenti di inviare informazioni attraverso la rete in modo efficiente e simultaneo, risparmiando tempo e costi mediante la condivisione di uno stesso canale trasmissivo (cavo elettrico, etere, fibra ottica ecc.).

Storicamente la commutazione di pacchetto poneva qualche problema nel caso fosse necessaria una disponibilità garantita di banda o nelle trasmissioni real time: si pensi a una trasmissione video, dove le immagini arrivano con un flusso costante. Al giorno d'oggi è però possibile aggiungere una "priorità" ai pacchetti per garantire che un numero sufficiente di essi venga inviato, a scapito di altri pacchetti che non abbiano un'urgenza specifica - ad esempio, un file da trasferire.

La commutazione di pacchetto è uno dei possibili metodi di multiplazione, ovvero è una tecnica per suddividere la capacità trasmissiva di un canale tra diversi utilizzatori. Vedi ancheMultiplazione.

Switch

Come con un hub, due nodi possono comunicare attraverso uno switch come se questo non ci fosse, ovvero il suo comportamento è trasparente. A differenza però di quanto farebbe unhub, uno switch normalmente inoltra i frame in arrivo da una qualsiasi delle sue porte soltanto a quella cui è collegato il nodo destinatario del frame.

Uno switch possiede quindi l'intelligenza necessaria a riconoscere i confini dei frame nel flusso di bit, immagazzinarli, decidere su quale porta inoltrarli, trasferirli verso una porta in uscita, trasmetterli. Normalmente uno switch opera al livello datalink del modello di riferimento ISO/OSI.

Lo switch gode, rispetto ad un bridge, di:

Inoltre uno switch di fascia alta fornisce tipicamente le seguenti caratteristiche:

Prestazioni [modifica]

Il ritardo introdotto da uno switch è generalmente di pochi microsecondi, quindi quasi ininfluente per la gran parte delle applicazioni.

Quando un host è connesso ad uno switch, o su una connessione diretta tra due switch, non sono possibili collisioni, e quindi è possibile utilizzare la modalità "Full-Duplex", ovvero i due nodi possono trasmettere contemporaneamente.

L'inoltro selettivo dei frame permette anche a più frame di attraversare contemporaneamente lo switch, e quindi la banda totale disponibile non viene ridotta con l'aumento del numero di nodi attivi. In una connessione di questo tipo si dice che l'host ha un accesso dedicato al commutatore. Questo garantisce che due nodi connessi da uno switch possano comunicare tra loro alla velocità nominale del collegamento, ma solo se non sono impegnati contemporaneamente in altre conversazioni.

Nella realtà, l'introduzione di uno switch in una rete locale porta ad un aumento del traffico sulla rete ed a un miglioramento delle prestazioni, ma spesso questo miglioramento porta ad evidenziare altri "colli di bottiglia" della rete, spesso la connessione ad internet o la capacità dei server.

Utilizzo dello switch [modifica]

Storicamente lo switch è stato introdotto per ridurre le collisioni nelle reti Ethernet (ora IEEE 802.3). L'uso esclusivo di switch per collegare nodi (con esclusione di hub e bridge) consente di aumentare l'efficienza di una tipica rete 10Base-T di un fattore 10, portandola dunque a competere con una più costosa rete 100Base-T provvista esclusivamente di hub, e quindi con topologia logica a bus.

Normalmente uno switch non è in grado di interconnettere reti di livello 2 eterogenee, ad esempio una rete Ethernet con una Token Ring, a meno che non si tratti di un cosiddetto "switch transazionale", mentre può interconnettere ad esempio reti ethernet con velocità o tecnologie fisiche diverse.

Nel gergo delle reti locali, uno switch separa i domini di collisione connessi alle sue porte, ovvero se due calcolatori collegati a porte diverse trasmettono contemporaneamente, non si verifica una collisione, e i due frame possono attraversare lo switch contemporaneamente.

Il termine switch viene usato anche al di fuori delle reti Ethernet, ad indicare un dispositivo che inoltri selettivamente i frame ricevuti, per esempio in ATM o frame relay. Inoltre, un dispositivo di rete che abbini le prestazioni di uno switch con le funzioni di livello superiore di un router viene detto switch-router o, più precisamente, switch di livello 3 (layer-3 switch).

Instradamento [modifica]

Per decidere su quale porta inoltrare un frame ricevuto, uno switch deve possedere una funzione di instradamento. Questa è basata sull'apprendimento passivo degli indirizzi sorgente deiframe inoltrati (transparent learning o backward learning.), attraverso il quale lo switch impara su quale porta si trova un determinato indirizzo: questa associazione viene scritta in una tabella chiamata forwarding database. Gli indirizzi appresi vengono "dimenticati" dopo un certo tempo dalla loro ultima apparizione.

Quando un nodo A cerca di comunicare con un nodo B, il comportamento dello switch dipende dalla porta cui è collegato B:

Normalmente, il nodo riceverà il pacchetto e risponderà, permettendo allo switch di scoprire a quale porta è collegato.

Alcuni frame hanno un indirizzo destinazione particolare, denominato broadcast, che indica che sono destinati a tutti i calcolatori della rete. Uno switch inoltra questi frame su tutte le porte. Per questo si dice che lo switch crea un unico dominio di broadcast.

La complessità del comportamento di uno switch è compensata dalle migliori prestazioni ottenibili.

Il fatto che i frame vengano ritrasmessi selettivamente ha anche delle implicazioni di sicurezza informatica, in quanto evita che un calcolatore possa facilmente intercettare (sniffare) il traffico diretto ad un altro. Esistono comunque tecniche raffinate che permettono lo sniffing anche in presenza di switch, come l'ARP Poisoning o lo Switch Flooding, per cui uno switch non deve essere considerato come una protezione inattaccabile contro i rischi di intercettazione.

Struttura interna [modifica]



Switch modulare a 24 porte

Internamente, uno switch è costituito da una o più schede munite di porte. Ad ogni porta può essere connesso un nodo, che può essere una stazione, un altro switch, un hub o altro dispositivo di rete.

Quando un nodo A cerca di comunicare con un nodo B, il comportamento dello switch dipende dalla scheda cui è collegato B:

L'intelligenza necessaria a gestire le porte di ingresso e di uscita (riconoscere i frame, estrarre gli indirizzi sorgente e destinazione, trasmetterli) è distribuita sulle singole schede.

Spesso su alcune porte possono essere montati trasduttori di tipo diverso per risolvere diversi tipi di esigenze (si veda ad esempio la ricchezza ditecnologie di livello fisico disponibili per IEEE_802.3). Questa possibilità viene tipicamente utilizzata per aggiungere ad uno switch 100Base-TX una o due porte di tipo 1000Base-X per il collegamento verso il resto della rete (uplink) o per un server veloce.

Alcuni switch hanno una costruzione modulare, ovvero le schede possono essere montate dal gestore, per modulare il numero di porte a disposizione o per utilizzare porte di tipo diverso.

Anche se non conveniente soprattutto in termini economici, è possibile realizzare uno switch anche con un comune computer dotato di più interfacce di rete.

Metodi di instradamento [modifica]

Esistono 3 tipologie di instradamento che possono essere utilizzate da uno switch:

Nella prima tipologia lo switch si limita a leggere l'indirizzo MAC del destinatario e quindi manda il contenuto del frame contemporaneamente alla sua lettura. In questo caso l'invio dei framenon attende la ricezione completa dello stesso. Questo tipo di switch è quello con latenza minore.

Negli switch store-and-forward invece viene letto l'intero frame e ne viene calcolato il cyclic redundancy check (CRC) confrontandolo con il campo FCS all'interno del frame. Solo se i due valori corrispondono il frame viene mandato al destinatario, altrimenti non viene trasmesso. Questi tipi di switch consentono di bloccare frame contenenti errori ma hanno una latenzamaggiore.

L'ultima tipologia è un compromesso tra le due precedenti in quanto si leggono i primi 64 bytes del frame in modo da rilevare solo alcune anomalie nel frame.

Gli switch fragment-free e cut-through possono essere impiegati solamente nello switching simmetrico ovvero dove trasmettitore e ricevitore operano alla stessa velocità, gli switch store-and-forward invece consentono anche lo switching asimmetrico.

Le tre tipologie si differenziano solo se il buffer di trasmissione è vuoto e se il link di uscita è libero. Nel caso contrario le tre tipologie si riducono all'unica store-and-forward.

Gestione [modifica]

Uno switch di fascia medio-alta è tipicamente dotato di un agente di gestione, ovvero un piccolo programma software che permette di controllarne e monitorarne il funzionamento. Questo è accessibile sia attraverso una porta seriale (gestione out-of-band) che attraverso la stessa rete ethernet (gestione in-band). In questo caso, all'agente di gestione viene normalmente assegnato un indirizzo IP, e questo risponde ai protocolli SNMPtelnet e/o sshHTTP.

Uno switch gestito permette tipicamente di accedere da remoto a queste funzionalità:

Stackable [modifica]

Macchine più evolute sono dotate di funzionalità che permettono l'interconnessione backbone, in cui rami con caratteristiche di velocità e capacità inferiori confluiscono ordinatamente su rami con caratteristiche superiori; per questi collegamenti vengono utilizzate velocità che possono arrivare anche a 10Gbps. Generalmente in una macchina stackabile le porte adibite a queste connessioni sono dotate di interoperabilità o sono addirittura modulari, questa caratteristiche rendendo flessibile la modalità di link es. nella scelta di velocità e trasporto fisico (rame o fibra).

Caratteristiche significative della macchine stackabili sono:

  1. la possibilità di impilare varie macchine;
  2. la possibilità di gestirle assieme come fossero una;
  3. la possibilità di interconnettere macchine di tipo diverso switch, hubrouter;
  4. la possibilità di realizzare sistemi tolleranti ai guasti (se si rompe una macchina le altre continuano a funzionare e allo stesso modo se una porta non funziona se ne collega un'altra

Frame

Nonostante Ethernet abbia diverse tipologie, l'elemento comune è nella struttura del frame, che viene definito DIX (DECIntelXerox), è rimasto fedele alla versione originale.


Questo è il frame ricevuto dallo strato di rete nella pila di protocolli. Gli elementi sono:

È molto simile al frame IEEE 802.3, tranne che per il campo tipo, che nell'802.11 diventa Tipo o Lunghezza e il preambolo ridotto a 7 byte con 1 byte trasformato in Start of Frame.

Indirizzo Ethernet [modifica]

Gli indirizzi sono tutti a 6 byte, in quanto Ethernet definisce uno schema di indirizzamento a 48 bit: ogni nodo collegato, quindi, ha un indirizzo Ethernet univoco di questa lunghezza, che è l'indirizzo fisico della macchina ed è associato all'hardware.

Tali indirizzi sono anche detti indirizzi hardwareindirizzi MAC o MAC address, oppure indirizzi di livello 2.

Legacy Ethernet [modifica]

Le Legacy Ethernet hanno in comune:

Tipologia di trasmissione [modifica]

La codifica usata per i segnali binari è la codifica Manchester.

Ethernet è una tecnologia che fornisce al livello di rete un servizio senza connessione. In pratica, il mittente invia il frame nella LAN senza alcun handshake iniziale in modalità broadcast (oa bus condiviso): il frame attraversa tutta la LAN e viene ricevuto da tutti gli adattatori presenti, ma solo l'adattatore che vi riconosce il proprio indirizzo di destinazione lo recepirà, mentre tutti gli altri lo scarteranno.

Il frame ricevuto può contenere errori, la maggior parte dei quali sono verificabili dal controllo CRC. Un frame che non supera il controllo CRC viene scartato. Ethernet non prevede la ritrasmissione del frame scartato, né una notifica della sua perdita agli strati superiori. Ethernet non è quindi affidabile, ma grazie a ciò è semplice ed economica. Il compito di provvedere alla ri-trasmissione dei frame perduti viene demandato agli strati superiori (ad esempio il protocollo TCP).

La gestione delle collisioni e dell'occupazione simultanea del canale di trasmissione viene gestita mediante il CSMA/CD (Carrier Sense Multiple Access with Collision Detection). Anche da questo punto di vista, Ethernet non è in grado di garantire la consegna di un frame, e men che meno che il frame sia consegnato entro un tempo prevedibile.

Per approfondire, vedi la voce CSMA/CD.

Nei sistemi Ethernet recenti, il problema non si presenta in quanto con gli switch e la crescita della capacità (vedi Gigabit Ethernet) si eliminano le collisioni e si rende molto più improbabile la congestione.

Efficienza [modifica]

Ethernet utilizza un algoritmo di accesso multiplo alla rete detto CSMA/CD. Ciò permette all'Ethernet, in certe condizioni, di avere un'efficienza di trasmissione del 100%.

L'efficienza è vista come la frazione di tempo a lungo termine durante la quale sono trasmessi frame senza collisioni con altri mittenti.

Ethernet con ripetitori e hub [modifica]

Per approfondire, vedi la voce Hub (informatica).



Rete con hub centrale

Ethernet tende a crescere, ma il cavo Ethernet ha una capacità limitata sia in lunghezza sia in capacità di traffico, per cui le LAN di grosse dimensioni vengono suddivise in reti più ridotte interconnesse tra loro da particolari nodi tra i quali possiamo trovare dei ripetitori, degli hub o elementi più sofisticati come bridge oswitch.

Il ripetitore semplicemente replica il segnale ricevuto. Il cavo Ethernet può quindi assumere lunghezze molto maggiori alle sue capacità. L'unico vincolo è che tra due computer ci devono essere al massimo due ripetitori per salvaguardare la temporizzazione di CSMA/CD.

Ethernet con bridge e switch [modifica]

Per approfondire, vedi la voce Bridge (informatica).



Rete complessa collegata da più switch

Il bridge è un elemento di interconnessione più sofisticato dell'hub perché opera sui frame e non sui segnali elettrici. Con questo sistema si possono creare segmenti di LAN indipendenti in cui le collisioni e i ritardi restano limitati.

Molti bridge sono adattativi o ad apprendimento per cui sono provvisti di un software con elenchi di indirizzi per ogni scheda ethernet che posseggono. In questo modo quando arriva un frame, estrapolano l'indirizzo di destinazione, e inviano lo stesso frame nel segmento giusto in base agli elenchi associati alle schede.

Molto più sofisticati sono gli switch che sono composti da un numero elevato di schede ethernet che consente ad ogni host di essere connesso direttamente. Allo switch vengono poi collegati uno o più cavi Ethernet ad alta velocità che collegano altri segmenti di LAN.

In questo modo lo switch intercetta i frame e li ridireziona ad un host oppure sui segmenti Ethernet. La gestione dei frame, quindi, è ottimizzata perché questi sono subito reindirizzati alla destinazione evitando, per quanto possibile, collisioni. In questo modo ogni scheda ha un suo dominio di collisione.

Broadcasting

Per broadcasting (o con l'obsoleto termine italiano radioaudizioni circolari) si intende la trasmissione di informazioni da un sistema trasmittente ad un insieme di sistemi riceventi non definito a priori.

L'esempio più classico è costituito da un trasmettitore radio di grande potenza e da un gran numero di ricevitori montati nelle automobili o nelle case. In questo caso, tutti i ricevitori situati nell'area di copertura del trasmettitore riceveranno il segnale, e il trasmettitore non potrà sapere esattamente con chi ha comunicato.

La trasmissione broadcasting è unidirezionale. Le informazioni sono inviate dal trasmettitore ai ricevitori, senza canale di ritorno e senza sicurezza che le stesse riescano ad essere consegnate.

In opposizione alle comunicazioni broadcasting, ci sono le comunicazioni punto-punto o bidirezionali.

Nel mondo della radio e nella televisione, il termine broadcasting indica anche il livello di qualità richiesto per trasmissioni commerciali a grande diffusione, e gli strumenti professionali utilizzati per ottenerlo.

Nelle reti di calcolatori, il termine ha un significato simile: un pacchetto inviato ad un indirizzo di tipo broadcast verrà consegnato a tutti i computercollegati alla rete (ad esempio, tutti quelli su un segmento di rete ethernet, o tutti quelli di una sottorete IP).

Broadcasting (informatica)

Da Wikipedia, l'enciclopedia libera.

Nelle reti di calcolatori, il termine Broadcast indica una modalità di instradamento per la quale un pacchetto inviato ad un indirizzo particolare (detto appunto di broadcast) verrà consegnato a tutti i computer collegati alla rete (ad esempio, tutti quelli su un segmento di rete ethernet, o tutti quelli di unasottorete IP).

Un pacchetto destinato ad un solo computer è detto Unicast, uno destinato a molti è detto Multicast, uno destinato ad uno qualunque di un gruppoAnycast

Per via dei costi gli indirizzamenti broadcast non sono consentiti a livello globale (internet), ma risultano vincolati nell'ambito di una rete locale.

Il Broadcast può essere eseguito su diversi livelli del modello OSI. A livello Data Link (Secondo Livello) l'invio del pacchetto o richiesta viene eseguito sfruttando il MAC Address (Indirizzo Fisico) impostandolo al suo valore più alto (FFFFFF.FFFFFF). A livello Network (Terzo Livello) l'invio del pacchetto o richiesta viene eseguita sfruttando l'IP (indirizzo logico) impostandolo sempre al suo valore più alto facendo attenzione alla relativa subnet di appartenenza.

Si definisce broadcast, in generale, la spedizione contemporanea della stessa informazione a più nodi di arrivo contemporaneamente.

Si chiama broadcasting l'utilizzo di questo metodo di comunicazione.

Un sistema definito broadcast consente l'elaborazione e l'invio di pacchetti di dati che, grazie all'inserimento di un codice speciale nel campo indirizzo, può essere ricevuto da tutti i computer contemporaneamente collegati, invece che da uno solo. Nel caso di un funzionamento di questo tipo si è soliti dire che il dispositivo di rete opera in broadcasting.

Transmission Control Protocol

Da Wikipedia, l'enciclopedia libera.

Transmission Control Protocol (TCP) è un protocollo di livello di trasporto della suite di protocolli Internet. È definito nella RFC 793, e su di esso si appoggiano gran parte delle applicazioni Internet.

Il TCP può essere classificato al livello trasporto (OSI level 4) del modello di riferimento OSI, e di solito è usato in combinazione con il protocollo di livello rete (OSI level 3) IP. La corrispondenza con il modello OSI non è perfetta, in quanto il TCP e l'IP nascono prima. La loro combinazione è indicata come TCP/IP e, alle volte, è erroneamente considerata un unico protocollo.

Da qui, la difficoltà di una classificazione univoca per un protocollo che comprende, a pieno titolo, due livelli dello stackOSI (o pila ISO/OSI in italiano)

Il TCP è stato progettato per utilizzare i servizi del protocollo IP, che non offre alcuna garanzia in ordine alla consegna dei pacchetti, al ritardo, alla congestione, e costruire un canale di comunicazione affidabile tra due processi applicativi. Il canale di comunicazione è costituito da un flusso bidirezionale di byte. Inoltre, alcune funzionalità di TCP sono vitali per il buon funzionamento complessivo di una rete IP.

Il TCP nacque nel 1970 come frutto del lavoro di un gruppo di ricerca del dipartimento di difesa statunitense. I suoi punti di forza sono l'alta affidabilità e robustezza. La sua popolarità si deve anche grazie ad una sua implementazione diffusa dallaUniversità di Berkeley, rilasciata in California sotto forma di sorgenti.

Caratteristiche principali [modifica]

Confronto con UDP [modifica]

Le principali differenze tra TCP e UDP (User Datagram Protocol), l'altro principale protocollo di trasporto della suite di protocolli Internet, sono:

L'utilizzo del protocollo TCP rispetto a UDP è, in generale, preferito quando è necessario avere garanzie sulla consegna dei dati o sull'ordine di arrivo dei vari segmenti (come per esempio nel caso di trasferimenti di file). Al contrario UDP viene principalmente usato quando l'interazione tra i due host è idempotente o nel caso si abbiano forti vincoli sulla velocità e l'economia di risorse della rete.

Header TCP [modifica]

La PDU di TCP è detta segmento. Ciascun segmento viene normalmente imbustato in un pacchetto IP, ed è costituito dall'intestazione (header) TCP e da un carico utile (in inglesepayload), ovvero dati di livello applicativo. I dati contenuti nell'intestazione costituiscono un canale di comunicazione tra le due entità TCP, che viene utilizzato per realizzare le funzionalità dello strato di trasporto e non è accessibile agli strati dei livelli superiori.

Un segmento TCP è così strutturato:

TCP Header 

Bit offset 

Bits 0–3 

4–7 

8–15 

16–31 

0

Source port 

Destination port 

32

Sequence number 

64

Acknowledgment number 

96

Data offset 

Reserved 

CWR 

ECE 

URG 

ACK 

PSH 

RST 

SYN 

FIN 

Window Size 

128

Checksum 

Urgent pointer 

160

Options (optional) 

160/192+

 
Data
 

Sequence number e Acknowledgment number [modifica]

Il Sequence number, o numero di sequenza, serve a posizionare il carico utile del segmento TCP all'interno del flusso di dati.

TCP si aspetta di ricevere il segmento successivo all'ultimo segmento ricevuto in ordine, ovvero quello il cui numero di sequenza è pari al numero di sequenza dell'ultimo segmento ricevuto in ordine più la dimensione del carico utile dello stesso segmento (cioè del suo campo Data).

In ricezione, TCP controlla se il numero di sequenza ricevuto è quello atteso e in caso affermativo può inviare direttamente il carico utile al processo di livello applicativo e liberare i propribuffer.

Se invece riceve un numero di sequenza maggiore di quello atteso, deduce che uno o più segmenti ad esso precedenti sono andati persi o ritardati dal livello di rete sottostante. Pertanto, memorizza temporaneamente in un buffer il carico utile del segmento per poterlo consegnare al processo applicativo dopo aver ricevuto e consegnato anche tutti quelli precedenti. Dal punto di vista del processo applicativo, quindi, i dati arriveranno in ordine anche se la rete ha per qualsiasi motivo alterato questo ordine, realizzando così il requisito della consegna ordinata dei dati.

Se infine il numero di sequenza ricevuto è inferiore a quello atteso, il segmento viene considerato un duplicato di uno già ricevuto e già inviato allo strato applicativo, e quindi scartato. Questo permette di realizzare l'eliminazione dei duplicati di rete.

In ogni segmento inoltre, viene inviato un Acknowledgment Number, o numero di riscontro. Il numero di riscontro presente in un segmento riguarda il flusso di dati nella direzione opposta. In particolare, il numero di riscontro inviato da A a B è pari al numero di sequenza atteso da A e, quindi, riguarda il flusso di dati da B ad A.

Il protocollo TCP adotta la politica di Conferma cumulativa, ciò significa semplicemente che l'arrivo di numero di riscontro indica al ricevente che il mittente ha ricevuto e correttamente inoltrato al proprio processo applicativo, il segmento avente numero di sequenza uguale al numero di riscontro indicato (-1) e anche tutti i segmenti ad esso precedenti. Per tale motivo, in trasmissione, TCP mantiene temporaneamente una copia di tutti i dati inviati ma non ancora riscontrati. Quando riceve un numero di riscontro per un segmento, ne deduce che tutti i dati precedenti a quel numero sono stati ricevuti correttamente e quindi libera il proprio buffer da questi dati.

Per ciascun segmento inviato, TCP avvia un timer, detto timer di ritrasmissione RTO (Retransmission Time Out). Se il segmento non riceve un ACK prima che il timer scada, TCP assume che tutti i segmenti trasmessi a partire da quello siano andati persi e quindi li ritrasmette.

Si noti che, in TCP, il meccanismo dei numeri di riscontro non permette al ricevitore di comunicare al trasmettitore che un segmento è stato perso, ma alcuni dei successivi sono stati ricevuti (meccanismo ad Acknowledgment Number negativi), quindi è possibile che per un solo pacchetto perso ne debbano essere ritrasmessi molti. Questo comportamento non ottimale è compensato dalla semplicità del protocollo. Questa tecnica è detta Go-Back-N; l'alternativa, ovvero progettare il protocollo di trasporto in modo che solo i pacchetti effettivamente persi vengano ritrasmessi, è detta Selective Repeat (ripetizione selettiva); l'utilizzo però di alcuni campi opzionali appositi permette l'utilizzo della ripetizione selettiva.

I numeri di riscontro e i relativi timer permettono quindi di realizzare la consegna affidabile, ovvero di garantire che tutti i dati inviati siano consegnati anche se alcuni pacchetti vengono persi dalla rete.

I timer del TCP [modifica]

Timer di ritrasmissione [modifica]

Come descritto sopra, il timer di ritrasmissione serve a verificare che ciascun segmento trasmesso venga riscontrato.

La corretta impostazione di questo timer è difficile ma molto importante, in quanto un timer troppo breve comporta ritrasmissioni inutili (il timer scatta mentre il riscontro o il pacchetto sono ancora in viaggio), mentre un timer troppo lungo comporta attese in caso di perdita di pacchetti.

TCP aggiusta continuamente il timer di ritrasmissione basandosi su una stima a media mobile del Round Trip Time.

Timer di persistenza (finestra scorrevole) [modifica]

Come spiegato sopra, il TCP utilizza il metodo della finestra scorrevole per gestire il flusso di dati che il ricevente è in grado di accettare. Tra i valori validi di questo campo vi è anche lo zero, a significare che il ricevente richiede l'interruzione momentanea dell'invio di dati.

Nel malaugurato caso in cui il pacchetto che riapre la finestra venga perso, il mittente del canale TCP rimarrà però in attesa indefinita. Per evitare questo, il TCP avvia un timer, detto timer di persistenza, ogni qual volta il ricevente chiude la finestra. Quando questo timer scade, il mittente invia un pacchetto sonda al ricevente, provocandone una risposta: in questo modo il mittente potrà essere sicuro che la finestra sia chiusa (ricevendo un altro pacchetto con campo Window a 0) o sbloccarsi dallo stallo (ricevendo un pacchetto con campo Window diverso da zero).

Per approfondire, vedi la voce Controllo della congestione in TCP.

Timer di keepalive [modifica]

La RFC 793 che definisce il protocollo TCP non prevede particolari azioni da intraprendere quando non ci sono dati da trasmettere sulla connessioni. Alcune implementazioni però consentono di trasmettere periodicamente segmenti vuoti, detti keepalive, per evitare di mantenere indefinitamente in memoria connessioni con sistemi che potrebbero anche non essere più attivi. In molti sistemi il software applicativo ha la possibilità di scegliere se abilitare o meno i keepalive per ogni connessione.

Quando si usano i keepalive, è presente dunque il timer di keepalive: esso viene reimpostato alla ricezione o alla trasmissione di ogni segmento, e quando scade viene trasmesso un keepalive. Un valore tipico è di due ore.

Timed wait [modifica]

L'ultimo timer utilizzato da TCP è il timed wait. In pratica, prima di disconnettere effettivamente una connessione, i due estremi del canale attendono un tempo pari al doppio del tempo di vita di un comune pacchetto: questo evita che dei pacchetti possano rimanere circolanti per la rete anche dopo la chiusura.

Apertura di una connessione - Three-way handshake [modifica]


La procedura utilizzata per instaurare in modo affidabile una connessione TCP tra due host è chiamata three-way handshake (stretta di mano a 3 vie), indicando la necessità di scambiare 3 messaggi tra host mittente e host ricevente affinché la connessione sia creata correttamente. Consideriamo ad esempio che l'host A intenda aprire una connessione TCP con l'host B; i passi da seguire quindi sono:

  1. A invia un segmento SYN a B - il flag SYN è impostato a 1 e il campo Sequence number contiene il valore x che specifica l'Initial Sequence Number di A;
  2. B invia un segmento SYN/ACK ad A - i flag SYN e ACK sono impostati a 1, il campo Sequence number contiene il valore yche specifica l' Initial Sequence Number di B e il campo Acknowledgment number contiene il valore x+1 confermando la ricezione del ISN di A;
  3. A invia un segmento ACK a B - il campo Acknowledgment number contiene il valore y+1 confermando la ricezione del ISN di B.

Il terzo segmento non sarebbe, idealmente, necessario per l'apertura della connessione in quanto già dopo la ricezione da parte di A del secondo segmento, entrambi gli host hanno espresso la loro disponibilità all'apertura della connessione. Tuttavia esso risulta necessario al fine di permettere anche all'host B una stima del timeout iniziale, come tempo intercorso tra l'invio di un segmento e la ricezione del corrispondente ACK.

Il flag SYN risulta utile nell'implementazione pratica del protocollo, e nella sua analisi da parte dei firewall: nel traffico TCP i segmenti SYN stabiliscono nuove connessioni, mentre quelli con il flag non attivo appartengono a connessioni già instaurate.

I segmenti utilizzati durante l'handshake sono solitamente 'solo header', ossia hanno il campo Data vuoto essendo questa una fase di sincronizzazione tra i due host e non di scambio di dati.

Chiusura di una connessione - Chiusura a 4 vie [modifica]


Dopo che è stata stabilita, una connessione TCP non è considerata una singola connessione bidirezionale, ma piuttosto come l'affasciamento di due connessioni monodirezionali. Pertanto, ognuna delle parti deve terminare la sua connessione, e possono esistere anche connessioni aperte a metà, in cui solo uno dei due terminali ha chiuso la connessione e non può più trasmettere, ma può (e deve) ricevere i dati dall'altro terminale.

Di conseguenza, la chiusura della connessione si può effettuare in due modi: con un handshake a tre vie, in cui le due parti chiudono contemporaneamente le rispettive connessioni, o con uno a quattro vie, in cui le due connessioni vengono chiuse in tempi diversi.

L'handshake a 3 vie è omologo a quello usato per l'apertura della connessione, con la differenza che il flag utilizzato è il FIN invece del SYN. Un terminale invia un pacchetto con la richiesta FIN, l'altro risponde con un FIN + ACK, ed infine il primo manda l'ultimo ACK, e l'intera connessione viene terminata.

L'handshake a 4 vie invece viene utilizzato quando la disconnessione non è contemporanea tra i due terminali in comunicazione. In questo caso uno dei due terminali invia la richiesta di FIN, e attende l'ACK. L'altro terminale farà poi altrettanto, generando quindi un totale di 4 pacchetti.

Multiplazione e porte [modifica]

Ciascuna connessione TCP attiva è associata a un socket aperto da un processo (il socket è lo strumento offerto dal sistema operativo alle applicazioni per usare le funzionalità della rete). TCP si occupa di smistare i dati tra le connessioni attive ed i relativi processi. Per questo, a ciascuna connessione tra due host viene associato un numero di porta su ciascuno dei due host, che è un intero senza segno a 16 bit (1-65535), contenuto nell'apposito campo dell'header.

Una connessione TCP sarà quindi identificata dagli indirizzi IP dei due host e dalle porte utilizzate sui due host.

In questo modo, un server può accettare connessioni da più client contemporaneamente attraverso una o più porte, un client può stabilire più connessioni verso più destinazioni, ed è anche possibile che un client stabilisca contemporaneamente più connessioni indipendenti verso la stessa porta dello stesso server.

Server e Client [modifica]

I due processi che comunicano attraverso una connessione TCP hanno ruoli diversi:

Le porte conosciute e registrate sono quindi utilizzate dai processi server, e sono convenzionalmente associate a particolari servizi, in modo che un client sappia a quale porta connettersi per raggiungere un determinato server.

Il processo server, che è in ascolto su una certa porta, rimane bloccato in attesa che un client si colleghi. Il processo client richiede di stabilire una connessione verso un determinato server su una determinata porta. Normalmente la porta sorgente usata dal client viene allocata dinamicamente dal sistema operativo del client. Quando il TCP stabilisce la connessione, a entrambi i processi viene assegnato un socket tramite cui essi possono comunicare tra loro. Tipicamente il processo server effettua una fork, affida al figlio il compito di comunicare con il nuovo client e si rimette in ascolto. Da questo punto in poi, client e server hanno ruoli simmetrici, e utilizzano gli stessi strumenti per comunicare attraverso il socket.

Internet Protocol

L'Internet Protocol (IP) è un protocollo di rete a pacchetto, non connesso; secondo la classificazione ISO/OSI è di livello rete (3).

La versione correntemente usata del protocollo IP è detta anche IPv4 per distinguerla dalla più recente IPv6, nata dall'esigenza di gestire meglio il crescente numero di computer connessi ad Internet.

IP è un protocollo di interconnessione di reti (Inter-Networking Protocol), nato per interconnettere reti eterogenee per tecnologia, prestazioni, gestione.

I protocolli di trasporto utilizzati su IP sono soprattutto TCP e UDP.

Porta (reti)

Nelle reti di calcolatori, le porte sono lo strumento utilizzato per realizzare la multiplazione delle connessioni a livello di trasporto, ovvero per permettere ad un calcolatore di effettuare più connessioni contemporanee verso altri calcolatori, facendo in modo che i dati contenuti nei pacchetti in arrivo vengano indirizzati al processo che li sta aspettando.

Il termine è la traduzione dell'inglese port, nella accezione derivante dal latino porta: apertura, portale, oblò; il termine che in italiano si traduce in porto deriva invece dal latino portus, cfr.[1][2].

Le porte sono numeri (in TCP e UDP sono a 16 bit) utilizzati per identificare una particolare connessione di trasporto tra quelle al momento attive su un calcolatore. I pacchetti appartenenti ad una connessione saranno quindi identificati dalla quadrupla [<indirizzo IP sorgente>, <indirizzo IP destinazione>, <porta sorgente>, <porta destinazione>]. I pacchetti nella direzione opposta avranno ovviamente sorgente e destinazione scambiati.

Il livello di trasporto (tipicamente realizzato dal sistema operativo) associa a ciascuna porta utilizzata un punto di contatto (ad esempio, una socket), utilizzato da uno (o più) processiapplicativi per trasmettere e/o ricevere dati.

Per poter inviare con successo un pacchetto con una certa porta destinazione, ci deve essere un processo che è "in ascolto" su quella porta, ovvero che ha chiesto al sistema operativo di ricevere connessioni su quella porta. L'operazione di impegnare una porta TCP o UDP da parte di un processo è detta "bind", dal nome della chiamata di sistema unix che la realizza.

La porta sorgente utilizzata in una connessione viene scelta dal calcolatore che inizia la connessione tra una di quelle al momento non impegnate.

In Internet, c'è una convenzione per cui ad alcuni numeri di porta sono associati determinati protocolli di livello applicativo. Ad esempio, se voglio contattare il server HTTP eventualmente in esecuzione su un certo calcolatore, so che devo tentare di stabilire una connessione verso la porta 80.

I numeri di porta sono classificabili in tre gruppi:

Sicurezza 

Supervisionare le porte "in ascolto" cioè aperte è di estrema importanza, per evitare attacchi informatici che nel caso più grave possono portare al controllo completo del computer. Per visualizzare le porte aperte sul proprio computer è necessario un programma di scansione delle porte e dei relativi servizi collegati ad esse. Le porte normalmente più vulnerabili sono:

Finestra scorrevole

La finestra scorrevole (dall'inglese sliding window) è un metodo di controllo del flusso di dati nelle reti di calcolatori, in particolare usato dal protocollo TCP. La finestra rappresenta il numero di byte che il destinatario della trasmissione si dichiara disposto a ricevere oltre l'ultimo byte per cui il mittente abbia già ricevuto il segnale di conferma, ovvero ACK (acknowledgement). Essa viene definita scorrevole in quanto si sposta partendo sempre dall'ultimo byte confermato e non è di dimensione costante, ma può variare durante la trasmissione per controllare il flusso dei dati inviati dal mittente. I fattori che vanno ad influenzare l'ampiezza della finestra indicata possono essere molteplici, ad esempio il controllo di flusso, ossia il controllo della capacità di ricezione della destinazione, ed il controllo della congestione, che limita la velocità della trasmissione in relazione alle capacità dei componenti di rete interessati dal trasferimento.

Nel TCP, il ricevente comunica al trasmittente la propria finestra attraverso il campo Window presente nell'header dei segmenti, costituito da un numero intero senza segno in 16 bit. Tale campo indica il numero di ottetti di dati a partire da quello indicato nel campo acknowledgement (Acknowledgement Number) accettati nella comunicazione.

User Datagram Protocol

Lo User Datagram Protocol (UDP) è uno dei principali protocolli della suite di protocolli Internet. È un protocollo di trasporto a pacchetto, usato di solito in combinazione con il protocollo IP.

 

Funzionamento 

A differenza del 

TCP, l'UDP è un protocollo di tipo connectionless, inoltre non gestisce il riordinamento dei pacchetti né la ritrasmissione di quelli persi, ed è perciò generalmente considerato di minore affidabilità. È in compenso molto rapido ed efficiente per le applicazioni "leggere" o time-sensitive. Ad esempio, è usato spesso per la trasmissione di informazioni audio o video. Dato che le applicazioni in tempo reale spesso richiedono un ritmo minimo di spedizione, non vogliono ritardare eccessivamente la trasmissione dei pacchetti e possono tollerare qualche perdita di dati, il modello di servizio TCP può non essere particolarmente adatto alle loro caratteristiche. L'UDP fornisce soltanto i servizi basilari del livello di trasporto, ovvero:

mentre TCP garantisce anche il trasferimento affidabile dei dati, il controllo di flusso e il controllo della congestione.

L'UDP è un protocollo stateless, ovvero non tiene nota dello stato della connessione, dunque ha rispetto al TCP informazioni in meno da memorizzare. Un server dedicato ad una particolare applicazione che scelga UDP come protocollo di trasporto può supportare molti più client attivi.

Struttura di un datagramma UDP [modifica]

Un datagramma (o pacchetto) UDP è così strutturato:

+

Bit 0-15

16-31

0

Source Port (optional)

Destination Port

32

Length

Checksum (optional)

64+

 
Data
 

Applicazioni che utilizzano UDP [modifica]

Le applicazioni che hanno la necessità di un trasferimento affidabile dei loro dati si affidano ovviamente a TCP. Le applicazioni più elastiche riguardo alla perdita dei dati e dipendenti dal tempo si affidano invece a UDP. Inoltre si utilizza UDP per comunicazioni in broadcast (invio a tutti i terminali in una rete locale) e multicast (invio a tutti i terminali iscritti ad un servizio).
Di seguito è proposto un elenco dei principali servizi internet e dei protocolli che adottano:

Applicazione

Protocollo strato applicazione

Protocollo strato trasporto

Posta elettronica

SMTP

TCP

Accesso a terminale remoto

telnet

TCP

Trasferimento file

FTP

TCP

Web

HTTP

TCP

Streaming Audio/Video

proprietario

tipicamente UDP

Server di file remoto

NFS

tipicamente UDP

Telefonia su internet (VoIP)

SIPH.323altri

tipicamente UDP

Gestione della rete

SNMP

tipicamente UDP

Protocollo di routing

RIP

tipicamente UDP

Risoluzione dei nomi

DNS

tipicamente UDP

Controllo della congestione in TCP

Il controllo della congestione in TCP è una funzionalità di TCP che permette di limitare la quantità di dati trasmessi e non ancora riscontrati dal mittente, adattando il flusso di dati inviato alle eventuali condizioni di congestione della rete.

TCP è uno dei protocolli di trasporto più diffusi nelle reti IP, ed attua il controllo della congestioneUDP non implementa invece alcuna forma di controllo di flusso o della congestione, anche se queste funzionalità possono essere realizzate allivello applicazioni.

Il TCP implementa il controllo della congestione, congiuntamente al controllo di flusso, solo agli estremi della comunicazione, e non richiede nessun supporto da parte dei router intermedi per realizzare questa funzione. Questo è coerente con il modello progettuale di IP, che prevede di aggiungere intelligenza ai nodi terminali lasciando i router il più possibile semplici.

Il controllo della congestione è implementato usando una variabile dell'header TCP detta CongWin (Congestion window, cioè "finestra di congestione"). Tale variabile impone un vincolo alla quantità di dati trasmessi e non ancora riscontrati dal mittente, ovvero i dati che sono stati consegnati per la trasmissione al livello di rete, che sono in viaggio sulla rete, in fase di elaborazione da parte di TCP sul nodo destinazione, o i cui ACK sono a loro volta in viaggio sulla rete.

Nello specifico la quantità di dati non riscontrati dal mittente non può essere superiore ai minimo tra i valori di CongWin e RcvWindow, ovvero LastByteSent − LastByteAcked < = min(CongWin,RcvWindow)

Questo vincolo limita la frequenza trasmissiva del mittente solo in modo indiretto. Supponendo che un host A invii segmenti ad un host B all'inizio di ogni RTT (Round Trip Time), il vincolo consente al mittente di trasmettere CongWin Byte sulla propria connessione; al termine dell'RTT il mittente riceve il riscontro dei dati. Da ciò si evince che la frequenza di invio del mittente è CongWin / RTT byte/sec, quindi il mittente può regolare la frequenza di invio di segmenti sulla propria connessione modificando il valore di CongWin.

In presenza di congestione nella rete, le code nei commutatori diventano più lunghe, e questo fa aumentare il ritardo subito dai pacchetti e dai relativi riscontri, e quindi l'RTT. Questo comporta una diminuzione della velocità di trasmissione di tutte le sessioni TCP attive.

L'algoritmo di controllo di congestione presenta due fasi:

  1. Partenza Lenta - Slow Start (Slow-Start)
  2. aumento additivo - diminuzione moltiplicativa (AIMD)

Per distinguere tra le due fasi viene usata una variabile chiamata SSTHRESH. Quando il valore della CongWin è minore del valore di SSTHRESH ci troviamo nella fase di 'Slow-Start', altrimenti siamo nella fase AIMD. All'avvio della trasmissione la variabile viene settata ad un valore molto alto, mentre la dimensione della CongWin è pari alla dimensione di un segmento.

Se la congestione diventa severa, uno o più buffer dei router lungo il percorso vanno in overflow, causando l'eliminazione di un datagramma IP che contiene un segmento TCP.

Quando avviene un evento di perdita dati, che viene rilevato allo scadere di un timeout di ritrasmissione, TCP reagisce dimezzando il valore di SSTHRESH e reimpostando CongWin alla dimensione di un segmento, tornando quindi nella fase di Slow-Start.

Le formule per il calcolo della finestra di trasmissione sono:

MaxWindow = MIN(AdvertisedWindow,CongestionWindow)

EffectiveWindow = MaxWindow − (LastByteSent − LastByteAcked)

con il seguente significato delle variabili:

MaxWindow indica la quantità massima di dati che il mittente può inviare

AdvertisedWindow indica la quantità massima di dati che la rete può accettare (ritardo * ampiezzadibanda)

EffectiveWindow indica i dati effettivi che il mittente può ancora spedire

LastByteSent indica l'ultimo byte inviato dalla sorgente (che può anche non essere stato confermato dalla destinazione)

LastByteAcked indica la l'ultimo byte confermato dalla destinazione

Politiche per il controllo della congestione [modifica]

Gli eventi che indicano al sender la perdita di dati trasmessi sono:

  1. ACK non riscontrati allo scadere del timer.
  2. ACK duplicati ricevuti 3 volte.

Esistono due algoritmi per il controllo della congestione: il primo, l'algoritmo di Tahoe, non distingue tra gli eventi sopra elencati, mentre il secondo, l'algoritmo di Reno, fa una netta distinzione tra i due casi.

TCP Tahoe [modifica]

TCP Tahoe prevede che ogni qual volta si verifichi un evento perdita di qualsiasi tipo, la finestra di congestione venga dimezzata e il nuovo valore memorizzato in una variabile soglia. Fatto questo la trasmissione dei dati ricomincia impostando il valore iniziale della finestra di congestione corrente pari ad 1 MSS (massima dimensione di un segmento TCP). Si ha quindi una 'ripartenza lenta', la crescita avverrà lentamente ma in maniera esponenziale fino a raggiungere il valore di soglia prima determinato. Oltre questo valore la crescita avviene linearmente fino a quando non si verifica nuovamente un evento perdita e l'algoritmo viene rieseguito. La crescita esponenziale fino al livello di soglia avviene poiché si ritiene che all'inizio di ogni trasferimento il canale trasmissivo sia più libero, e quindi si cerca di inviare all'inizio i pacchetti più grossi. Una volta raggiunto il livello di soglia, la crescita avviene lentamente per cercare di raggiungere il livello di congestione il più lentamente possibile.

TCP Reno [modifica]

TCP Reno distingue tra i due eventi di perdita sopra elencati:

  1. Si fa ripartire la trasmissione impostando la finestra corrente al valore minimo di 1 MSS.
  2. Si ricomincia con la partenza lenta con crescita esponenziale.
  1. Il valore soglia viene impostato alla metà del valore della finestra di congestione al momento della ricezione di tre ack duplicati.
  2. La trasmissione riparte impostando il valore di finestra corrente pari al valore di soglia e proseguendo nell'invio con un incremento lineare di 1 MSS ad ogni RTT il valore della finestra di congestione.

Un esempio di controllo della congestione con TCP-RENO:


TCP New Reno [modifica]

Il TCP Reno risolve in parte il problema di perdite non dovute a congestione solo quando le perdite non sono fortemente correlate tra loro, cioè quando si perde al massimo un pacchetto all'interno di ogni finestra. Questo comportamento è problematico nelle situazioni in cui si perdono interi burst di pacchetti (situazione frequente ad esempio nei collegamenti wireless). TCP New Reno cerca di aggirare il problema basandosi sul sistema degli ACK parziali. Vengono considerati ACK parziali gli ACK che riscontrano pacchetti intermedi, e non gli ultimi pacchetti che necessiterebbero riscontro, dopo che è stata già iniziata la fase di Fast Retransmit in seguito all'arrivo di tre ack duplicati. Quando uno di questi ack si presenta durante una fase di Fast Retransmit (cioè in seguito alla ricezione di 3 ack duplicati), TCP New Reno si mantiene in Fast Retransmit continuando a reinviare i pacchetti via via richiesti finché non viene riscontrato l'ultimo pacchetto inviato.