| 항목 | 내용 |
| 주차 | 1주차-2 |
| 날짜 | 2026-03-11 |
| 주제 | TCP vs UDP |
| 발표자 | 이세비 |
이 주제를 한 문장으로 설명하면?
한 줄 요약:
전송 계층(4계층)에서 데이터를 어떻게 전달할 것인지를 결정하는 두 프로토콜로,신뢰성을 보장하는 TCP와 속도를 우선하는 UDP 중 상황에 맞게 선택
관련 키워드 (마인드맵 형태로 나열):
[TCP vs UDP]├── TCP│ ├── 연결 지향형 (각 연결은 1:1 점대점)│ ├── 3-way handshake (연결) / 4-way handshake (해제)│ ├── 흐름 제어 (Flow Control) - 슬라이딩 윈도우│ ├── 혼잡 제어 (Congestion Control) - Slow Start│ ├── 오류 제어 (Error Control) - 재전송(ARQ)│ └── Sequence Number / ACK Number├── UDP│ ├── 비연결형 (멀티캐스트·브로드캐스트 가능)│ ├── 데이터그램 단위 전송│ ├── 체크섬(CheckSum)으로 최소한의 오류 검출만│ └── 상위 레이어에서 필요한 기능을 직접 구현 가능├── 공통│ ├── 전송 계층 (4계층) 프로토콜│ └── 포트 번호 사용└── 연관 개념├── HTTP/1.1, HTTP/2 → TCP├── HTTP/3, QUIC → UDP 기반└── DNS → 기본 UDP (조건에 따라 TCP)
⚠️ 단순 복붙 금지! 반드시 자신의 말로 재작성할 것
개념 설명 (내 말로):
상대방과 연결을 먼저 확인한 뒤 데이터를 주고받는 연결 지향형 프로토콜이다. 데이터가 순서대로, 빠짐없이 도착하도록 보장하는 것이 최우선이다. 그 대신 연결을 맺고 끊는 과정, 재전송, 속도 조절 등 여러 단계를 거치기 때문에 UDP보다 느리다.
동작 원리 / 흐름:
1. 클라이언트 → 서버 : SYN (연결 요청 + 시퀀스 번호 전달)2. 서버 → 클라이언트 : SYN-ACK (수신 확인 + 서버 시퀀스 번호 전달)3. 클라이언트 → 서버 : ACK (서버 시퀀스 번호 확인)⇒ 이 3번의 통신이 끝나야 비로소 데이터 전송 시작
이 과정을 통해 양측이 "통신 준비 완료"를 확인하고, 이후 패킷 재조립에 사용할 시퀀스 번호를 서로 교환한다.
송신 측 수신 측│── 세그먼트 1 ──▶ ││◀─── ACK 2 ──── │ "1번 잘 받았어, 2번 줘"│── 세그먼트 2 ──▶ ││◀─── ACK 3 ──── │ "2번 잘 받았어, 3번 줘"│── 세그먼트 3 ─ X │ (유실!)│ 타임아웃... ││── 세그먼트 3 ──▶ │ → 송신 측이 3번을 다시 보냄│◀─── ACK 4 ──── │
데이터를 세그먼트(Segment) 단위로 쪼개 Sequence Number를 붙여 순서를 보장한다. 수신 측은 받은 세그먼트마다 ACK를 보내고, 송신 측이 일정 시간 내에 ACK를 받지 못하면 해당 패킷을 재전송한다.
실제 코드 예시:
// HTTP/HTTPS는 모두 TCP 위에서 동작한다// fetch를 호출하는 순간 내부적으로 TCP 3-way handshake가 먼저 일어난다// 개발자 도구 Timing 탭의 "Initial connection" = TCP handshake 시간const response = await fetch('https://api.example.com/data');// WebSocket도 TCP 기반// HTTP 핸드셰이크 후 TCP 연결을 업그레이드해 양방향으로 유지한다const socket = new WebSocket('wss://chat.example.com');
개념 설명 (내 말로):
연결 확인 없이 데이터를 일방적으로 전송하는 비연결형 프로토콜이다. 상대방이 준비됐는지 확인하지 않고 바로 보내기 때문에 빠르다. 전송 계층 수준에서는 데이터가 도착했는지, 순서가 맞는지를 보장하지 않는다. 그 대신 헤더가 8byte로 매우 단순해서, 필요한 기능을 상위 레이어에서 직접 구현할 수 있다는 것이 핵심이다.
동작 원리 / 흐름:
: 연결 설정 없이 데이터그램(Datagram) 단위로 바로 전송한다. 각 패킷은 독립적으로 처리되며 서로 다른 경로로 전달될 수 있다.
: 헤더의 체크섬(CheckSum)으로 데이터 손상 여부만 확인한다. 오류가 있으면 버릴 뿐, 재전송 요청은 하지 않는다.
: UDP는 한 번에 보낼 수 있는 데이터 크기에 이론상 상한선이 있지만, 그것보다 더 현실적인 제약은 네트워크가 한 번에 전달할 수 있는 크기(MTU, 보통 1,500바이트)다. 이걸 넘으면 중간에 알아서 잘리긴 하는데, 잘린 조각 중 하나라도 유실되면 전체를 다시 보내야 하는 문제가 생긴다. 그래서 실무에서는 처음부터 적당한 크기로 쪼개서 보내는 방식을 쓴다.
실제 코드 예시:
// DNS 조회는 기본적으로 UDP를 사용한다// 브라우저에서 fetch 호출 전, 도메인을 IP로 변환하는 과정이 UDP로 이뤄진다// 개발자 도구 Timing 탭 > "DNS Lookup" = 이 과정의 시간// WebRTC는 UDP 기반 (실시간 화상/음성 통신)const peerConnection = new RTCPeerConnection();// 약간의 패킷 유실보다 낮은 지연 시간이 더 중요하기 때문// HTTP/3(QUIC)도 UDP 기반// 개발자 도구 Network 탭 Protocol 컬럼에서 "h3"로 확인 가능
| 구분 | TCP | UDP |
| 연결 방식 | 연결 지향형 (각 연결은 1:1 점대점) | 비연결형 (멀티캐스트·브로드캐스트 가능) |
| 데이터 단위 | 세그먼트 (Segment) | 데이터그램 (Datagram) |
| 신뢰성 | 높음 (순서 보장, 재전송) | 전송 계층에서는 보장하지 않음 |
| 속도 | 느림 (핸드셰이크, 제어 오버헤드) | 빠름 (연결 설정 없음) |
| 헤더 크기 | 20~60바이트 | 8바이트 |
| 사용 예 | HTTP/1.1, HTTP/2, HTTPS, FTP | DNS, 스트리밍, 실시간 게임, WebRTC, HTTP/3 |
이걸 직접 다 구현한 대표적인 예가 바로 HTTP/3의 QUIC이다. UDP 위에서 신뢰성·순서 보장·암호화까지 직접 만들어서, TCP의 단점은 없애고 UDP의 속도는 살린 프로토콜이다.
이 기술/개념이 왜 이런 방식으로 만들어졌는지 배경을 이해하자
HTTP 버전별로 어떤 전송 프로토콜을 쓰는지 비교
| HTTP 버전 | 기반 프로토콜 | 특징 |
| HTTP/1.1 | TCP | 요청 하나씩 순서대로 처리 |
| HTTP/2 | TCP | 멀티플렉싱으로 HTTP 레벨 HOLB 해결, TCP 레벨 HOLB는 여전히 존재 |
| HTTP/3 | UDP (QUIC) | HOLB 완전 해결, 연결 지연 감소, 빠른 배포 가능 |
프론트엔드 관점에서 마주칠 수 있는 상황
: fetch나 axios로 API를 호출할 때, 내부적으로는 TCP 위에서 동작한다. 그런데 TCP는 패킷을 반드시 순서대로 처리해야 해서, 중간에 하나가 막히면 뒤에 오는 것들이 줄 서서 기다려야 한다. 이걸 HOLB(Head of Line Blocking) 라고 한다. HTTP/2가 한 연결에서 여러 요청을 동시에 처리하는 멀티플렉싱으로 개선했지만, TCP 자체의 HOLB는 여전히 남아있다.
: TCP의 한계를 넘기 위해 UDP 위에서 만든 프로토콜이 QUIC이고, HTTP/3는 이 위에서 동작한다. 개발자 도구 Network 탭 Protocol 컬럼에서 h3로 확인할 수 있다.
: 브라우저 주소창에 도메인을 입력하면, fetch가 실행되기도 전에 IP로 변환하는 DNS 조회가 먼저 일어난다. 요청·응답이 짧고 빠른 응답이 중요하기 때문에 UDP로 동작한다. 개발자 도구 Timing 탭의 DNS Lookup 항목이 바로 이 과정이다. 다만 응답 데이터가 매우 크거나 보안이 필요한 경우엔 TCP로 전환하기도 한다.
: 화상 통화나 음성 통화를 브라우저에서 구현할 때 사용하는 WebRTC가 UDP 기반이다. 1초에 수십 프레임이 오가는데 패킷 하나 유실됐다고 멈추고 기다리면 통화가 끊기는 것처럼 느껴진다. 약간의 손실이 있더라도 끊기지 않고 빠르게 흘러가는 게 더 중요해서 UDP를 사용한다.
면접관 앞에서 말하듯이 작성. 읽는 용도가 아니라 말하는 연습을 위한 섹션
[도입 - 핵심 정의 먼저]"TCP와 UDP는 모두 OSI 7계층 중 전송 계층(4계층)에서 사용되는 프로토콜입니다.가장 큰 차이는 신뢰성과 속도의 트레이드오프입니다."[부연 - 왜/어떻게]"TCP는 연결 지향형으로,3-way handshake를 통해 연결을 수립한 뒤 데이터를 주고받습니다.흐름·혼잡·오류 제어를 통해 데이터가 순서대로, 빠짐없이 도착하도록 보장하지만그만큼 느립니다.UDP는 비연결형으로,연결 확인 없이 데이터를 바로 전송합니다.전송 계층 수준에서는 신뢰성을 제공하지 않아 패킷이 유실될 수 있지만,그만큼 빠르고 오버헤드가 적습니다."[마무리 - 실무 연결]"그래서 HTTP, 파일 전송처럼 데이터 무결성이 중요한 곳에는 TCP를,DNS 조회, 스트리밍, WebRTC처럼 속도가 중요한 곳에는 UDP를 사용합니다.최근에는 HTTP/3가 TCP의 HOLB 문제와 연결 지연을 해결하기 위해UDP 기반의 QUIC 프로토콜을 채택했다는 점도 중요한 포인트입니다."
면접관이 바쁠 때, 딱 1분 안에 설명하는 버전
TCP는 3-way handshake로 연결을 맺고 흐름·혼잡·오류 제어를 통해데이터의 신뢰성을 보장하는 연결 지향형 프로토콜입니다.UDP는 이런 절차 없이 바로 데이터를 전송하는 비연결형 프로토콜로,전송 계층 수준에서는 신뢰성을 보장하지 않지만 속도가 빠릅니다.HTTP/HTTPS는 TCP, DNS와 HTTP/3는 UDP 기반이며,특히 HTTP/3의 QUIC은 TCP의 HOLB와 연결 지연 문제를 해결하기 위해 UDP를 선택했습니다.
A: TCP와 UDP는 둘 다 전송 계층에서 사용하는 프로토콜인데, 가장 큰 차이는 신뢰성과 속도의 트레이드오프입니다. TCP는 3-way handshake로 연결을 먼저 맺고, 데이터가 순서대로 빠짐없이 도착하도록 보장합니다. UDP는 연결 과정 없이 바로 데이터를 보내는 방식으로, 패킷이 유실돼도 그냥 넘어가는 대신 속도가 빠릅니다. 그래서 HTTP나 파일 전송처럼 데이터가 정확히 와야 하는 곳엔 TCP를, DNS 조회나 스트리밍, WebRTC처럼 속도가 더 중요한 곳엔 UDP를 사용합니다.
A: 클라이언트가 서버에 "연결해도 돼요?"라는 SYN을 보내고, 서버가 "좋아요, 저도 연결할게요"라는 SYN-ACK로 응답하고, 클라이언트가 다시 "확인했어요"라는 ACK를 보내면 연결이 수립됩니다. 이 3번의 통신을 통해 양쪽이 통신 준비가 됐다는 걸 서로 확인하고, 이후 패킷 순서를 맞추는 데 쓸 시퀀스 번호도 이 과정에서 교환합니다.
A: 연결을 끊을 때는 양쪽 방향을 각각 따로 닫아야 하기 때문입니다. 클라이언트가 "나는 다 보냈어요"라고 FIN을 보내도, 서버 쪽에는 아직 보내야 할 데이터가 남아있을 수 있습니다. 그래서 서버는 일단 "알겠어요"라는 ACK만 먼저 보내고, 할 일을 다 마친 뒤에 "저도 다 보냈어요"라는 FIN을 따로 보냅니다. ACK랑 FIN을 한 번에 못 보내니까 3way 보다 단계가 하나 더 많아지게 됩니다.
A: 못 하는 게 아니라 안 하는 거라고 보는 게 조금 더 맞습니다. UDP 자체는 전송 계층에서 신뢰성을 제공하지 않지만, 그 위 애플리케이션 레벨에서 재전송이나 순서 보장 같은 기능을 직접 구현할 수 있습니다. 대표적인 예가 HTTP/3의 기반인 QUIC인데, UDP 위에서 신뢰성·순서 보장·암호화를 직접 구현해서 TCP의 단점을 보완한 프로토콜입니다.
A: TCP가 가진 세 가지 문제를 해결하기 위해서입니다. 첫째, TCP는 패킷을 순서대로 처리해야 해서 하나가 막히면 뒤에 있는 것들이 전부 대기해야 하는 HOLB 문제가 있는데, QUIC은 각 스트림을 독립적으로 처리해서 이걸 해결했습니다. 둘째, TCP는 매번 연결을 맺는 데 시간이 걸리는데, QUIC은 이전에 연결한 적 있는 서버라면 그 과정을 아예 생략할 수 있습니다. 셋째, TCP는 OS 안에 구현되어 있어서 고치려면 OS 업데이트가 필요한 반면, QUIC은 브라우저 안에서 동작해서 브라우저 업데이트만으로 개선할 수 있습니다.
A: 둘 다 전송 속도를 조절한다는 점은 같은데, 기준이 다릅니다. 흐름 제어는 수신 측이 얼마나 받을 수 있는지를 기준으로 합니다. 수신 측이 "나 지금 이만큼만 받을 수 있어"라고 알려주면 송신 측이 그에 맞춰 속도를 조절합니다. 반면, 혼잡 제어는 네트워크 자체가 얼마나 여유 있는지를 기준으로 합니다. 중간 네트워크가 막히기 시작하면 전송 속도를 줄여서 더 심해지지 않게 막는 역할입니다.
A: DNS 조회는 "이 도메인의 IP가 뭐예요?"라고 물으면 "이거예요"로 끝나는 단순한 요청·응답 구조입니다. 연결을 맺는 3-way handshake 과정을 거칠 이유가 없고, 빠른 응답이 더 중요하기 때문에 UDP를 씁니다. 응답이 안 오면 클라이언트가 그냥 다시 물어보면 되니까 신뢰성 손실도 크게 문제가 안 됩니다. 다만 응답 데이터가 매우 크거나 보안이 필요한 경우에는 TCP로 전환하기도 합니다.
공부하고 나서 진짜 내 머릿속에 남은 것들만 정리
: TCP는 3-way handshake + 흐름/혼잡/오류 제어로 데이터가 순서대로 빠짐없이 도착하도록 보장하고, UDP는 이 과정을 생략해 빠르게 전송한다.
: 전송 계층에서 제공하지 않을 뿐, 필요하면 애플리케이션 레벨에서 직접 구현할 수 있다. QUIC이 그 대표적인 예다.
: TCP는 패킷 하나가 막히면 뒤가 전부 대기하고(HOLB), 연결 맺는 데 시간이 걸리고, OS 안에 있어서 고치기도 어렵다. QUIC은 이 세 가지를 UDP 위에서 직접 해결했다
| 헷갈린 것 | 알고 보니 |
| 4-way handshake가 왜 3-way보다 하나 더 많나 | 연결 끊을 때 양쪽 방향을 각각 따로 닫아야 해서, "나 다 보냈어(FIN)"와 "알겠어(ACK)"가 분리된다 |
| TCP는 1:1만, UDP는 1:N이 가능? | TCP 연결 하나가 항상 1:1이라는 뜻. 서버가 여러 클라이언트랑 동시에 연결할 수 있지만 그건 연결이 여러 개인 거지, 연결 하나가 1:N인 건 아니다. UDP는 한 번에 여러 곳에 뿌리는 멀티캐스트가 가능 |
| DNS는 항상 UDP? | 기본은 UDP, 응답이 크거나 보안이 필요한 경우엔 TCP로 전환하기도 한다. |
| HTTP/3가 UDP를 쓰는 이유가 "TCP 헤더가 꽉 차서"? | 아니다. 핵심은 HOLB 해결, 연결 맺는 시간 줄이기, OS가 아닌 브라우저 안에서 동작해서 빠르게 업데이트 가능하다는 것 |
| 흐름 제어 vs 혼잡 제어 헷갈림 | 흐름 제어 = "수신 측이 얼마나 받을 수 있어?" 기준 / 혼잡 제어 = "지금 네트워크가 얼마나 여유 있어?" 기준 |
| 자료 | 링크 | 추천 이유 |
| MDN - TCP | https://developer.mozilla.org/ko/docs/Glossary/TCP | TCP 개념과 특징을 간결하게 정리 |
| MDN - UDP | https://developer.mozilla.org/ko/docs/Glossary/UDP | UDP 개념과 사용 사례 정리 |
| MDN - HTTP/3 | https://developer.mozilla.org/ko/docs/Glossary/HTTP_3 | HTTP/3와 QUIC이 UDP를 선택한 이유 설명 |
| Cloudflare - QUIC Flood란? | https://www.cloudflare.com/ko-kr/learning/ddos/what-is-a-quic-flood/ | QUIC 프로토콜 동작 원리를 그림과 함께 설명 |
| Cloudflare - TCP/IP란? |
💡 작성 팁
- 2번 핵심 개념은 공식 문서나 블로그를 보고 나서, 반드시 탭을 닫고 자신의 말로 재작성하기
- 4번 구두 설명 스크립트는 실제로 소리 내어 읽어보기
- 5번 질문은 최소 5개 이상 준비하기 (기본 2~3개 + 심화 2개 이상)
- 발표 전날 밤에 전체를 한 번 소리 내어 읽어보기
: 수신 측 버퍼가 넘치지 않도록, 수신 측이 처리 가능한 양(Window Size)을 송신 측에 알려준다.
: 네트워크 전체가 과부하되지 않도록 혼잡을 감지하면 전송 속도를 줄인다. 처음엔 천천히 보내다가 점점 늘리고, 혼잡이 감지되면 다시 줄이는 방식으로 네트워크 상태에 맞게 속도를 조절한다.
: 패킷 유실 시 재전송(ARQ)을 통해 데이터 무결성을 보장한다.
1. 클라이언트 → 서버 : FIN (데이터 전송 완료, 연결 종료 요청)2. 서버 → 클라이언트 : ACK (FIN 수신 확인 — 아직 보낼 데이터가 있을 수 있어 FIN 바로 안 보냄)3. 서버 → 클라이언트 : FIN (서버 측 전송도 완료)4. 클라이언트 → 서버 : ACK (확인, 연결 종료)
TCP 연결 종료는 각 방향(클라이언트→서버, 서버→클라이언트)을 독립적으로 닫는 half-close 구조이기 때문에 4단계가 필요하다. 클라이언트가 FIN을 보내도 서버에는 아직 보낼 데이터가 남아있을 수 있어서, ACK와 FIN이 분리된다.
| https://www.cloudflare.com/ko-kr/learning/ddos/glossary/tcp-ip/ |
| TCP/IP 개념과 계층 구조 정리 |
| Cloudflare - UDP란? | https://www.cloudflare.com/ko-kr/learning/ddos/glossary/user-datagram-protocol-udp/ | UDP 특징과 TCP와의 차이를 쉽게 설명 |