From c8733813bd44a5c89e41a4d22d610d49d39057ea Mon Sep 17 00:00:00 2001 From: dado Date: Sat, 24 May 2025 12:11:02 +0200 Subject: [PATCH] segmento TCP --- networking/020-tcp.md | 25 ++++++++++++++++++++++++- networking/asset/img/tcp.png | Bin 0 -> 27274 bytes 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 networking/asset/img/tcp.png diff --git a/networking/020-tcp.md b/networking/020-tcp.md index ebb32b8..eb77701 100644 --- a/networking/020-tcp.md +++ b/networking/020-tcp.md @@ -2,7 +2,7 @@ `TCP`, acronimo di *Transmission Control Protocol*, è un protocollo del livello 4 (transport layer) che si distingue per il suo approccio connection-oriented, a differenza di UDP. Questo significa che TCP stabilisce una connessione affidabile tra i processi degli host prima di iniziare lo scambio di informazioni, garantendo così una trasmissione sicura e ordinata. -Le principali caratteristiche di TCP: +## Caratteristiche principali - **Connection-Oriented**: prima dell'invio dei dati, TCP stabilisce una connessione tra le due estremità attraverso il meccanismo del `three-way handshake` (`SYN`, `SYN-ACK`, `ACK`). La chiusura della connessione avviene in modo simile, utilizzando un meccanismo che assomiglia a un three-way handshake (`FIN`, `FIN-ACK`, `ACK`) @@ -11,3 +11,26 @@ Le principali caratteristiche di TCP: - **Full Duplex**: la comunicazione è bidirezionale, ovvero i dati possono essere inviati e ricevuti simultaneamente su entrambi i lati della connessione. - **Controllo del flusso e della congestione**: TCP regola la velocità di invio dei dati in base alla capacità del ricevente, evitando di sovraccaricarlo. Questa gestione avviene attraverso meccanismi di controllo delle finestre di trasmissione e ricezione. Inoltre, TCP adotta algoritmi per il controllo della congestione, riducendo la velocità di trasmissione in caso di congestione della rete + +## Segmento TCP + +L'header del segmento TCP può variare da 20 byte (minimo) a 60 byte (massimo), e incapsula il payload, ovvero il messaggio generato dall'application layer. + +![tcp](asset/img/tcp.png) + +I campi principali dell'header TCP sono i seguenti: + +- **Porta Sorgente** (16 bit o 2 byte) +- **Porta Destinazione** (16 bit o 2 byte) +- **Sequence Number** (`SEQ`) (32 bit o 4 byte): rappresenta il numero del primo byte del segmento TCP trasmesso +- **Acknowledgment Number** (`ACK`) (32 bit o 4 byte): utilizzato dal destinatario per confermare la ricezione di `n` byte. Se il mittente invia `n` byte di dati, il destinatario risponderà con un un segmento con il campo ACK impostato a `n+1`. Questo valore indica che sono stati ricevuti correttamente `n` byte e che il prossimo byte atteso ha un numero di sequenza con un valore di `n+1`. Il punto di partenza del Sequence Number non è obbligatoriamente 0, ma dipende dall'`ISN` (*Initial Sequence Number*), che viene scelto casualmente tra 0 e 2^32-1 +- **Flags** (6 bit): Ogni bit rappresenta un flag con una funzione specifica. + - **URG** (Urgent): indica che il campo `Urgent Data Pointer` contiene informazioni importanti che devono essere gestite + - **PUSH**: il mittente richiede al destinatario di inviare immediatamente i dati all'application layer + - **ACK**: attivato se il campo Acknowledgment Number contiene un valore valido + - **SYN**: attivato durante l'instaurazione di una connessione + - **FIN**: Attivato per segnalare la chiusura della connessione + - **RST** (Reset): utilizzato per interrompere bruscamente la connessione +- **Checksum** (16 bit): controllo degli errori nel segmento TCP. +- **Options** (40 byte): Campo opzionale che può contenere informazioni aggiuntive per la gestione della connessione. +- **Receive Window** (16 bit): campo utilizzato per la gestione del flusso e delle finestre. Il destinatario indica al mittente la dimensione massima della finestra di ricezione. diff --git a/networking/asset/img/tcp.png b/networking/asset/img/tcp.png new file mode 100644 index 0000000000000000000000000000000000000000..b62b5b2fa330a82d587c762d0b6d859456b9abfb GIT binary patch literal 27274 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