3. Functional Specification - Part 1 (Specifica funzionale - Parte 1)
Questa sezione contiene la specifica tecnica principale di TCP: formato dell'intestazione, terminologia e meccanismi di numerazione delle sequenze.
3.1. Header Format (Formato dell'intestazione)
I segmenti TCP (TCP segments) sono inviati come datagrammi Internet (internet datagrams). L'intestazione del protocollo Internet contiene diversi campi di informazioni, inclusi gli indirizzi degli host di origine e destinazione [2]. Un'intestazione TCP segue l'intestazione Internet, fornendo informazioni specifiche al protocollo TCP. Questa divisione consente l'esistenza di protocolli a livello host diversi da TCP.
Formato dell'intestazione TCP
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Formato dell'intestazione TCP
Nota: Un segno di spunta rappresenta una posizione di bit
Descrizioni dei campi
Source Port (Porta di origine): 16 bit
Il numero di porta di origine.
Scopo: Identifica il processo mittente sull'host mittente.
Destination Port (Porta di destinazione): 16 bit
Il numero di porta di destinazione.
Scopo: Identifica il processo ricevente sull'host ricevente.
Sequence Number (Numero di sequenza): 32 bit
Il numero di sequenza del primo ottetto di dati in questo segmento (tranne quando SYN è presente). Se SYN è presente, il numero di sequenza è il numero di sequenza iniziale (Initial Sequence Number, ISN) e il primo ottetto di dati è ISN+1.
Punti chiave:
- Ogni byte di dati ha un numero di sequenza univoco
- I segmenti SYN usano ISN, i dati iniziano da ISN+1
- Spazio dei numeri di sequenza: da 0 a 2³² - 1
Acknowledgment Number (Numero di acknowledgment): 32 bit
Se il bit di controllo ACK è impostato, questo campo contiene il valore del prossimo numero di sequenza che il mittente del segmento si aspetta di ricevere. Una volta stabilita una connessione, questo viene sempre inviato.
Meccanismo di acknowledgment cumulativo:
- Un numero di acknowledgment X indica che tutti i byte fino a X (ma non includendo X) sono stati ricevuti
- X stesso non è incluso
Data Offset (Offset dati): 4 bit
Il numero di parole di 32 bit nell'intestazione TCP. Questo indica dove iniziano i dati. L'intestazione TCP (anche quella che include opzioni) è di una lunghezza multipla integrale di 32 bit.
Formula di calcolo:
Lunghezza intestazione (byte) = Data Offset × 4
Valore minimo: 5 (20 byte)
Valore massimo: 15 (60 byte)
Reserved (Riservato): 6 bit
Riservato per uso futuro. DEVE essere zero (MUST).
Control Bits (Bit di controllo): 6 bit (da sinistra a destra)
| Flag | Nome completo | Significato |
|---|---|---|
| URG | Urgent | Il campo puntatore urgente è valido |
| ACK | Acknowledgment | Il campo di acknowledgment è valido |
| PSH | Push | Funzione Push |
| RST | Reset | Resetta la connessione |
| SYN | Synchronize | Sincronizza i numeri di sequenza |
| FIN | Finish | Nessun altro dato dal mittente |
Combinazioni di flag:
SYN = 1: Richiesta di stabilimento di connessione
SYN + ACK = 1: Risposta di stabilimento di connessione
FIN = 1: Richiesta di terminazione di connessione
RST = 1: Terminazione anomala della connessione
PSH = 1: Invia immediatamente i dati al livello applicazione
URG = 1: Dati urgenti presenti
Window (Finestra): 16 bit
Il numero di ottetti di dati a partire da quello indicato nel campo di acknowledgment che il mittente di questo segmento è disposto ad accettare.
Controllo di flusso:
- Dimensione finestra = 0: Interrompi l'invio di dati
- Dimensione finestra > 0: Può inviare fino alla dimensione della finestra in byte
- Finestra massima: 65.535 byte (può essere estesa con l'opzione di scalatura della finestra)
Esempio:
ACK = 1000, Window = 5000
→ Può ricevere dati con numeri di sequenza 1000-4999 (5000 byte)
Checksum (Checksum): 16 bit
Il campo checksum è il complemento a uno a 16 bit della somma in complemento a uno di tutte le parole a 16 bit nell'intestazione e nel testo. Se un segmento contiene un numero dispari di ottetti di intestazione e testo da verificare, l'ultimo ottetto viene riempito a destra con zeri per formare una parola a 16 bit per scopi di checksum. Il riempimento non viene trasmesso come parte del segmento. Durante il calcolo del checksum, il campo checksum stesso viene sostituito con zeri.
Intestazione pseudo (Pseudo Header):
Il checksum copre anche un'intestazione pseudo di 96 bit prefissata concettualmente all'intestazione TCP. Questa intestazione pseudo contiene l'indirizzo di origine, l'indirizzo di destinazione, il protocollo e la lunghezza TCP. Questo fornisce a TCP protezione contro i segmenti instradati in modo errato.
+--------+--------+--------+--------+
| Source Address |
+--------+--------+--------+--------+
| Destination Address |
+--------+--------+--------+--------+
| zero | PTCL | TCP Length |
+--------+--------+--------+--------+
PTCL = 6 (numero di protocollo TCP)
TCP Length = lunghezza intestazione TCP + lunghezza dati (in ottetti)
Passaggi di calcolo del checksum:
def calculate_tcp_checksum(pseudo_header, tcp_header, data):
# 1. Impostare il campo checksum a 0
# 2. Combinare intestazione pseudo, intestazione TCP e dati
# 3. Sommare come parole a 16 bit
# 4. Aggiungere il riporto ai 16 bit inferiori
# 5. Prendere il complemento a uno
pass
Urgent Pointer (Puntatore urgente): 16 bit
Questo campo comunica il valore corrente del puntatore urgente come offset positivo dal numero di sequenza in questo segmento. Il puntatore urgente punta al numero di sequenza dell'ottetto che segue i dati urgenti. Questo campo viene interpretato solo nei segmenti con il bit di controllo URG impostato.
Casi d'uso:
- Segnali di interruzione Ctrl+C
- Comandi di interruzione Telnet
- Informazioni di controllo che richiedono elaborazione prioritaria
Esempio:
SEG.SEQ = 1000
URG Pointer = 10
→ I dati urgenti terminano al numero di sequenza 1010
→ I numeri di sequenza 1000-1009 sono dati urgenti
Options (Opzioni): variabile
Le opzioni possono occupare spazio alla fine dell'intestazione TCP e sono di una lunghezza multipla di 8 bit. Tutte le opzioni sono incluse nel checksum. Un'opzione può iniziare su qualsiasi confine di ottetto. Ci sono due formati per le opzioni:
Caso 1: Un singolo ottetto di option-kind Caso 2: Un ottetto di option-kind, un ottetto di option-length e gli ottetti di dati dell'opzione effettivi
L'option-length conta i due ottetti di option-kind e option-length così come gli ottetti di dati dell'opzione.
Importante: TCP DEVE implementare tutte le opzioni (MUST).
Opzioni attualmente definite
| Kind (ottale) | Length | Significato |
|---|---|---|
| 0 | - | Fine dell'elenco delle opzioni (End of Option List) |
| 1 | - | Nessuna operazione (No-Operation) |
| 2 | 4 | Dimensione massima del segmento (Maximum Segment Size) |
Dettagli delle opzioni
1. End of Option List (Fine dell'elenco delle opzioni)
+--------+
|00000000|
+--------+
Kind=0
- Questo codice di opzione indica la fine dell'elenco delle opzioni
- Questo potrebbe non coincidere con la fine dell'intestazione TCP secondo il campo Data Offset
- Usato alla fine di tutte le opzioni, non di ogni opzione
- Necessario solo se la fine delle opzioni non coincide altrimenti con la fine dell'intestazione TCP
2. No-Operation (Nessuna operazione)
+--------+
|00000001|
+--------+
Kind=1
- Questo codice di opzione PUÒ essere usato tra le opzioni (MAY)
- Ad esempio, per allineare l'inizio di un'opzione successiva su un confine di parola
- Non c'è garanzia che i mittenti useranno questa opzione
- I ricevitori DEVONO essere preparati a elaborare opzioni che non iniziano su un confine di parola (MUST)
3. Maximum Segment Size (Dimensione massima del segmento)
+--------+--------+---------+--------+
|00000010|00000100| max seg size |
+--------+--------+---------+--------+
Kind=2 Length=4
Maximum Segment Size Option Data: 16 bit
- Se questa opzione è presente, comunica la dimensione massima del segmento di ricezione al TCP che invia questo segmento
- Questo campo DEVE essere inviato solo nella richiesta di connessione iniziale (MUST) (cioè nei segmenti con il bit di controllo SYN impostato)
- Se questa opzione non viene usata, è consentita qualsiasi dimensione del segmento
Note MSS:
- MSS predefinito = 536 byte (predefinito Internet)
- MSS Ethernet comune = 1460 byte (1500 - 20 intestazione IP - 20 intestazione TCP)
- MSS si riferisce solo alla porzione dati, escludendo le intestazioni TCP/IP
Padding (Riempimento): variabile
Il riempimento dell'intestazione TCP viene utilizzato per garantire che l'intestazione TCP termini e i dati inizino su un confine a 32 bit. Il riempimento è composto da zeri.
3.2. Terminology (Terminologia)
Prima di poter discutere il funzionamento di TCP, dobbiamo introdurre una terminologia dettagliata. Il mantenimento di una connessione TCP richiede di ricordare diverse variabili. Concepiamo queste variabili come memorizzate in un record di connessione chiamato Blocco di controllo della trasmissione (Transmission Control Block, TCB).
Variabili memorizzate nel TCB
Tra le variabili memorizzate nel TCB ci sono:
- I numeri di socket locali e remoti
- La sicurezza e la priorità della connessione
- Puntatori ai buffer di invio e ricezione dell'utente
- Puntatori alla coda di ritrasmissione e al segmento corrente
- Diverse variabili relative ai numeri di sequenza di invio e ricezione
Variabili di sequenza di invio (Send Sequence Variables)
| Variabile | Nome completo | Descrizione |
|---|---|---|
| SND.UNA | Send Unacknowledged | Invio non riconosciuto (numero di sequenza non riconosciuto più vecchio) |
| SND.NXT | Send Next | Invio successivo (prossimo numero di sequenza da inviare) |
| SND.WND | Send Window | Finestra di invio |
| SND.UP | Send Urgent Pointer | Puntatore urgente di invio |
| SND.WL1 | Segment Sequence Number | Numero di sequenza del segmento usato per l'ultimo aggiornamento della finestra |
| SND.WL2 | Segment Acknowledgment Number | Numero di acknowledgment del segmento usato per l'ultimo aggiornamento della finestra |
| ISS | Initial Send Sequence Number | Numero di sequenza di invio iniziale |
Variabili di sequenza di ricezione (Receive Sequence Variables)
| Variabile | Nome completo | Descrizione |
|---|---|---|
| RCV.NXT | Receive Next | Ricezione successiva (prossimo numero di sequenza atteso) |
| RCV.WND | Receive Window | Finestra di ricezione |
| RCV.UP | Receive Urgent Pointer | Puntatore urgente di ricezione |
| IRS | Initial Receive Sequence Number | Numero di sequenza di ricezione iniziale |
Diagrammi dello spazio di sequenza
Spazio di sequenza di invio (Send Sequence Space)
1 2 3 4
----------|----------|----------|----------
SND.UNA SND.NXT SND.UNA
+SND.WND
1 - vecchi numeri di sequenza che sono stati riconosciuti
2 - numeri di sequenza di dati non riconosciuti
3 - numeri di sequenza consentiti per la nuova trasmissione di dati
4 - numeri di sequenza futuri che non sono ancora consentiti
Finestra di invio: La porzione dello spazio di sequenza etichettata 3 nel diagramma
Spazio di sequenza di ricezione (Receive Sequence Space)
1 2 3
----------|----------|----------
RCV.NXT RCV.NXT
+RCV.WND
1 - vecchi numeri di sequenza che sono stati riconosciuti
2 - numeri di sequenza consentiti per la nuova ricezione
3 - numeri di sequenza futuri che non sono ancora consentiti
Finestra di ricezione: La porzione dello spazio di sequenza etichettata 2 nel diagramma
Variabili di segmento corrente (Current Segment Variables)
Queste variabili sono derivate dai campi del segmento corrente:
| Variabile | Descrizione |
|---|---|
| SEG.SEQ | Numero di sequenza del segmento |
| SEG.ACK | Numero di acknowledgment del segmento |
| SEG.LEN | Lunghezza del segmento |
| SEG.WND | Finestra del segmento |
| SEG.UP | Puntatore urgente del segmento |
| SEG.PRC | Valore di priorità del segmento |
Stati della connessione (Connection States)
Una connessione progredisce attraverso una serie di stati durante la sua vita. Gli stati sono: LISTEN, SYN-SENT, SYN-RECEIVED, ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT e lo stato fittizio CLOSED.
Descrizioni degli stati
| Stato | Descrizione |
|---|---|
| LISTEN | Rappresenta l'attesa di una richiesta di connessione da qualsiasi TCP remoto e porta |
| SYN-SENT | Rappresenta l'attesa di una richiesta di connessione corrispondente dopo aver inviato una richiesta di connessione |
| SYN-RECEIVED | Rappresenta l'attesa di un acknowledgment di richiesta di connessione confermante dopo aver sia ricevuto che inviato una richiesta di connessione |
| ESTABLISHED | Rappresenta una connessione aperta, i dati ricevuti possono essere consegnati all'utente. Lo stato normale per la fase di trasferimento dati della connessione |
| FIN-WAIT-1 | Rappresenta l'attesa di una richiesta di terminazione della connessione dal TCP remoto, o un acknowledgment della richiesta di terminazione della connessione precedentemente inviata |
| FIN-WAIT-2 | Rappresenta l'attesa di una richiesta di terminazione della connessione dal TCP remoto |
| CLOSE-WAIT | Rappresenta l'attesa di una richiesta di terminazione della connessione dall'utente locale |
| CLOSING | Rappresenta l'attesa di un acknowledgment di richiesta di terminazione della connessione dal TCP remoto |
| LAST-ACK | Rappresenta l'attesa di un acknowledgment della richiesta di terminazione della connessione precedentemente inviata al TCP remoto (che include un acknowledgment della sua richiesta di terminazione della connessione) |
| TIME-WAIT | Rappresenta l'attesa di tempo sufficiente per essere sicuri che il TCP remoto abbia ricevuto l'acknowledgment della sua richiesta di terminazione della connessione |
| CLOSED | Rappresenta nessuno stato di connessione (stato fittizio, poiché rappresenta lo stato quando non esiste alcun TCB) |
Diagramma degli stati della connessione TCP
+---------+ ---------\ active OPEN
| CLOSED | \ -----------
+---------+<---------\ \ create TCB
| ^ \ \ snd SYN
passive OPEN | | CLOSE \ \
------------ | | ---------- \ \
create TCB | | delete TCB \ \
V | \ \
+---------+ CLOSE | \
| LISTEN | ---------- | |
+---------+ delete TCB | |
rcv SYN | | SEND | |
----------- | | ------- | V
+---------+ snd SYN,ACK / \ snd SYN +---------+
| |<----------------- ------------------>| |
| SYN | rcv SYN | SYN |
| RCVD |<-----------------------------------------------| SENT |
| | snd ACK | |
| |------------------ -------------------| |
+---------+ rcv ACK of SYN \ / rcv SYN,ACK +---------+
| -------------- | | -----------
| x | | snd ACK
| V V
| CLOSE +---------+
| ------- | ESTAB |
| snd FIN +---------+
| CLOSE | | rcv FIN
V ------- | | -------
+---------+ snd FIN / \ snd ACK +---------+
| FIN |<----------------- ------------------>| CLOSE |
| WAIT-1 |------------------ | WAIT |
+---------+ rcv FIN \ +---------+
| rcv ACK of FIN ------- | CLOSE |
| -------------- snd ACK | ------- |
V x V snd FIN V
+---------+ +---------+ +---------+
|FINWAIT-2| | CLOSING | | LAST-ACK|
+---------+ +---------+ +---------+
| rcv ACK of FIN | rcv ACK of FIN |
| rcv FIN -------------- | Timeout=2MSL -------------- |
| ------- x V ------------ x V
\ snd ACK +---------+delete TCB +---------+
------------------------>|TIME WAIT|------------------>| CLOSED |
+---------+ +---------+
Diagramma degli stati della connessione TCP
Eventi e transizioni di stato
Una connessione TCP progredisce da uno stato all'altro in risposta agli eventi. Gli eventi includono:
- Chiamate utente: OPEN, SEND, RECEIVE, CLOSE, ABORT, STATUS
- Segmenti in arrivo: In particolare quelli contenenti i flag SYN, ACK, RST e FIN
- Timeout: Timeout di ritrasmissione, timeout TIME-WAIT, ecc.
Nota: Il diagramma degli stati è solo un riepilogo e non può essere considerato come la specifica completa. Illustra solo i cambiamenti di stato, con i loro eventi scatenanti e azioni risultanti, ma non indica né le condizioni di errore né le azioni che non sono associate ai cambiamenti di stato.
3.3. Sequence Numbers (Numeri di sequenza)
Concetti di base
Un concetto fondamentale nel design di TCP è che ogni ottetto di dati inviato su una connessione TCP ha un numero di sequenza. Poiché ogni ottetto è sequenziato, ognuno di essi può essere riconosciuto. Il meccanismo di acknowledgment impiegato è cumulativo (cumulative) quindi un acknowledgment del numero di sequenza X indica che tutti gli ottetti fino a X (ma non includendo X) sono stati ricevuti.
Questo meccanismo consente un rilevamento diretto dei duplicati in presenza di ritrasmissione. La numerazione degli ottetti all'interno di un segmento è tale che il primo ottetto di dati immediatamente dopo l'intestazione è numerato con il valore più basso, e gli ottetti successivi sono numerati consecutivamente.
Spazio dei numeri di sequenza
Fatto chiave: Lo spazio effettivo dei numeri di sequenza è finito, sebbene molto grande. Questo spazio va da 0 a 2³² - 1.
Aritmetica modulare (Modulo Arithmetic): Poiché lo spazio è finito, tutta l'aritmetica che tratta i numeri di sequenza DEVE essere eseguita modulo 2³² (MUST). Questa aritmetica senza segno preserva la relazione dei numeri di sequenza quando ciclano da 2³² - 1 a 0 di nuovo. Ci sono alcune sottigliezze nell'aritmetica modulare del computer, quindi DOVREBBE essere prestata grande attenzione nella programmazione del confronto di tali valori (SHOULD).
Convenzione di notazione:
- Il simbolo
=<significa "minore o uguale" (modulo 2³²)
Confronti di numeri di sequenza
I confronti tipici di numeri di sequenza che TCP deve eseguire includono:
- Determinare che un acknowledgment si riferisce a un numero di sequenza inviato ma non ancora riconosciuto
- Determinare che tutti i numeri di sequenza occupati da un segmento sono stati riconosciuti (ad esempio, per rimuovere il segmento da una coda di ritrasmissione)
- Determinare che un segmento in arrivo contiene numeri di sequenza attesi (cioè, che il segmento "si sovrappone" alla finestra di ricezione)
Elaborazione dei numeri di sequenza di invio
In risposta all'invio di dati, il TCP riceverà acknowledgment. I seguenti confronti sono necessari per elaborare gli acknowledgment:
SND.UNA = numero di sequenza non riconosciuto più vecchio
SND.NXT = prossimo numero di sequenza da inviare
SEG.ACK = acknowledgment dal TCP ricevente (prossimo numero di sequenza atteso dal TCP ricevente)
SEG.SEQ = primo numero di sequenza di un segmento
SEG.LEN = il numero di ottetti occupati dai dati nel segmento (contando SYN e FIN)
SEG.SEQ+SEG.LEN-1 = ultimo numero di sequenza di un segmento
ACK accettabile (Acceptable ACK):
Un nuovo acknowledgment (chiamato "ACK accettabile") è uno per cui vale la seguente disuguaglianza:
SND.UNA < SEG.ACK ≤ SND.NXT
Un segmento nella coda di ritrasmissione è completamente riconosciuto se la somma del suo numero di sequenza e lunghezza è minore o uguale al valore di acknowledgment nel segmento in arrivo.
Esempio:
SND.UNA = 1000 (più vecchio non riconosciuto)
SND.NXT = 2000 (prossimo da inviare)
Riceve SEG.ACK = 1500
Verifica: 1000 < 1500 ≤ 2000 ✓ (accettabile)
Riceve SEG.ACK = 2500
Verifica: 1000 < 2500 ≤ 2000 ✗ (non accettabile, riconosce dati non inviati)
Elaborazione dei numeri di sequenza di ricezione
Quando si ricevono dati, sono necessari i seguenti confronti:
RCV.NXT = prossimo numero di sequenza atteso su un segmento in arrivo,
ed è il bordo sinistro o inferiore della finestra di ricezione
RCV.NXT+RCV.WND-1 = ultimo numero di sequenza atteso su un segmento in arrivo,
ed è il bordo destro o superiore della finestra di ricezione
SEG.SEQ = primo numero di sequenza occupato dal segmento in arrivo
SEG.SEQ+SEG.LEN-1 = ultimo numero di sequenza occupato dal segmento in arrivo
Test di accettabilità del segmento
Un segmento è giudicato accettabile solo se si trova all'interno della finestra. Il test dipende dalla lunghezza del segmento e dalla dimensione della finestra:
| Lunghezza segmento | Dimensione finestra | Test di accettabilità |
|---|---|---|
| 0 | 0 | SEG.SEQ = RCV.NXT |
| 0 | >0 | RCV.NXT ≤ SEG.SEQ < RCV.NXT+RCV.WND |
| >0 | 0 | non accettabile |
| >0 | >0 | RCV.NXT ≤ SEG.SEQ < RCV.NXT+RCV.WND o RCV.NXT ≤ SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND |
Spiegazione:
- Il primo test per segmenti di lunghezza zero può essere visto come il test di un segmento fantasma che inizia a SEG.SEQ e non occupa spazio di sequenza
- Se RCV.WND è zero, nessun dato è accettabile, ma i segmenti che non occupano spazio sono accettabili
Esempio di codice pratico:
def is_segment_acceptable(seg_seq, seg_len, rcv_nxt, rcv_wnd):
"""Verifica se il segmento è accettabile"""
if seg_len == 0:
if rcv_wnd == 0:
return seg_seq == rcv_nxt
else:
return rcv_nxt <= seg_seq < rcv_nxt + rcv_wnd
else: # seg_len > 0
if rcv_wnd == 0:
return False
else:
# L'inizio o la fine del segmento è all'interno della finestra
start_in_window = rcv_nxt <= seg_seq < rcv_nxt + rcv_wnd
end_in_window = rcv_nxt <= seg_seq + seg_len - 1 < rcv_nxt + rcv_wnd
return start_in_window or end_in_window
Selezione del numero di sequenza iniziale (ISN)
La scelta del numero di sequenza iniziale (ISN) è cruciale. Il TCP DEVE utilizzare un generatore ISN basato su clock per evitare che i segmenti di vecchie connessioni vengano confusi come parte di una nuova connessione (MUST).
Raccomandazioni per la generazione di ISN:
- ISN DOVREBBE essere incrementato di 1 ogni 4 microsecondi (SHOULD)
- ISN ha un periodo di circa 4,55 ore
- ISN per nuove connessioni DOVREBBE essere diverso da ISN di vecchie connessioni (SHOULD)
Considerazioni sulla sicurezza:
- Le implementazioni moderne DOVREBBERO usare algoritmi di generazione ISN più sicuri (SHOULD) (RFC 6528)
- Prevenire attacchi di predizione del numero di sequenza
Riepilogo dei concetti chiave
Struttura dell'intestazione TCP
- Intestazione fissa di 20 byte: Contiene tutti i campi essenziali
- Opzioni di lunghezza variabile: Fino a 40 byte
- Il checksum copre l'intestazione pseudo: Fornisce rilevamento di errori aggiuntivo
Meccanismo dei numeri di sequenza
- Numerazione per byte: Ogni byte di dati ha un numero di sequenza univoco
- Acknowledgment cumulativo: Il numero di acknowledgment indica che tutti i byte sotto di esso sono ricevuti
- Aritmetica modulo 2³²: Lo spazio dei numeri di sequenza è circolare
Stati della connessione
- 11 stati: Da CLOSED a ESTABLISHED e ritorno a CLOSED
- Guidato da eventi: Chiamate utente, arrivi di segmenti, timeout innescano transizioni di stato
- Handshake a tre vie: SYN → SYN-ACK → ACK
- Chiusura a quattro vie: FIN → ACK → FIN → ACK
Variabili TCB
- Variabili di invio: SND.UNA, SND.NXT, SND.WND, ecc.
- Variabili di ricezione: RCV.NXT, RCV.WND, ecc.
- Gestione della finestra: Nucleo del controllo di flusso
Sezione successiva: 3.4-3.9 Connection Management & Event Processing (Gestione della connessione ed elaborazione degli eventi) - Specifiche dettagliate per lo stabilimento della connessione, la chiusura, la comunicazione dei dati e l'elaborazione degli eventi