Wat weten we eigenlijk over TCP vs UDP? Het internet, blockchain, cloud computing – in welk vakgebied dan ook: computers zijn het meest effectief wanneer ze met elkaar verbonden zijn. Het versturen van data – en ervoor zorgen dat die volledig intact aankomt – vraagt echter om een complex samenspel van netwerken en nodes. Voordat we ingaan op de details van de protocollen Transport Control Protocol (TCP) en User Datagram Protocol (UDP), is het goed om eerst een stap terug te doen.
Alle netwerkmodellen proberen een vergelijkbaar proces te beschrijven: hoe stukjes data als elektrische puls door kabels worden verstuurd of via glasvezelkabels in lichtpatronen. En – aan de ontvangende kant – hoe deze stukjes data worden ontvangen en weer samengevoegd.
Data overbrengen van de ene applicatie op de ene computer naar de andere zou technisch gezien met één enkel protocol mogelijk zijn. Die methode zou echter uiterst kwetsbaar zijn: elke wijziging in de hardware zou betekenen dat de volledige applicatie- en protocolsoftware aangepast moet worden. Om de flexibiliteit te bereiken die nodig is om devices te verbinden, werkt netwerken met gelaagde stacks van verschillende protocollen. Elke laag in de stack heeft een specifieke functie en wisselt informatie uit met de lagen er direct boven en onder.
Het meest omvattende kader van vandaag is Open System Interconnection (OSI). Zowel UDP als TCP schudt een aantal van de betrokken lagen door elkaar, dus het OSI-model vormt het beste vertrekpunt om dieper te graven.
Het OSI-model in vogelvlucht
Fysieke laag
Op het meest basale niveau bestaat deze laag uit de mechanische onderdelen van het verzenden en ontvangen van data. Hier wordt bepaald hoe de pinnen en draden de nullen en enen omzetten in een signaal dat vervolgens als licht, elektrisch of radiosignaal naar het lokale medium wordt gestuurd.
Datalinklaag (DLL)
De datalinklaag fungeert als tussenpersoon tussen de fysieke componenten van een device en de datapakketten op het netwerk. De data in de fysieke laag is in wezen ongestructureerd – het is de taak van deze laag om die in frames te verpakken. Daarbij wordt de constante stroom aangeleverde data gegroepeerd in clusters, een proces dat multiplexen heet. Elk datapakket krijgt hier een header die de beoogde afzender en bestemming aangeeft.
Netwerklaag
Zodra de datapakketten klaarstaan, kan de netwerklaag (of internetlaag) ze van het ene device naar het andere over een netwerk routeren. Dat gebeurt door elk device een uniek IP-adres toe te kennen, waarmee het device wordt geïdentificeerd en de route wordt bepaald die pakketten moeten afleggen om er te komen.
Transportlaag
De transportlaag zit tussen de netwerk- en sessielaag in en richt zich op het afleveren van berichten bij een host. Dankzij de transportlaag kunnen applicaties en services sneller draaien, omdat bovenliggende processen geen rekening hoeven te houden met de unieke eigenschappen van het communicatienetwerk van elk device. Deze laag vormt de basis van de UDP- en TCP-protocollen die zo meteen aan bod komen.
Sessielaag
Het maakt de transportlaag niet uit of twee computers al eerder met elkaar hebben gecommuniceerd – die richt zich alleen op het heen en weer schuiven van pakketten. De sessielaag ordent het verkeer in een logisch begin en einde.
Presentatielaag
Het volume van deze datapakketten kan enorm zijn. De presentatielaag richt zich vooral op het coderen en comprimeren van deze pakketten om hun bandbreedtegebruik te beperken voordat ze het device van de afzender verlaten.
Applicatielaag
Tot slot moet de ontvangen data (of de data die verstuurd gaat worden) aan de gebruiker worden gecommuniceerd. OSI is een nuttig model, maar houd er rekening mee dat geen enkel modern protocol precies alle 7 lagen volgt. De TCP- en UDP-protocollen richten zich bijvoorbeeld alleen op de netwerk- en transportlaag.
Wat is TCP?
Het Transport Control Protocol was in feite het eerste netwerkprotocol. Het werd kort na de opkomst van het internet in 1981 bedacht en de eerste versie was gericht op het opdelen van data in pakketten. In de decennia daarna is het uitgegroeid tot de TCP/IP-stack die vandaag de standaard is. De pakketten binnen TCP zijn verdeeld over 4 lagen: datalink-, netwerk-, transport- en applicatielaag.
Zoals de naam al aangeeft, is TCP het meest bepalend op de transportlaag. Voordat er data wordt verstuurd, brengt TCP via een three-way handshake kortstondig een verbinding tot stand tussen twee netwerk-endpoints.
Eerst start de client de verbinding door een SYN-bericht (synchronize) te sturen, in de vorm van een willekeurig getal. Zodra de server dat ontvangt, bevestigt hij het met een SYN-ACK (waarbij simpelweg een 1 achter het getal van de client wordt gezet). Ten slotte bevestigt de client die SYN-ACK met een ACK-bericht. Deze virtuele handdruk zorgt ervoor dat zowel de afzender als de ontvanger klaar is om te communiceren en weet dat het kanaal tot stand is gebracht. Is de ontvangende poort offline of niet beschikbaar, dan wordt het ACK-bericht vervangen door een TCP RST-pakket (reset).
Niet alleen het beginproces steunt op een bevestiging in twee richtingen: ook de afsluiting in twee richtingen bevestigt wanneer een client of server klaar is met het versturen van data. Op vergelijkbare wijze stuurt de client, nadat alle relevante data is verzonden, een FIN-segment in de vorm van een eigen volgnummer. Opnieuw bevestigt de server dat. Zodra de server alle data heeft ontvangen, is het aan de server om een FIN-pakket te sturen, dat wordt bevestigd waarna de verbinding wordt beëindigd.
Het belang van IP
Cruciaal in dit proces is dat elke verbinding een bestemming moet hebben voordat er iets verstuurd wordt. Pas daarna kan de TCP-handshake plaatsvinden. Hier komt het Internet Protocol (IP) in beeld als de andere kant van de TCP/IP-medaille.
Elk device of domein dat met het internet verbonden is, heeft een uniek IP-adres. In de header van elk datapakket staat het IP-adres van de beoogde ontvanger, zodat data terechtkomt waar die nodig is. Zodra het IP-adres bekend is, kan het TCP-proces de overdracht van data starten. De ontvangen data moet echter wel bij de juiste poort aankomen – daarom bevatten TCP-pakketten ook poortgegevens. Zie IP als een postcode en de poortgegevens van TCP als een specifiek huisnummer. Tot slot bevatten TCP-pakketten een volgnummer, vergelijkbaar met genummerde pagina’s in een brief: daarmee is duidelijk in welke volgorde de pakketten zijn verstuurd.
TCP/IP is weliswaar de standaard geworden voor veilige en betrouwbare datatransmissie via het internet, maar een groot voordeel van de IP-aanpak is de flexibiliteit – en TCP is niet de enige manier om data van punt A naar punt B te krijgen.
Wat is UDP?
Het User Datagram Protocol (UDP) is een lichtgewicht transportprotocol voor data dat voortbouwt op de fundamenten van IP. In plaats van de uitgebreide handshake van TCP verstuurt UDP echter kleine, losstaande pakketten die datagrammen heten, zonder eerst een verbinding te controleren. Dat lijkt misschien riskant, maar UDP is zo opgezet dat het informatie kan laten vallen zonder dat de communicatie volledig vastloopt.
Elk datagram is een op zichzelf staande eenheid en bevat geen informatie over de stukjes data die ervoor of erna komen. Zo hoeft een server geen achterstand van vertraagde pakketten weg te werken en kan hij verzoeken volledig lineair afhandelen. Dit proces wordt ondersteund door de omvang van de pakketten binnen UDP. Denk eraan dat TCP-pakketten ingebouwde foutcontrole en volgnummering hebben: door al die optionele extra’s weg te laten zijn UDP-datagrammen een fractie van die omvang. Deze gestroomlijnde stukjes data kunnen vervolgens razendsnel worden verwerkt.
Daardoor wordt UDP gebruikt bij services die vrijwel realtime verwerking nodig hebben. Denk aan videostreaming en computergames: die vragen misschien veel UDP-datagrammen, maar hun snelheid is nodig voor een goede UX. En als een pakket wegvalt of verdwijnt, is het praktische gevolg hooguit een ontbrekende pixel gedurende één frame. Ook Domain Name Service (DNS)-queries, die een domeinnaam aan een herkenbaar webadres koppelen, maken gebruik van UDP. Deze verzoeken zijn piepklein en bestaan uit één enkel verzoek met bijbehorend antwoord, maar ze moeten snel gaan – een natuurlijke use case voor UDP.
De verschillen tussen TCP en UDP per functie
| Functie | UDP (User Datagram Protocol) | TCP (Transmission Control Protocol) |
| Verbinding | Verbindingsloos, brengt geen verbinding tot stand voordat data wordt verstuurd. | Verbindingsgericht, brengt een three-way handshake tot stand vóór de dataoverdracht. |
| Betrouwbaarheid | Garandeert geen aflevering, volgorde of foutcontrole. | De pakketarchitectuur zorgt voor aflevering in de juiste volgorde. |
| Snelheid | Snel. | Trager dan UDP door uitgebreide mechanismen voor foutcontrole. |
| Regeling van de datastroom | Geen flow control; verstuurt data zo snel als de afzender die kan genereren en het netwerk aankan. | Flow control wordt geregeld met windowing-technieken om de datastroom bij te sturen. |
| Gebruik | Wordt gebruikt voor tijdgevoelige applicaties waarbij enig dataverlies acceptabel is (bijv. live audio- en videostreaming). | Wordt gebruikt waar betrouwbare aflevering van data cruciaal is (bijv. surfen op het web, e-mail). |
| Headergrootte | Kleinere header (8 bytes). | Grotere header (minimaal 20 bytes). |
| Volgorde | Brengt geen volgorde aan in datapakketten. | Nummert datapakketten om aflevering in de juiste volgorde te garanderen. |
Tot slot nog wat stof tot nadenken over beveiliging
Houd bij de keuze tussen UDP en TCP binnen uw eigen projecten in gedachten dat UDP weliswaar aantrekkelijk is door zijn snelheid, maar van nature gevoeliger is voor beveiligingsproblemen zoals spoofing en Denial of Service-aanvallen. Het handshake-mechanisme van TCP voorkomt dat vervalste IP-adressen problemen veroorzaken, maar let op: TCP is niet immuun. De laatste jaren hebben DDoS-amplificatieaanvallen dit heen-en-weermechanisme gekaapt om een server te laten wachten op een laatste ACK-bericht dat nooit komt.
Voor een visuele uitleg van de verschillen tussen TCP en UDP, zie TCP vs. UDP: wat is het verschil?
