2011-01-29 16 views
13

Mi piacerebbe conoscere il costo generale della creazione di una nuova connessione, rispetto a UDP. So che TCP richiede uno scambio iniziale di pacchetti (l'handshake a 3 vie). Quali sarebbero gli altri costi? Ad esempio c'è una sorta di magia nel kernel necessaria per impostare i buffer, ecc.?Overhead generale della creazione di una connessione TCP

La ragione per cui sto chiedendo è che posso mantenere aperta una connessione esistente e riutilizzarla secondo necessità. Tuttavia, se c'è un piccolo sovraccarico, la ricomposizione ridurrebbe la complessità.

+2

Penso che la latenza della stretta di mano sia il costo più significativo. – CodesInChaos

+0

Ahh, buon punto. La connessione non è considerata aperta fino al completamento dell'intero handshake. Tuttavia, una volta aperto, è possibile eseguire lo streaming dei dati senza attendere l'ack su ogni segmento (a causa della finestra scorrevole) – seand

+0

non c'è "ack su ogni segmento". – EJP

risposta

6

Rispetto alla latenza dello scambio di pacchetti, tutti gli altri costi come i tempi di configurazione del kernel sono insignificanti.

9

Una volta che un pacchetto UDP è stato scaricato sul filo, lo stack del protocollo UDP è libero di dimenticarsene completamente. Con TCP, c'è almeno il dettaglio della connessione (sorgente/destinazione e IP sorgente/dest), il numero di sequenza, la dimensione della finestra per la connessione, ecc ... Non è un'enorme quantità di dati, ma si aggiunge rapidamente a un server occupato con molte connessioni.

E poi c'è anche l'handshake a 3 vie. Alcuni braindead (e/o sistemi maligni) possono abusare del processo (cercare "syn flood"), o semplicemente rilasciare la connessione alla loro estremità, lasciando il sistema in attesa di una risposta o di un avviso ravvicinato che non arriverà mai. Il lato positivo è che con TCP il sistema farà del suo meglio per assicurarsi che il pacchetto arrivi dove deve. Con UDP, non ci sono garanzie.

4

OPZIONE 1: Il costo generale della creazione di una connessione TCP sono:

  1. Creare connessione socket
  2. Invia dati
  3. Abbattere connessione socket

Fase 1: Richiede uno scambio di pacchetti, quindi è ritardato a & dalla latenza della rete più il tempo di servizio del server di destinazione. Nessun utilizzo significativo della CPU su entrambi i box è coinvolto.

Passaggio 2: dipende dalla dimensione del messaggio.

Passaggio 3: IIRC, invia semplicemente un pacchetto 'closing now', senza attendere l'ack di destinazione, quindi nessuna latenza coinvolta.

OPZIONE 2: Costi di UDP: *

  1. creare l'oggetto UDP
  2. Invia dati
  3. Chiudi Oggetto UDP

Fase 1: richiede una configurazione minima, nessun problema di latenza , molto veloce.

Passaggio 2: prestare attenzione al formato, non è possibile ritrasmettere in UDP poiché non interessa se il pacchetto è stato ricevuto da qualcuno o meno. Ho sentito che più grande è il messaggio, maggiore è la probabilità che i dati vengano ricevuti danneggiati e che una regola generale è che perderai una certa percentuale di messaggi oltre i 20 MB.

Passaggio 3: lavoro minimo, tempo minimo.

OPZIONE 3: Utilizzo ZeroMQ Invece

si sta confrontando TCP ad UDP con l'obiettivo di ridurre il tempo di riconnessione. C'È UN BEL COMPROMESSO: zoccoli ZeroMQ.

ZMQ consente di impostare un socket di pubblicazione in cui non interessa se qualcuno ascolta (come UDP) e dispone di più listener su quel socket. Questo NON è un socket UDP, è un'alternativa a entrambi questi protocolli.

Vedere: ZeroMQ.org per dettagli.

È molto veloce e tollerante ai guasti e sta aumentando l'utilizzo nel settore finanziario per tali motivi.

+2

Non sono sicuro di dove hai ottenuto il numero di 20 MB per UDP. In IPV4, la dimensione massima del messaggio è 65.507 byte (intestazione UDP 65.535 - 8 byte - intestazione IP 20 byte), secondo Wikipedia. Forse stai assumendo IPV6? – Joe

+0

Non mi riferivo alla dimensione del pacchetto, ma alla dimensione del messaggio. Inoltre, il numero è un euristico per sentito dire. La situazione: su una rete di datacenter interna a velocità ragionevolmente alta via UDP, in qualsiasi serie di N messaggi di dimensione 20 MB, il 5% di N (N * 0.05) di essi era corrotto. Questo era un firehose con dati HUGE uno-> diversi, con diversi set di caselle che ascoltavano i messaggi indirizzati a loro. Dispiace per la confusione. Il suo messaggio (del mio collega) era che se avesse usato pezzi più grandi, una percentuale più alta avrebbe avuto errori e non avrebbe inviato nulla. Aveva un backchannel per la richiesta di re-invia. –

+2

UDP non ha il concetto di un messaggio più grande di un singolo datagramma a 64k, perché il campo dimensione nell'intestazione UDP è 16 bit (https://tools.ietf.org/html/rfc768). Di solito è più grande della MTU del livello di trasporto sottostante, quindi l'IP probabilmente frammenterà e riassemblerà un pacchetto da 64k. Se un frammento viene perso, l'intero pacchetto viene perso, quindi non è consigliabile superare la MTU. Un messaggio da 20 MB richiede un protocollo di livello superiore su UDP o qualcos'altro come TCP. Se hai un riferimento per i messaggi più grandi, sono interessato a leggerlo. – Joe

Problemi correlati