목차
TCP는 악수하고, 확인받고, 잃으면 다시 보낸다. 덕에 안전하지만 그만큼 느리다. UDP는 정반대다 - 그 안전장치를 다 버리고 그냥 던진다. 왜 일부러 안전을 포기하는지가 이 글이다.
TCP의 안전장치엔 값이 있다
TCP의 신뢰성은 공짜가 아니다. 데이터 전에 3-way handshake로 왕복을 한 번 쓰고, 조각마다 확인응답을 주고받고, 잃으면 다시 보내느라 기다린다. 안전한 대신 느리고 무겁다.
문제는, 이 안전이 오히려 방해가 되는 경우가 있다는 것이다. 그럴 때 쓰는 게 UDP다.
UDP: 그냥 던진다
UDP는 TCP와 같은 전송 계층이지만, 하는 일이 정반대다. 악수도 없고, 확인도 없고, 재전송도 없다. 목적지로 그냥 던지고 끝이다.
TCP: 악수 → 조각 보내고 → 확인 기다리고 → 잃으면 재전송 → 순서 맞춤
UDP: 던짐. 끝.편지로 치면 TCP는 등기우편(받았다는 확인이 온다)이고, UDP는 일반우편을 그냥 우체통에 넣는 것이다. 도착했는지 안 했는지 보낸 쪽은 모른다.
무엇을 버렸나
UDP가 포기한 걸 TCP와 나란히 놓으면 뚜렷하다.
- 연결 없음 - 악수를 안 한다. 상대가 준비됐는지 확인 없이 바로 보낸다.
- 도착 보장 없음 - 잃어버려도 다시 안 보낸다. 사라지면 그냥 사라진다.
- 순서 보장 없음 - 뒤섞여 도착해도 맞춰주지 않는다. 온 순서 그대로 준다.
- 확인 없음 - 받았다는 신호를 주고받지 않는다.
TCP가 해주던 것을 전부 안 한다. 그래서 “믿을 수 없는” 전송이라 불린다 - 나쁘다는 게 아니라, 보장을 안 한다는 뜻이다.
버려서 얻는 것: 속도와 단순함
이 포기의 대가로 UDP는 두 가지를 얻는다.
- 빠르다 - 악수의 왕복이 없어 첫 데이터가 바로 나간다. 확인을 기다리며 멈추지도 않는다.
- 단순하고 가볍다 - 연결 상태를 관리할 필요가 없어, 한 서버가 훨씬 많은 상대를 상대할 수 있다.
핵심은 기다림이 없다는 것이다. TCP는 잃은 조각을 다시 받으려 뒤엣것까지 멈춰 세우지만, UDP는 멈추지 않고 계속 간다. 이 “안 멈춤”이 어떤 데이터엔 신뢰성보다 값지다.
잃어도 되는 데이터가 있다
언제 신뢰성보다 속도가 값진가. 늦은 데이터가 아예 쓸모없어지는 경우다.
- 실시간 영상·음성 통화 - 0.5초 전 화면 조각을 지금 다시 받아본들 소용없다. 이미 지난 순간이다. 차라리 버리고 다음 걸 보여주는 게 낫다.
- 온라인 게임 - 3초 전 내 위치를 재전송받으면 오히려 방해다. 최신 위치만 중요하다.
이런 데이터는 “빠짐없이”보다 “지금 것을, 늦지 않게”가 중요하다. TCP가 잃은 조각을 다시 받느라 화면 전체를 멈추면 오히려 끊겨 보인다. UDP는 잃은 건 포기하고 흐름을 이어가, 잠깐 화질이 뭉개질지언정 안 끊긴다.
잃으면 안 되면 앱이 직접 챙긴다
그렇다고 UDP가 “잃어도 상관없는” 데만 쓰이는 건 아니다. 신뢰성이 필요하면, 그걸 앱이 직접 골라서 얹으면 된다.
TCP는 모든 것에 완전한 신뢰성을 강제하지만, UDP 위에선 앱이 “이건 꼭 도착해야 하고, 저건 잃어도 된다”를 골라서 챙길 수 있다. 필요한 것만 다시 보내고 나머지는 흘려보내는, TCP보다 영리한 신뢰성을 만들 수 있다. 이 유연함이 다음 이야기로 이어진다.
HTTP/3은 UDP 위에 다시 지었다
connection 글의 “HTTP/3은 아래층을 바꿨다”가 바로 이것이다. HTTP/3은 전송 계층을 TCP에서 UDP 기반(QUIC) 으로 갈아끼웠다.
왜 안전한 TCP를 두고 UDP로 갔을까. TCP는 조각 하나를 잃으면 뒤의 멀쩡한 조각까지 다 멈춰 세운다(순서를 지켜야 하니까). 여러 대화를 한 연결에 섞는 HTTP/2에선 이게 특히 아프다 - 한 조각 손실이 무관한 다른 대화까지 막는다. 그래서 UDP 위에 골라서 챙기는 신뢰성을 새로 지어, 한 대화의 손실이 다른 대화를 안 막게 했다. 계층이 나뉘어 아래만 갈아끼울 수 있었던 덕이다.
실무에서: TCP냐 UDP냐
- 기본은 TCP - 웹·API·파일 전송처럼 빠짐없이 정확히 와야 하는 건 TCP다. 대부분이 여기다.
- UDP는 실시간·손실 허용 - 영상·음성·게임·DNS 조회처럼 빠름이 정확함보다 값진 경우다. (DNS는 질의·응답이 짧아, 악수 비용을 아끼려 주로 UDP를 쓴다.)
- “UDP라 잃는다”를 설계에 넣는다 - UDP를 쓰면 손실·순서 뒤섞임을 당연한 전제로 다뤄야 한다. 잃으면 안 되는 것만 앱이 따로 챙긴다.
정리
- TCP의 신뢰성은 악수·확인·재전송의 기다림을 대가로 한다 - 그 기다림이 방해될 때 UDP를 쓴다.
- UDP는 연결·도착·순서·확인을 다 버리고 그냥 던진다 - 대신 빠르고 단순하며 멈추지 않는다.
- 늦으면 쓸모없어지는 데이터(실시간 영상·게임)엔 “빠짐없이”보다 “안 멈춤”이 값지다.
- 신뢰성이 필요하면 앱이 골라서 얹을 수 있고, HTTP/3이 그렇게 UDP 위에 다시 지었다.
다음 글은 내 기계의 사설 주소가 어떻게 인터넷 밖과 통하는지 - NAT로 간다.