Transmission Control Protocol: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Collegamenti esterni: Aggiunto il template "FOLDOC"
m clean up, replaced: lingua=inglese → lingua=en
 
(13 versioni intermedie di 11 utenti non mostrate)
Riga 1:
{{F|internet|novembre 2017}}
{{citazione|Per il TCP due host sono una compagnia, tre sono una folla|J.F. Kurose, K.W. Ross - Internet e Reti di Calcolatori, un approccio top-down}}
 
In [[telecomunicazioni]] e [[informatica]] il '''Transmission Control Protocol''' ('''TCP''') è un [[protocollo di rete]] a [[rete a pacchetto|pacchetto]] di [[livello di trasporto]], appartenente alla [[suite di protocolli Internet]], che si occupa di ''controllo della [[trasmissione (telecomunicazioni)|trasmissione]]'' ovvero rendere ''affidabile'' la comunicazione dati in rete tra mittente e destinatario. Definito nella [[Request for Comments|RFC]] 9293, su di esso si appoggia gran parte delle [[applicazione (informatica)|applicazioni]] della rete [[Internet]], è presente solo sui [[terminale (telecomunicazioni)|terminali di rete]] ([[host]]) e non sui [[nodoNodo (informaticatelecomunicazioni)|nodi]] interni di [[commutazione (telecomunicazioni)|commutazione]] della [[rete di trasporto]], implementato come strato [[software]] di rete all'interno del [[sistema operativo]] di un host, e il terminale in trasmissione o in ricezione vi accede attraverso l'uso di opportune [[chiamata di sistema|chiamate di sistema]] definite nelle [[Application Programming Interface|API]] di sistema.
 
== Descrizione ==
Riga 9 ⟶ 10:
In linea con i dettami del livello di trasporto stabiliti dal [[modello ISO/OSI]] e con l'intento di superare il problema della mancanza di affidabilità e controllo della comunicazione sorto con l'interconnessione su vasta scala di [[rete locale|reti locali]] in un'unica grande [[Wide Area Network|rete geografica]], TCP è stato progettato e realizzato per utilizzare i servizi offerti dai protocolli di rete di livello inferiore ([[Internet Protocol|IP]] e protocolli di [[livello fisico]] e [[livello datalink]]) che definiscono efficacemente il [[modo di trasferimento]] sul [[canale (telecomunicazioni)|canale]] di comunicazione, ma che non offrono alcuna garanzia di affidabilità sulla consegna in termini di ritardo, perdita ed [[controllo di errore|errore]] dei [[pacchetto (reti)|pacchetti]] informativi trasmessi, sul [[controllo di flusso]] tra terminali e sul [[controllo della congestione]] di rete, supplendo quindi ai problemi di cui sopra e costruendo così un affidabile [[canale (telecomunicazioni)|canale di comunicazione]] tra due [[processo (informatica)|processi]] applicativi di rete. Il canale di comunicazione così costruito è composto da un flusso bidirezionale di [[byte]] a seguito dell'instaurazione di una [[connessione (informatica)|connessione]] agli estremi tra i due terminali in comunicazione. Inoltre alcune funzionalità di TCP sono vitali per il buon funzionamento complessivo di una rete IP. Sotto questo punto di vista TCP può essere considerato come un protocollo di rete che si occupa di costruire connessioni e garantire affidabilità su una rete IP sottostante che è sostanzialmente di tipo ''[[Best effort|best-effort]]''.
 
Il TCP nacque nel [[1970]] come frutto del lavoro di un gruppo di ricerca del [[Dipartimento della Difesa statunitense]]. I suoi punti di forza sono l'alta affidabilità e robustezza. La sua popolarità si deve anche ad una sua implementazione diffusa dalla [[Università della California, - Berkeley|Università di Berkeley]], rilasciata in California sotto forma di sorgenti (''TCP Berkeley''). Molte tuttavia sono le implementazioni e sviluppi che si sono succeduti nel tempo come evoluzioni e miglioramenti (es. ''TCP Tahoe'', ''TCP Reno'', ''TCP New Reno'').
 
