Perché la creazione di una nuova connessione TCP è considerata costosa?


9

Non capisco perché la creazione di nuove connessioni TCP sia considerata un'attività costosa. Fondamentalmente l'impostazione di una nuova connessione si riferisce all'esecuzione dell'handshake a 3 vie di TCP. Quindi questo è l'invio di due pacchetti e la ricezione di uno. Considerando che seguiranno migliaia di pacchetti (dati), la stretta di mano non può essere la parte costosa. Può esso?


Forse a causa dell'utilizzo della CPU e della memoria delle connessioni?
joeqwerty,

@joeqwerty Capisco che una nuova connessione TCP di solito significa anche creare un nuovo processo / thread sul server, ad esempio, ma non a causa di TCP, ma a causa dell'applicazione.

Se seguono migliaia di pacchetti di dati, gli handshak non sono la parte costosa. Ma perché non utilizzare una nuova connessione TCP per ogni blocco di dati? Perché la creazione di una nuova connessione TCP è costosa. Ecco perché stabilisci una connessione e poi la usi per migliaia di blocchi di dati.
David Schwartz,

1
Considera anche che la creazione di una nuova connessione potrebbe non essere limitata al solo handshake TCP. Ad esempio SSL aggiunge molte negoziazioni di dettagli di autenticazione e crittografia.
Zoredache,

Risposte:


10

In generale, credo che l'apertura di una connessione TCP sia considerata costosa rispetto alla possibilità di riutilizzare connessioni già aperte mantenendola aperta. Hai ragione, l'apertura di una connessione richiederà solo 3 pacchetti / turni, ma quel tempo - 3 volte il tuo RTT - è di gran lunga superiore al costo del riutilizzo di una connessione già aperta, che è molto più vicina a 0. La disparità cresce ancora più velocemente se tu stai aprendo e chiudendo frequentemente le connessioni.

Hai certamente ragione però, rispetto al numero di turni che vedrai come l'applicazione "fa la cosa", quei 3 pacchetti possono sembrare piuttosto piccoli, ma di nuovo, dipende da come vuoi confrontare le opzioni E come si comporta l'applicazione / quante volte prevedi di aprire una connessione.

Modifica Se stiamo parlando di UDP vs TCP, Cheekaleek qui è corretto al 100% - l'overhead di è enorme a lungo termine rispetto alle operazioni senza connessione di UDP


1
Un buon esempio che ho visto in una traccia di pacchetti: una connessione MySQL riutilizzata può invertire le query in 2-5ms. Una serie di query ElasticSearch trasforma le query in 17-25ms, la maggior parte delle volte era nella configurazione della connessione (inclusa la ricerca DNS iniziale).
sysadmin1138

2

È certamente più sovraccarico che inviare un pacchetto UDP e non preoccuparsi di ciò che accade oltre.

TCP viene inoltre fornito con più dati di intestazione e mantiene lo stato della connessione, che consumerà risorse.

Quindi sì, rispetto a UDP, TCP è più costoso, ma costoso è un termine relativo.

"Le connessioni TCP sono le migliori amiche di una ragazza ???"


5
"TCP connections are a girl's best friend???" No, non lo sono. Ho ricevuto una ragazza da migliaia di persone per il suo compleanno e non ha fatto altro che smettere di restituire le mie e-mail. :(
HopelessN00b

2

Non si tratta solo di inviare e ricevere pacchetti. È necessario allocare memoria aggiuntiva e aggiornare almeno le tabelle di stato della rete ad ogni passaggio fino a quando non viene stabilita la sessione. Per non parlare di eventuali controlli di sicurezza aggiuntivi che possono essere eseguiti (route spoof protection, ecc.).

Usando solo alcuni numeri di esempio (perché non stiamo parlando di alcun sistema operativo specifico) se un pacchetto per una sessione stabilita ha un costo della CPU di 1 unità, il costo di una nuova sessione può essere 10x o 100x che costano il numero di operazioni eseguite. La maggior parte dei firewall hardware con cui ho lavorato è in grado di gestire un ordine di grandezza meno nuove connessioni al secondo di quante siano in grado di gestire sessioni stabilite.

Spesso non è un grosso problema, soprattutto perché un SYN-SYN / ACK-ACK si verifica in millisecondi, ma per i sistemi di grandi dimensioni con molti clienti nuove sessioni possono trasformarsi in un sovraccarico significativo .


2

La quantità o il tipo di traffico conta molto meno del codice associato all'allocazione effettiva della memoria e al rilevamento associato delle informazioni sullo stato. Se vuoi avere un'idea molto approssimativa di ciò che ciò implica, dai un'occhiata alla quantità di codice nel kernel Linux associato a TCP rispetto a quello associato a UDP o ICMP. Un confronto incredibilmente approssimativo mostra che TCP richiede qualcosa come 10 volte il numero di righe di codice trovate in UDP.

Nella rete IP la quantità di manutenzione statale richiesta è una delle determinanti più importanti della scalabilità. Per gli endpoint TCP questo è espresso non solo in SYN / ACK ma anche nel mantenimento continuo di finestre scorrevoli, numeri di sequenza, gestione del buffer e azioni QoS, ecc. Scopri la complessità di FSM per tcp e considera la mancanza intrinseca dello stesso in UDP ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.