# UDP vs. TCP
Source: https://gafferongames.com/post/udp_vs_tcp/
Author: Glenn Fiedler | Date: 2008-10-01 | Series: Networking for Game Programmers

## Context
For action games (Halo, Battlefield, Quake, Unreal, Counter-Strike, Team Fortress), choosing socket type wrongly ruins multiplayer.

## TCP/IP vs IP vs UDP
- **TCP**: connection-based, reliable, ordered, stream protocol; breaks data into packets; flow control; easy like file I/O.
- **IP**: no connection; packets hop computer to computer; may be lost, duplicated, reordered; self-organizing routing.
- **UDP**: thin layer over IP; send datagram to IP:port; unreliable; no ordering; 16-bit checksum insufficient for long high-rate use — add your own.

Typical UDP loss ~1–5%; occasional periods of total loss.

## Why TCP fails for time-critical game data
TCP may buffer small writes (Nagle); `TCP_NODELAY` helps but does not fix head-of-line blocking: lost packet stalls newer data until retransmit (~RTT to 2*RTT+, worse under congestion backoff).

Action games care about **most recent** input/positions, not what happened a second ago. Waiting for stale resends freezes objects on client and freezes input processing on server; then a clump of packets arrives.

**Never use TCP for time-critical data.**

## Why not mix UDP + TCP
TCP and UDP share IP; TCP congestion behavior can induce UDP loss. Mixing loses control. Prefer implementing needed TCP features inside a custom UDP game protocol. (Using HTTP/REST alongside the game is fine; do not split the game protocol across UDP and TCP.)

## Recommendation
Use **only UDP** for the game protocol. Implement virtual connection, reliability, ordering, congestion avoidance yourself as needed.