=== Caratteristiche principali ===
Riga 20 ⟶ 21:
* TCP possiede funzionalità di [[controllo di flusso]] tra terminali in comunicazione e [[controllo della congestione]] sulla connessione, attraverso il meccanismo della [[finestra scorrevole]]. Questo permette di ottimizzare l'utilizzo dei buffer di ricezione/invio sui due end devices (controllo di flusso) e di diminuire il numero di segmenti inviati in caso di [[congestione (reti)|congestione]] della rete.
* TCP fornisce un servizio di [[multiplazione#Multiplazione nei protocolli di trasporto|multiplazione]] delle connessioni su un [[host]], attraverso il meccanismo dei numeri di [[Porta (reti)|porta]] del mittente.
 
=== Confronto con UDP ===
Le principali differenze tra TCP e [[User Datagram Protocol|UDP]] (''User Datagram Protocol''), l'altro principale protocollo di [[Livello di trasporto|trasporto]] della [[suite di protocolli Internet]], sono:
* TCP è un protocollo orientato alla connessione. Pertanto, per stabilire, mantenere e chiudere una connessione, è necessario inviare segmenti di servizio i quali aumentano l'overhead di comunicazione. Al contrario, UDP è [[connectionless|senza connessione]] ed invia solo i [[datagramma|datagrammi]] richiesti dal [[Livello applicazioni|livello applicativo]]; (nota: i pacchetti prendono nomi diversi a seconda delle circostanze a cui si riferiscono: segmenti (TCP) o datagrammi (UDP));
* UDP non offre nessuna garanzia sull'affidabilità della comunicazione, ovvero sull'effettivo arrivo dei segmenti, né sul loro ordine in sequenza in arrivo; al contrario il TCP, tramite i meccanismi di acknowledgement e di ritrasmissione su timeout, riesce a garantire la consegna dei dati, anche se al costo di un maggiore [[Overhead#Reti di calcolatori|overhead]] (raffrontabile visivamente confrontando la dimensione delle intestazioni dei due protocolli); TCP riesce altresì a riordinare i segmenti in arrivo presso il destinatario attraverso un campo del suo header: il sequence number;
* l'oggetto della comunicazione di TCP è un ''flusso di byte,'' mentre quello di UDP sono ''singoli datagrammi''.
 
L'utilizzo del protocollo TCP rispetto a [[User Datagram Protocol|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 (es. [[streaming]] in tempo reale, videogiochi multiplayer).
 
=== Segmento TCP ===
Riga 93 ⟶ 85:
** '''FIN''' - se impostato a 1 indica che l'host mittente del segmento vuole ''chiudere la connessione TCP'' aperta con l'host destinatario. Il mittente attende la conferma dal ricevente (con un FIN-ACK). A questo punto la connessione è ritenuta chiusa per metà: l'host che ha inviato FIN non potrà più inviare dati, mentre l'altro host ha il canale di comunicazione ancora disponibile. Quando anche l'altro host invierà il pacchetto con FIN impostato, la connessione, dopo il relativo FIN-ACK, sarà considerata completamente chiusa.
* '''Window size''' [16 bit] - Indica la dimensione della ''finestra di ricezione'' dell'host mittente, cioè il numero di byte che il mittente è in grado di accettare a partire da quello specificato dall'acknowledgment number.
* '''[[Checksum]]''' [16 bit] - Campo di controllo utilizzato per la verifica della validità del segmento. È ottenuto facendo il complemento a 1 della somma [[complemento a uno]] a 16 bit dell'intero header TCP (con il campo checksum messo a zero), dell'intero payload, con l'aggiunta di uno pseudo header composto da: indirizzo IP sorgente (32bit),indirizzo IP destinazione (32bit), un byte di zeri, un byte che indica il protocollo e due byte che indicano la lunghezza del pacchetto TCP (header + dati).
* '''Urgent pointer''' [16 bit] - Puntatore a dato urgente, ha significato solo se il flag URG è impostato a 1 ed indica lo scostamento in byte a partire dal ''Sequence number'' del byte di dati urgenti all'interno del flusso.
* '''Options''' - Opzioni (facoltative) per usi del protocollo avanzati.
* '''Data''' - rappresenta il carico utile o ''payload'' da trasmettere cioè la [[Protocol Data Unit|PDU]] proveniente dal livello superiore.
 
=== Confronto con UDP ===
Le principali differenze tra TCP e [[User Datagram Protocol|UDP]] (''User Datagram Protocol''), l'altro principale protocollo di [[Livello di trasporto|trasporto]] della [[suite di protocolli Internet]], sono:
* TCP è un protocollo orientato alla connessione. Pertanto, per stabilire, mantenere e chiudere una connessione, è necessario inviare segmenti di servizio i quali aumentano l'overhead di comunicazione. Al contrario, UDP è [[connectionless|senza connessione]] ed invia solo i [[datagramma|datagrammi]] richiesti dal [[Livello applicazioni|livello applicativo]]; (nota: i pacchetti prendono nomi diversi a seconda delle circostanze a cui si riferiscono: segmenti (TCP) o datagrammi (UDP));
* UDP non offre nessuna garanzia sull'affidabilità della comunicazione, ovvero sull'effettivo arrivo dei segmenti, né sul loro ordine in sequenza in arrivo; al contrario il TCP, tramite i meccanismi di acknowledgement e di ritrasmissione su timeout, riesce a garantire la consegna dei dati, anche se al costo di un maggiore [[Overhead#Reti di calcolatori|overhead]] (raffrontabile visivamente confrontando la dimensione delle intestazioni dei due protocolli); TCP riesce altresì a riordinare i segmenti in arrivo presso il destinatario attraverso un campo del suo header: il sequence number;
* l'oggetto della comunicazione di TCP è un ''flusso di byte,'' mentre quello di UDP sono ''singoli datagrammi''.
 
L'utilizzo del protocollo TCP rispetto a [[User Datagram Protocol|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 (es. [[streaming]] in tempo reale, videogiochi [[Multigiocatore|multiplayer]]).
 
== Connessione ==
Riga 102 ⟶ 103:
 
=== Apertura di una connessione - ''Three-way handshake'' ===
[[File:Tcp-handshake.svg|rightthumb|300pxupright=1.2|Three-way handshake]]
 
La procedura utilizzata per instaurare in modo affidabile una [[connessione (informatica)|connessione]] TCP tra due host è chiamata ''three-way handshake'' (stretta di mano in 3 passaggi), indicando la necessità di scambiare 3 messaggi tra host mittente e host ricevente affinché la connessione sia instaurata correttamente.
Consideriamo ad esempio che l'host A intenda aprire una connessione TCP con l'host B; i passi da seguire quindi sono:
Riga 118 ⟶ 120:
 
=== Chiusura di una connessione - ''doppio two-way handshake'' ===
[[File:FIN a 3 vie.jpg|alt=3-way handshake per terminare la connessione|miniaturathumb|upright=1.2|Chiusura con 3-way handshake]]
[[File:TCP-Chiusura-a-4-vie.png|rightthumb|200pxupright=1.2|Chiusura a 4 vie]]
 
Dopo che è stata stabilita, una connessione TCP non è considerata una singola connessione bidirezionale, ma piuttosto come l'interazione di due connessioni monodirezionali; pertanto, ognuna delle parti dovrebbe terminare la ''propria'' connessione. Possono esistere anche ''connessioni chiuse a metà'', in cui solo uno dei due host ha chiuso la connessione poiché non ha più nulla da trasmettere, ma può (e deve) ancora ricevere i dati dall'altro host.
 
Riga 139 ⟶ 142:
=== Server e Client ===
I due processi che comunicano attraverso una connessione TCP hanno ruoli diversi:
 
* Il processo che avvia una nuova connessione TCP è detto [[client]], ed invia una richiesta di connessione verso una determinata porta.
* Affinché la connessione venga stabilita, su quella porta deve esserci un processo [[server]] "in ascolto", che accetta di stabilire una connessione TCP.
Riga 156 ⟶ 158:
* se il numero di sequenza ricevuto è quello atteso invia direttamente il carico utile del segmento al processo di livello applicativo e libera i propri [[buffer]].
* se il numero di sequenza ricevuto è maggiore di quello atteso deduce che uno o più segmenti ad esso precedenti sono andati persi, ritardati dal livello di rete sottostante o ancora in transito sulla rete. Pertanto, memorizza temporaneamente in un buffer il carico utile del segmento ricevuto fuori sequenza per poterlo consegnare al processo applicativo solo dopo aver ricevuto e consegnato anche tutti i segmenti precedenti non ancora pervenuti passanti anch'essi per il buffer, aspettandone l'arrivo fino ad un tempo limite prefissato (''time-out''). All'istante di consegna del blocco ordinato di segmenti tutto il contenuto del buffer viene liberato. 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 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 dunque scartato. Questo permette di realizzare l{{'}}'''eliminazione dei duplicati di rete'''.
 
=== Riscontro dei pacchetti e ritrasmissione ===
Riga 163 ⟶ 165:
In particolare il protocollo TCP adotta la politica di '''Conferma cumulativa''', ovvero l'arrivo di numero di riscontro indica al TCP trasmittente che il ricevente ha ricevuto e correttamente inoltrato al proprio processo applicativo il segmento avente numero di sequenza pari al numero di riscontro indicato (-1) ed anche ''tutti i segmenti ad esso precedenti''. Per tale motivo TCP lato trasmittente mantiene temporaneamente in un buffer una copia di tutti i dati inviati, ma non ancora riscontrati: quando questi riceve un numero di riscontro per un certo segmento, deduce che tutti i segmenti precedenti a quel numero sono stati ricevuti correttamente liberando il proprio buffer dai dati. La dimensione massima dei pacchetti riscontrabili in maniera cumulativa è specificata dalle dimensioni della cosiddetta [[finestra scorrevole]].
 
Per evitare tempi di attesa troppo lunghi o troppo corti per ciascun segmento inviato TCP lato trasmittente avvia un [[Timer (informatica)|timer]], detto ''timer di ritrasmissione RTO'' (Retransmission Time Out): se questi non riceve un ACK di riscontro per il segmento inviato prima che il timer [[SCADA|scada]], TCP assume che tutti i segmenti trasmessi a partire da questo siano andati persi e quindi procede alla ritrasmissione.
 
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 ARQ|Go-Back-N]] (vai indietro di N segmenti); l'alternativa, ovvero progettare il protocollo in modo tale che solo i pacchetti effettivamente persi vengano ritrasmessi, è detta [[Selective repeat ARQ|Selective Repeat]] (ripetizione selettiva); l'utilizzo però di alcuni campi permette l'utilizzo della ripetizione selettiva.
 
I numeri di riscontro e i relativi timer di ritrasmissione permettono quindi di realizzare la '''consegna affidabile''', ovvero di garantire che tutti i dati inviati siano comunque consegnati nel caso in cui qualche pacchetto possa essere perso nel transito attraverso la rete (controllo di errore in termini di riscontro di trasmissione).
 
=== Controllo di flusso ===
{{vedi anche|Controllo di flusso}}
{{vedi anche|Controllo di flusso}}L'affidabilità della comunicazione in TCP è garantita anche dal cosiddetto [[controllo di flusso]] ovvero far in modo che il flusso di dati in trasmissione non superi le capacità di ricezione ovvero di memorizzazione del ricevente con perdita di pacchetti e maggior peso e [[Latenza|latenze]] nelle successive richieste di ritrasmissione. Viene attuato attraverso la specifica da parte del destinatario di un opportuno campo noto come RCV_WND ([[finestra di ricezione]]), variabile dinamica (ossia dipendente dallo spazio disponibile) che specifica il numero massimo di segmenti ricevibili dal destinatario. Definito:
 
{{vedi anche|Controllo di flusso}}L'affidabilità della comunicazione in TCP è garantita anche dal cosiddetto [[controllo di flusso]] ovvero far in modo che il flusso di dati in trasmissione non superi le capacità di ricezione ovvero di memorizzazione del ricevente con perdita di pacchetti e maggior peso e [[Latenza|latenze]] nelle successive richieste di ritrasmissione. Viene attuato attraverso la specifica da parte del destinatario di un opportuno campo noto come RCV_WND ([[finestra di ricezione]]), variabile dinamica (ossia dipendente dallo spazio disponibile) che specifica il numero massimo di segmenti ricevibili dal destinatario. Definito:
* ''LastByteRead'': numero dell'ultimo byte nel flusso di dati che il processo applicativo in B ha letto dal buffer
* ''LastByteRcvd:'' numero dell'ultimo byte nel flusso di dati proveniente dalla rete che è stato copiato nel buffer di ricezione RcvBuffer precedentemente allocato
Riga 203 ⟶ 206:
=== Controllo di congestione ===
{{vedi anche|Controllo della congestione in TCP}}
 
Infine l'ultimo tipo di controllo effettuato da TCP per garantire affidabilità alla comunicazione è il cosiddetto [[controllo della congestione]] ovvero far in modo che si limitino il più possibile fenomeni di [[congestione (reti)|congestione]] all'interno della rete per eccessivo [[traffico (telecomunicazioni)|traffico]] sui [[dispositivi di rete]] con perdita di pacchetti in transito e maggior peso e [[latenza|latenze]] nelle successive richieste di ritrasmissione, modulando nel tempo la quantità di dati in trasmissione in funzione dello stato interno di congestione. La particolarità di tale controllo è che viene effettuato agendo sulla trasmissione agli estremi cioè sui terminali di rete e non attraverso la commutazione interna alla rete grazie alle informazioni deducibili dal terminale stesso sullo stato della trasmissione dei pacchetti. Nello specifico, una volta "stimato" lo stato di congestione interno della rete avendo scelto come parametro di riferimento la perdita di pacchetti trasmessi desunta dai mancati ACK di riscontro dei pacchetti stessi, tale controllo viene poi attuato attraverso la definizione da parte del mittente di un opportuno campo noto come C_WND ([[finestra di congestione]]) la quale assegna, dinamicamente nel tempo, il numero massimo di segmenti da trasmettere al destinatario.
 
== I timer del TCP ==
=== Timer di ritrasmissione (RTO->RetrasmissionRetransmission Time Out) ===
Come descritto sopra, il timer di ritrasmissione serve a verificare che ciascun segmento trasmesso venga riscontrato.
 
Riga 217 ⟶ 221:
 
=== Timer di keepalive ===
La [[Request for Comments|RFC]] 793 che definisce il protocollo TCP non prevede particolari azioni da intraprendere quando non ci sono dati da trasmettere sulla connessione. 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.
Riga 224 ⟶ 228:
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.
 
== Vulnerabilità ==
Il protocollo TCP viene progettato per la prima volta come strumento da utilizzare in reti chiuse e private, gestite da enti o università che quindi non si pongono il problema di garantirne la sicurezza; funzionalità come la sicurezza, l'integrità e l'autenticità della comunicazione tra due host vengono relegate a [[Modello OSI|livelli di rete]] superiori. Esistono perciò diverse soluzioni implementative per ovviare a questa mancanza. I risultati di una valutazione completa sulla sicurezza di questo protocollo, insieme a possibili soluzioni, sono stati pubblicati nel 2009<ref>{{Cita web|url=https://www.cpni.gov.uk/Docs/tn-03-09-security-assessment-TCP.pdf |titolo=Security Assessment of the Transmission Control Protocol (TCP) |accesso=23 dicembre 2010 |urlmorto=bot: unknown |urlarchivio=https://web.archive.org/web/20090306052826/http://www.cpni.gov.uk/Docs/tn-03-09-security-assessment-TCP.pdf }}</ref>, e sono attualmente studiati da [[IETF]]. Di seguito vengono riportate e illustrate genericamente le principali e più diffuse metodologie per condurre un attacco a [[livello di trasporto]] su una comunicazione che si appoggia a questo protocollo.
 
=== Denial of service ===
{{vedi anche|Denial of service}}
 
Un attacco [[Denial of service|DoS]] ha come scopo quello di mandare in tilt un server occupando tutte le risorse a sua disposizione. Questo obiettivo può essere raggiunto attraverso diverse tecniche.
Un primo modo consiste nell'utilizzare un metodo che prende il nome di [[SYN flood]]. Per aprire una connessione TCP, come già detto, è necessario il meccanismo del Three-Way Handshake. Se il client che ha chiesto di instaurare una connessione non risponde al server con il pacchetto di ACK dopo che ha ricevuto il relativo SYN-ACK, il server rimarrà in attesa. Utilizzando tecniche di [[IP spoofing]] e inviando ripetutamente pacchetti SYN appositamente assemblati e non il corrispettivo ACK, un singolo host può arrivare a consumare grandi quantità di risorse sul server che continuerà a tenere in memoria informazioni su connessioni fittizie. Possibili soluzioni a questo problema sono l'introduzione di timer al termine del quale il server cancellerà la connessione o l'introduzione di un meccanismo chiamato [[SYN cookies]], anche se quest'ultimo porta con sé un proprio insieme di vulnerabilità. Un altro attacco che mira a consumare tutte le risorse di un sistema è l'utilizzo di software di tipo [[Sockstress]], tale eventualità può facilmente essere scongiurata applicando politiche di gestione delle risorse del sistema.
 
=== Connection hijacking ===
Come detto precedentemente, ogni pacchetto TCP è identificato da un numero di sequenza che lo individua univocamente all'interno della comunicazione. Un utente malintenzionato che è in grado di intercettare una sessione TCP e di reindirizzare i pacchetti può disattivare una connessione TCP. Per farlo, l'attaccante apprende il successivo numero di sequenza della comunicazione in corso e crea un falso pacchetto che assomigli a quello successivo del flusso e lo invia al destinatario al posto dell'originale. Quando il destinatario riceve il pacchetto falso, lo accetta per via del numero di sequenza corretto, ma riscontrando una lunghezza del pacchetto diversa da quella prevista, perde la sincronizzazione con l'host sorgente e chiude quindi la connessione. Questo procedimento può essere combinato con tecniche di [[ARP spoofing]] o di modifica del [[protocollo di routing]] per gestire il controllo del flusso di pacchetti, in modo da ottenere un controllo permanente sulla connessione TCP.
Attuare questo tipo di attacco non era difficile prima della RFC 1948, quando il numero di sequenza era facilmente prevedibile grazie a tecniche di IP Spoofing. Questo è il motivo per cui, ad oggi, il numero di sequenza iniziale viene scelto casualmente.
 
=== TCP Veto ===
Un utente malintenzionato che, oltre al numero di sequenza, è in grado di predire anche la dimensione del pacchetto successivo può indurre il destinatario ad accettarne uno dannoso senza interrompere la connessione esistente. L'attaccante genera un pacchetto con il numero di sequenza e con una dimensione del payload del successivo segmento atteso, avendo però completa libertà sui dati da inserire all'interno. Una volta ricevuto questo pacchetto il destinatario lo accetta quindi senza problemi. Quando il pacchetto legittimo viene ricevuto, viene scartato dal destinatario poiché ne ha già ricevuto uno con quel numero di sequenza in quella connessione, come un normale pacchetto duplicato. Da ciò deriva il termine che descrive questo attacco: il pacchetto legittimo riceve il veto dal pacchetto dannoso. A differenza del Connection hijacking, la connessione non viene mai persa e la comunicazione continua normalmente dopo che il pacchetto dannoso viene accettato. TCP Veto dà all'attaccante un controllo minore sulla comunicazione, ma rende l'attacco particolarmente difficile da individuare. Il traffico che richiede il Connection hijacking per il controllo della connessione in questo caso non avviene, evitando di attirare attenzioni indesiderate. L'unica prova di un avvenuto TCP Veto è un singolo pacchetto duplicato, un evento normale in TCP. Il mittente del pacchetto legittimo invece non avrà alcuna percezione dell'avvenuto attacco.
 
=== TCP Reset ===
Nei pacchetti TCP è presente un flag nell'header, chiamato [[RST (TCP)|RST]]. In molti pacchetti questo bit è impostato a zero e non ha nessun effetto, se invece è impostato a uno, indica al destinatario che può interrompere immediatamente la connessione e quindi liberare tutte le risorse occupate, dato che il mittente non ha intenzione di inviare ulteriori pacchetti. Un utente malintenzionato può quindi ascoltare la conversazione tra due host, e inviare a uno o a entrambi un pacchetto con il flag RST impostato a uno. Questo metodo consente di interrompere connessioni TCP in modo veloce e senza lasciare particolari tracce. L'attaccante deve comunque camuffare il pacchetto modificando l'indirizzo IP di provenienza, per poter ingannare l'host.
 
== Note ==
<references />
 
== Bibliografia ==
* {{IETF|793|Transmission Control Protocol}}
* {{cita libro|autore=W. Richard Stevens|autore2=Kevin R. Fall|titolo=TCP/IP Illustrated: The Protocols|volume=1|edizione=2|editore=Addison-Wesley|anno=2012|lingua=en|ISBN=9780321336316}}
 
== Voci correlate ==
Riga 258 ⟶ 267:
 
== Altri progetti ==
{{interprogetto|preposizione=sul|wikt=TCP|wikt_etichetta=TCP}}
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{FOLDOC}}
* {{cita webIETF|url=https://tools.ietf.org/html/rfc07939293|titolo=RFC 793 - Transmission Control Protocol Specifications|lingua=en(TCP)}}
* {{cita web|url=http://www.rfc.altervista.org/rfctradotte/rfc793_tradotta.txt|titolo=TraduzioneProtocollo indi italianoControllo dell'RFCdella Trasmissione (TCP)|mese=settembre|anno=1981}}
* {{cita web|url=http://www.answersthatwork.com/Download_Area/ATW_Library/Networking/Network__2-List_of_Common_TCPIP_port_numbers.pdf|titolo=Porte di comunicazione TCP|lingua=en|urlmorto=sì|accesso=11 novembre 2011|dataarchivio=22 novembre 2011|urlarchivio=https://web.archive.org/web/20111122144159/http://www.answersthatwork.com/Download_Area/ATW_Library/Networking/Network__2-List_of_Common_TCPIP_port_numbers.pdf}}
* {{cita webIETF|url=https://tools.ietf.org/html/rfc19481948|titolo=RFC 1948 - Defending Against Sequence Number Attacks|lingua=en}}
* {{cita web|url=http://www.cpni.gov.uk/Docs/tn-03-09-security-assessment-TCP.pdf|titolo=Security Assessment of the Transmission Control Protocol (TCP)|lingua=en|accesso=10 novembre 2017|urlarchivio=https://web.archive.org/web/20090306052826/http://www.cpni.gov.uk/Docs/tn-03-09-security-assessment-TCP.pdf|urlmorto=sì}}