Non accettare semplicemente una risposta positiva "sì o no, perché ho detto così", in quanto potresti aprirti a dover combattere un sacco di problemi con UDP che in realtà non devi affrontare.
Nessuna delle altre risposte qui afferma il modo ovvio per dimostrarlo.
Prendi alcuni fatti semplici
- Un'intestazione IP è di 20 byte, indipendentemente dal protocollo utilizzato.
- Le intestazioni UDP sono 4 byte
- Le intestazioni TCP sono 20 byte
Quindi ogni volta che invii un messaggio di 1 byte lungo la linea hai effettivamente inviato 25 o 41 byte a seconda del protocollo supponendo che sia necessaria anche un'intestazione IP.
fonti:
Il mio consiglio
Prendi la tua situazione in cui hai bisogno dell'interazione con il server client, stima il numero di client, quindi fai i calcoli in base ai dati che effettivamente invii tra i 2.
Un esempio
Diciamo che invio 10 messaggi da 1 byte ciascuno per aggiornamento nel mio gioco e sto aggiornando circa 60 fps, quindi ho bisogno di inviare 60 * 10 = 600 byte al secondo dei dati dei messaggi effettivi + le intestazioni pertinenti.
Ora, a seconda del gioco, potrei inviarlo tutto come un singolo messaggio, quindi il mio overhead dal livello TCP è di soli 40 byte (in realtà un costo su UDP di 20 byte al secondo), non avere quel sovraccarico è un costo potenziale di 600 byte ( perché potrebbe essere necessario inviare nuovamente l'intero flusso di messaggi).
Se tuttavia è di vitale importanza che ogni messaggio sia inviato da solo nell'istante in cui è pronto per essere inviato, ho 600 messaggi (anche 600 byte) + 40 * 600 = 24k di overhead TCP o ~ 14k di overhead UDP al secondo + 600 byte di dati dei messaggi.
Ancora una volta, poniamo le domande: quanto sono vitali quei messaggi, quanto sono frequenti e possono essere raggruppati in qualche modo per ridurre le spese generali?
Questo è basato solo su un mucchio di messaggi a byte singolo, in genere si farebbe qualcosa di molto diverso, ma senza sapere che i dati grezzi inviati sono difficili da dimostrare in entrambi i casi se TCP si adatta meglio alla propria situazione rispetto a UDP.
Quindi funzionerà?
Bene, se hai un tipico fps e la posizione è importante (per evitare imbrogli o decisioni errate), devi sapere che il tuo flusso di rete è realizzabile, ma 32 giocatori ciascuno streaming che 24k + byte di messaggi avanti e indietro (quindi 768KB / s + messaggi) ... si tratta di una linea a banda larga da 10 MB / s solo per singole intestazioni basata sull'invio di almeno 1 messaggio per frame da ciascun client a tutti gli altri client tramite un server.
Ovviamente non codificherai il funzionamento del tuo server e client in quel modo e le dimensioni dei messaggi sono molto probabilmente molto più grandi e probabilmente un po 'meno frequenti di 1 byte per frame nella maggior parte delle situazioni, quindi è difficile dirlo senza vedere un mondo reale "questo è il dato che devo inviare" esempio.
Il mio caso
Nel mio caso ho fatto appello al fatto che si tratta di un ragionevole sovraccarico, ma si basa sul modo in cui costruisco i miei flussi di messaggi in modo da non avere enormi costi generali rispetto ad alcuni progetti.
TCP funziona bene e ho un server MMO scalabile e un framework client ma non ho bisogno di trasmettere molti dati in frame o molti piccoli pacchetti perché posso raggruppare le mie chiamate.
per altri: TCP semplicemente non lo farà, e possono solo usare UDP ma devono accettare che non darà loro garanzie su ciò che ottengono (ordine / garanzia di arrivo).
Altre considerazioni
Molti motori di gioco scarsamente codificati gestiscono tutto sul thread principale della cpu, quindi alla cpu viene spesso concesso solo un tempo molto piccolo per gestire il codice di rete, un'implementazione decente sia del servizio che del client sarebbe completamente asincrona e possibilmente spingere e estrarre i messaggi in batch.
Ci sono alcune buone librerie di rete là fuori, ma come visto qui, molti sembrano avere un'opinione che UDP è "semplicemente migliore", bene fattore prima delle tue esigenze e che potrebbe non essere il caso, e trovare una biblioteca che non lo fa un fattore che può comportare una configurazione TCP scarsamente codificata rispetto alla variante UDP nella stessa libreria (sto solo dicendo di averlo visto e i test di carico lo hanno dimostrato).
Costruisci prima qualcosa una base tecnica dei dati che desideri inviare e testalo, quindi fai i calcoli per ridimensionarlo, nel caso peggiore testalo distribuendolo su un cloud e fai in modo che 50 computer eseguano un client di prova per vedere se è in grado di gestirlo il tuo limite di 32 giocatori per partita (o qualsiasi limite tu possa avere).