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문제를 먼저 풀어볼 수도 있어요.