TCP 는 연결형이고 UDP 는 비연결형입니다. 그 차이에서 신뢰성(순서 보장, 재전송)이 갈립니다.
TCP vs UDP
핵심 비교
| 구분 | TCP | UDP |
|---|
| 연결 | 연결 지향 (3-way) | 비연결 |
| 신뢰성 | 보장 (재전송) | 보장 안 함 |
| 순서 | 보장 | 보장 안 함 |
| 속도 | 상대적 느림 | 빠름 |
| 헤더 | 20바이트 | 8바이트 |
| 흐름 제어 | O | X |
프로토콜 선택 기준
| 요구사항 | 고를 것 | 예 |
|---|
| 신뢰성이 필요하다 | TCP | 웹(HTTP), 이메일, 파일 전송 |
| 신뢰성보다 실시간성이 중요하다 | UDP | 게임, 영상 스트리밍, VoIP |
| 단순한 요청과 응답이면 된다 | UDP | DNS, DHCP |
무엇을 대신해 주느냐의 차이
둘의 차이는 속도가 아니라 누가 뒤처리를 하느냐입니다.
| 뒤처리 | TCP | UDP |
|---|
| 잃어버린 것을 다시 보내기 | 해 준다 | 필요하면 직접 |
| 순서를 맞추기 | 해 준다 | 필요하면 직접 |
| 상대가 못 받을 만큼 보내지 않기 | 해 준다 | 필요하면 직접 |
그래서 UDP 가 빠른 것이 아니라 안 해 주는 것입니다. 같은 보장이 필요하면 직접 만들어야
하고, 그러면 TCP 와 비슷해집니다.
그래도 UDP 를 고르는 이유
다시 보내는 것이 도움이 안 되는 데이터가 있습니다.
지나간 목소리를 1초 뒤에 다시 받아도 쓸 데가 없다
지금 위치를 다시 받아도 이미 옛 위치다
이때는 잃어버린 것을 포기하고 다음 것을 받는 쪽이 낫습니다. 막힘 없이 흐르는 것이
빠짐없이 오는 것보다 중요할 때 UDP 를 고릅니다. 그 판단이 서비스의 성격에서 나옵니다.
실무 서비스별 프로토콜
| 서비스 | 프로토콜 | 이유 |
|---|
| 웹 (HTTP/1,2) | TCP | 데이터 무결성 필수 |
| HTTP/3 (QUIC) | UDP | TCP HoL 블로킹 해결 |
| 게임 서버 | UDP | 프레임 손실보다 지연이 치명적 |
| 넷플릭스 | TCP+UDP | 적응적 비트레이트(ABR) |
| DNS | UDP | 짧은 요청-응답, 실패 시 재전송 |
Q.TCP와 UDP 차이를 설명해주세요
연결을 맺고 보장하는지가 다릅니다.
| 항목 | TCP | UDP |
|---|
| 연결 | 맺고 시작한다 | 없다. 바로 보낸다 |
| 순서 보장 | 있다 | 없다 |
| 유실 시 | 재전송한다 | 그냥 잃는다 |
| 혼잡 제어 | 있다 | 없다. 직접 만들어야 한다 |
| 헤더 크기 | 20바이트 이상 | 8바이트 |
| 쓰는 곳 | 웹, 파일 전송, 메일 | 실시간 영상과 음성, DNS, 게임 |
선택 기준은 늦게 온 데이터가 쓸모 있는지입니다. 파일은 늦어도 맞아야 하므로 TCP, 화상 통화는 늦은 프레임이 무의미하므로 UDP 입니다.
흔한 실수: UDP 를 "신뢰성이 없어 나쁜 것"으로 설명하는 것. 보장을 애플리케이션이 골라서 만들 수 있다는 뜻입니다. 순서 번호와 손실 은닉은 만들고 재전송 대기는 버리는 선택이 가능합니다.
Q.게임 서버에서 UDP를 쓰는 이유는?
재전송을 기다리는 것이 게임에서는 손해이기 때문입니다.
위치 정보를 초당 30번 보낸다
100번째 패킷이 유실됐다
| 프로토콜 | 그 다음에 일어나는 일 |
|---|
| TCP | 101번과 102번이 도착해도 순서를 지키려고 붙잡아 둔다. 100번을 재전송받고 나서야 넘기므로 왕복 한 번이 지연에 더해진다 |
| UDP | 100번은 버리고 101번을 바로 반영한다. 최신 위치가 화면에 보인다 |
이미 지나간 위치를 늦게 받아도 쓸모가 없습니다. 최신 상태가 옛 상태를 덮어쓰는 성질이라 유실을 견딜 수 있습니다.
다만 UDP 위에 필요한 것은 직접 만듭니다. 순서 번호, 중요한 이벤트(피격, 아이템 획득)의 재전송, 대역폭 추정이 그것입니다.
흔한 실수: UDP 를 쓰면 무조건 빠르다고 답하는 것. 대역폭이 같으면 전송 속도는 비슷하고, 줄어드는 것은 유실 시의 지연입니다. 그리고 혼잡 제어를 만들지 않으면 네트워크를 밀어버려 오히려 나빠집니다.
Q.HTTP/3가 UDP 기반(QUIC)인 이유는?
TCP 계층에서 생기는 앞 막힘을 없애기 위해서입니다.
HTTP/2 는 한 TCP 연결에 여러 스트림을 실었다
그런데 TCP 는 바이트 순서를 지키므로
스트림 A 의 패킷이 유실되면
TCP 가 뒤에 온 스트림 B, C 의 데이터까지 붙잡아 둔다
애플리케이션은 무관한 스트림인데도 기다린다
QUIC 은 UDP 위에서 스트림별로 순서를 관리하므로 A 만 기다리고 B, C 는 바로 처리됩니다.
| 얻는 것 | 내용 |
|---|
| 스트림 독립 | 한 스트림의 유실이 다른 스트림을 막지 않는다 |
| 연결 수립 단축 | 전송과 암호화 협상을 합쳐 1왕복, 재접속은 0왕복 |
| 연결 유지 | IP 가 바뀌어도 연결 식별자로 이어진다. 이동 중에 유용하다 |
흔한 실수: UDP 라서 신뢰성이 없다고 답하는 것. QUIC 이 재전송과 순서와 혼잡 제어를 모두 구현합니다. UDP 를 고른 이유는 보장을 버리려는 것이 아니라 커널의 TCP 대신 직접 구현하려는 것입니다.
먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.
읽었으면 문제로 확인해보세요
네트워크 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.