TLDR;
- TCP - orientato al flusso, richiede una connessione, affidabile, lento
- UDP: orientato ai messaggi, senza connessione, inaffidabile, veloce
Prima di iniziare, ricorda che tutti gli svantaggi di qualcosa sono una continuazione dei suoi vantaggi . C'è solo uno strumento giusto per un lavoro, nessuna panacea. TCP / UDP coesistono per decenni e per un motivo.
TCP
È stato progettato per essere estremamente affidabile e fa molto bene il suo lavoro. È così complesso perché svolge un compito difficile: dimostrare un trasporto affidabile tramite il protocollo IP inaffidabile.
Poiché tutta la complessa logica di TCP è incapsulata nello stack di rete, sei libero di fare molte cose laboriose e soggette a errori di basso livello nel livello dell'applicazione.
Quando si inviano dati su TCP, si scrive un flusso di byte sul socket del mittente in cui vengono suddivisi in pacchetti, passati nello stack e inviati tramite il filo. Sul lato ricevente i pacchetti vengono nuovamente riassemblati in un flusso continuo di byte.
Il mantenimento di questa bella astrazione ha un costo in termini di complessità e prestazioni. Se il 1 ° pacchetto dal flusso di byte viene perso, il ricevitore ritarderà l'elaborazione dei pacchetti successivi anche quelli già arrivati.
Inoltre, per essere affidabile, TCP implementa questo:
- TCP richiede una connessione stabilita, che richiede 3 round trip (stretta di mano a 3 vie "famigerata").
- TCP ha una funzione chiamata "avvio lento" quando aumenta gradualmente la velocità di trasmissione dopo aver stabilito una connessione per consentire a un ricevitore di tenere il passo con i dati.
- Ogni pacchetto inviato deve essere riconosciuto, altrimenti un mittente smetterà di inviare più dati
- E ancora e ancora e ancora...
Tutto ciò è esacerbato in reti wireless lente e inaffidabili, mentre TCP è stato progettato per reti cablate in cui i ritardi sono prevedibili e la perdita di pacchetti non è così comune. Inoltre, come molte persone già menzionate, per alcune cose il TCP non funziona affatto (DHCP). Tuttavia, laddove pertinente, TCP fa ancora il suo lavoro eccezionalmente bene.
Usando un'analogia della posta una sessione TCP è simile a raccontare una storia al tuo segretario che la divide in posta e invia un servizio di posta scadente a un editore. Dall'altro lato un altro segretario riunisce le lettere in un unico pezzo di testo. Alcuni messaggi si perdono, altri vengono danneggiati, quindi è necessaria una procedura molto complessa per la consegna affidabile e la tua storia di 10 pagine può impiegare molto tempo per raggiungere il tuo editore.
UDP
UDP, d'altra parte, è orientato ai messaggi, quindi un destinatario scrive un messaggio (pacchetto) nel socket e quindi viene trasmesso così com'è, senza alcuna divisione / assemblaggio.
Rispetto a TCP, le sue specifiche sono molto semplici. In sostanza, tutto ciò che fa per te è aggiungere un checksum al pacchetto in modo che un destinatario possa rilevare il suo danneggiamento. Tutto il resto deve essere implementato da te, uno sviluppatore di software. Ora leggi le voluminose specifiche TCP e prova a pensare di reimplementarne alcune parti.
Alcune persone sono andate così e hanno ottenuto risultati molto decenti, al punto che HTTP / 3 utilizza QUIC, un protocollo basato su UDP. Tuttavia, questa è più un'eccezione. Le applicazioni comuni di UDP sono applicazioni di streaming e conferenza audio / video come Skype, Zoom o Hangout di Google in cui perdere pacchetti non è così importante rispetto a un ritardo introdotto da TCP.