# data[].attributes.body
La rilevazione degli errori avviene tramite il Checksum
Nel caso venga trovato un errore durante la trasmissione di un pacchetto questo verrà scartato e verra inviato un messaggio di errore all'applicazione

# data[].attributes.body
Source/destination Port: Numero di porta sorgente/destinazione

Lenght: Lunghezza complessiva del segmento UDP

Checksum: Calcolato all'interno del pacchetto per il controllo degli errori

# data[].attributes.body
È formato da:

Header (8 Byte)

Payload (Variabile. Da 536 a 65535 Byte)

# data[].attributes.body
Applicazioni che richiedono un basso ritardo nella trasmissione di pacchetti

Applicazioni che tollerano errori e perdite i pacchetti durante il trasferimento

# data[].attributes.body
Supporta il multicast (L'invio di Datagrammi IP ad un gruppo di destinatari, in una singola trasmissione)

# data[].attributes.body
Trasferisce dati tramite il protocollo IP

# data[].attributes.body
Non necessita:

L'invio dell'ACK (Acknowledgement)

L'Handshaking tra mittente e destinatario

# data[].attributes.body
Il protocollo UDP (User Datagram Protocol) viene utilizzato quando non si necessita la completa gestione della connessione (es. streaming dati)

# data[].attributes.body
Non si ha la certezza dell'arrivo di tutti i pacchetti

# data[].attributes.body
Grantire solo l'indirizzamento dei segmenti

# data[].attributes.body
Garantire la consegna del messaggio in ordine

# data[].attributes.body
Non c'è perdita di dati

Tutti i dati vengono spediti al destinatario oppure viene inviato un messaggio di errore

Il destinatario invia Acknowledgment per confermare la ricezione di un pacchetto

# data[].attributes.body
Vengono utilizzati per l'implementazione di servizi

# data[].attributes.body
L'insieme delle regole che governano il formato e il signifiato delle informazioni scambiate tra le entità

# data[].attributes.body
L'insieme delle operazioni che un livello mette a disposizione al livello superiore

# data[].attributes.body
Ha 1 variabile:

RCV_base - Il valore minimo che il destinatario si aspetta di ricevere, se il byte non è stato ricevuto correttamente, non viene aggiornato;

Window Size;

# data[].attributes.body
Ha 2 variabili:

Send_base - Il SN del byte più vecchio tra quelli trasmessi dei quali non è stato ricevuto ancora il ACK;

NextSequenceNumber - Il SN del byte che deve essere trasmesso per la prima volta;

Window Size;

Il mittente aggiorna il send_base solo se il valore contenuto nel ACK è superiore a quello attuale(sposta la finestra).

# data[].attributes.body
L'utente nel stabilire una connessione comunica al livello di trasporto i parametri QoS necessari
Il livello di trasporto esamina i parametri richiesti e:
1. Se può garantirli, attiva la connessione.
2. Se non può garantirli, la connessione non viene attivata.
Il destinatario fa una richiesta di stabilire una connessione con una controproposta di valori che è in grado di garantire (se accetta ok, altrimenti c'è una controproposta a ribasso)

# data[].attributes.body
La negoziazione  è una fase dell'instaurazione di un canale di collegamento fra 2 pc. Prima che il collegamento venga creato viene effettuata la "negoziazione delle operazioni", i 2 pc concordano i parametri da utilizzare per la comunicazione. Se non viene raggiunto un accordo, la connessione viene rifiutata. I QoS negoziati sono validi per l'intera durata della connessione

# data[].attributes.body
Massimo ritardo d'attivazione della connessione

Numero di byte trasferiti per un'unità di tempo

Velocità di consegna a ritardo di traffico

Tasso d'errore residuo o numero di messaggi persi rispetto a quelli inviati

# data[].attributes.body
abbiamo bisogno di rilevare gli errori  di trasmissione e in ricezione dei segmenti persi

per rendere affidabile la trasmissione dobbiamo:

numerare i segmenti trasmessi ed i messaggi di riscontro ACK

implementare un timer in trasmissione

implementare window in trasmissione e ritrasmissione

il livello di trasporto numera i segmenti trasmessi

il sequence number contiene il numero sequenziale di ciascun byte a partire dall'initial sequence number e identifica la posizione nello stream del primo byte di dati del segmento

se il destinatario riceve il numero di sequenza atteso lo invia al livello di applicazione, altrimenti:

riceve il num. di sequenza maggiore -> memorizza temporaneamente i dati nel buffer di ricezione e attende l'arrivo dei segmenti mancanti

riceve il num. di sequenza minore -> lo scarta perche duplicato

# data[].attributes.body
La ritrasmissione dei segmenti persi avviene in ritardo. Perdita di efficienza.

# data[].attributes.body
Vengono considerati persi i segmenti a causa di congestione e si ritrasmettono "inutilmente". Perdita di efficenza

# data[].attributes.body
Permette la comunicazione di due applicazioni su due host tramite lo scambio di messaggi

# data[].attributes.body
Massimo intervallo di tempo che va dall'istante di trasmissione e la ricezione del riscontro prima della ritrasmissione del pacchetto

# data[].attributes.body
Intervallo di tempo che va dal momento in cui la sorgente inizia la trasmissione del segmento all'instante in cui riceve il messaggio di riscontro (ack)

# data[].attributes.body
Un servizio è affidabile se:

1. tutti i messaggi sono consegnati a destinazione senza errori

2. ogni messaggio viene consegnato una sola volta

3. i messaggi sono consegnati nello stesso ordine in cui sono stati trasmessi

# data[].attributes.body
Finestra utilizzata per gestire i dati inviati e ricevuti. La finestra è gestita come una coda.

# data[].attributes.body
Serve per impedire la circolazione "a vuoto" dei Datagram.
La durata di questo timer è il doppio del Time-To-Live del Datagram IP.
Allo scadere di questo timer, la connessione viene interrotta.

# data[].attributes.body
Il QoS relativo rappresenta il trattamento a priorità delle varie classi di dati. Se una classe di dati ha la priorità maggiore verrà elaborata prima.

es.
Livello di priorità del servizio, livello di priorità di scarto, etc.

# data[].attributes.body
Il QoS assoluto rappresenta dei parametri che devono  essere rispettati dal servizio e visti come indicatori della prestazione.

es.
Massimo ritardo, probabilità di perdita dei pacchetti, etc.

# data[].attributes.body
Controllo dell'errore su intestazione e dati.

# data[].attributes.body
Viene utilizzato per individuare la caduta di connessione per eccessiva inattività.
Il conteggio inizia alla ricezione di ogni segmento. Se il delay tra un segmento e l'altro supera il timer, la connessione è caduta.

# data[].attributes.body
Il numero di byte che il ricevitore è disposto a ricevere a partire dal Acknowledgement Numeber (flag).

# data[].attributes.body
I messaggi vengono segmentati e trasformati in TDPU (Transport protocol data unit)

# data[].attributes.body
Può essere definito in due modi

# data[].attributes.body
Instaura un collegamento logico tra le applicazioni di host remoti

# data[].attributes.body
Mette in comunicazione gli strati sottostanti (di rete) con quelli superiori (applicativi)

# data[].attributes.body
Il control bit è composto da 8 flag:

1. URG: Posto a 1 quando  il trasferimento è urgente.

2. ACK: Posto a 1 se bisogna considerare Acknowledgement Number.

3. PSH: Posto a 1 per  eseguire la consegna immediata delle informazioni.

4. CWR: Posto a 1 quando si deve ridurre la velocità di connessione per evitare congestioni.

5. ECE: Posto a 1 se supporta exploit congestion notification.

6. RST: Posto a 1 per resettare la connessione.

7. SYN: Posto a 1 per sincronizzare numero di sequenza.

8. FIN: Posto a 1 per chiudere la trasmissione.

# data[].attributes.body
Sono 4 bit riservati per uso futuro posti a 0.

# data[].attributes.body
Indica da dove iniziano i dati.

# data[].attributes.body
Il QoS (Quality of Service) è un insieme di parametri del livello di trasporto dello stack TCP/IP, aventi la funzione di garantire una certa qualità del servizio offerto dalla rete.

# data[].attributes.body
Se il bit ack=1,  esso contiene il Sequence Number che ci si aspetta di ricevere.

# data[].attributes.body
Dimensione massima di 64Kb circa.

IP Header

TCP Header

Data (max 64Kb)

# data[].attributes.body
Primo byte della sequenza alla quale sincronizzarsi se il bit syn=1 (flag).

# data[].attributes.body
Porta sorgente e porta di destinazione.

# data[].attributes.body
Ogni segmento inviato ha un proprio RTO(Ritransmission Time Out). Il RTO è il lasso di tempo all'interno del quale il destinatario deve mandare l' ACK di corretta ricezione al mittente. Se, entro il RTO, non giunge l' ACK al mittente,  questi ritrasmette tutti i segmenti dopo l' ultimo di cui ha ricevuto l' ACK.

L' ACK può non giungere per due motivi:
1) Il destinatario non riceve il segmento;
2) L' ACK viene perso durante la trasmissione;

Altre funzioni che regolano e controllano la trasmissione sono:
- Keep Alive Timer;
- Timed Wait;
- Sliding Window.

# data[].attributes.body
Definito nell'RFC793 composto da 32 bit