TCP와 UDP는 전송 계층의 프로토콜로, IP가 목적지 컴퓨터까지 날라 온 데이터를 그 안의 어느 프로그램에 넘길지 포트 번호(port number)로 가립니다. TCP는 연결을 맺고 빠짐없이 차례대로 보내고, UDP는 연결 없이 바로 보내 빠릅니다.
IP 주소와 IPv6의 IP는 패킷을 목적지까지 나를 뿐, 도중에 사라지거나 차례가 바뀌어도 바로잡지 않습니다. 파일은 한 바이트만 빠져도 못 쓰지만, 영상 통화는 조금 빠지는 것보다 늦게 오는 것이 더 나쁩니다. 아래 그림은 TCP가 연결을 맺고 끊는 차례와, 조각 하나가 사라졌을 때 TCP와 UDP가 다르게 하는 일을 보여 줍니다.
1TCP의 연결 — 3-way 핸드셰이크
TCP(Transmission Control Protocol)는 데이터를 보내기 전에 상대와 연결을 맺습니다. 연결형(connection-oriented)이라고 합니다. TCP는 보내는 데이터의 바이트마다 순서 번호(sequence number)를 매기고, 받은 쪽은 '여기까지 받았으니 다음은 이 번호'라는 확인 응답 번호(acknowledgment number)를 돌려줍니다. 순서 번호는 자료에 따라 시퀀스 번호라고도 부릅니다.
연결은 세 번 오가며 맺습니다. 이것을 3-way 핸드셰이크(3-way handshake)라고 합니다. 아래에서 A는 클라이언트, B는 서버입니다.
A→B SYN seq=100
B→A SYN+ACK seq=300 ack=101
A→B ACK seq=101 ack=301
SYN은 연결을 청하며 순서 번호의 시작을 알리는 표시이고, ACK는 받았다는 확인입니다. 서버는 둘째 번에 확인(ACK)과 자기 시작 번호(SYN)를 한 번에 보냅니다. 확인 응답 번호는 다음에 받을 번호인데, SYN이 번호 하나를 차지하므로 100을 받으면 101을 돌려줍니다.
2믿을 수 있게 보내고 끊기
연결이 맺어지면 TCP는 데이터를 세그먼트(segment)라는 조각으로 나눠 보냅니다. 확인이 정해진 시간 안에 오지 않으면 그 조각을 다시 보내고, 받는 쪽은 순서 번호로 조각의 차례를 맞추고 겹친 것은 버립니다. 받는 쪽과 네트워크가 감당할 만큼만 보내도록 속도도 조절합니다 — 흐름 제어와 혼잡 제어에서 봅니다.
끊을 때는 양쪽이 각자 FIN(끝)을 보내고 상대가 ACK로 받아, 모두 네 번 오갑니다(4-way 핸드셰이크). 한쪽이 다 보내도 다른 쪽은 보낼 것이 남았을 수 있어, 양쪽이 따로 끝을 알립니다.
3연결 없이 보내는 UDP
UDP(User Datagram Protocol)는 연결을 맺지 않고 데이터그램(datagram)을 바로 보냅니다. 여기서 데이터그램은 UDP가 한 번에 보내는 덩어리로, 패킷마다 길을 따로 고르는 교환 방식의 이름과는 다른 뜻입니다. 비연결형(connectionless)이라고 합니다. 확인도, 다시 보내기도, 차례 맞추기도 하지 않습니다. 그만큼 헤더가 작고 빨라서, 조금 빠져도 제때 오는 것이 중요한 실시간 음성·영상이나 짧게 한 번 묻고 답하는 DNS 조회에 씁니다.
| 가르는 기준 | TCP | UDP |
|---|---|---|
| 연결 | 맺고 보낸다(연결형) | 맺지 않는다(비연결형) |
| 사라진 데이터 | 다시 보낸다 | 버려 둔다 |
| 차례 | 맞춘다 | 맞추지 않는다 |
| 흐름·혼잡 제어 | 한다 | 하지 않는다 |
| 헤더 | 20바이트부터 | 8바이트 |
| 보내는 단위 | 세그먼트 | 데이터그램 |
UDP 헤더는 출발지 포트·목적지 포트·길이·체크섬(checksum, 데이터가 깨졌는지 검사하는 값) 넷뿐입니다. TCP 헤더는 두 포트와 체크섬에 순서 번호·확인 응답 번호·헤더 길이·제어 비트(SYN·ACK·FIN 등)·윈도우 크기·긴급 포인터를 더합니다. 데이터까지 센 전체 길이 칸은 UDP에만 있습니다.
예제
다음 여섯 가지 일에 TCP와 UDP 가운데 어느 것이 맞을지 먼저 골라 보세요.
(가) 은행 앱으로 계좌 이체를 보냅니다.
(나) 화상 회의에서 내 목소리를 실시간으로 보냅니다.
(다) 1GB 설치 파일을 내려받습니다.
(라) 웹 주소를 IP 주소로 바꾸려고 DNS 서버에 한 번 묻습니다.
(마) 메일 서버로 메일을 보냅니다.
(바) 온라인 게임에서 내 캐릭터 위치를 1초에 수십 번 알립니다.
답을 정했으면 아래 표로 맞춰 보세요.
| 가르는 물음 | TCP 쪽 | UDP 쪽 |
|---|---|---|
| 하나라도 빠지면 결과가 틀리나 | (가) (다) (마) | — |
| 늦게 온 데이터는 쓸모가 없나 | — | (나) (바) |
| 짧게 한 번 묻고 답하나 | — | (라) |
(라)의 DNS도 큰 응답을 옮길 때는 TCP를 쓰지만, 한 번 묻는 조회는 UDP입니다.
시험 포인트
- 필기: TCP는 연결형이고 순서 번호·확인 응답·재전송으로 신뢰성을 지키며 흐름·혼잡 제어를 합니다. UDP는 비연결형이라 신뢰성은 없지만 헤더가 8바이트로 작고 빠릅니다. 3-way 핸드셰이크의 차례(SYN → SYN+ACK → ACK)와 확인 응답 번호(SYN 100을 받으면 101)를 묻습니다. 헤더 칸으로 둘을 가르는 문제도 나옵니다 — 순서 번호·윈도우는 TCP에만, 전체 길이는 UDP에만 있습니다.
- 실기: 설명을 보고 이름을 씁니다 — TCP(Transmission Control Protocol), UDP(User Datagram Protocol), 3-way 핸드셰이크(3-Way Handshake), 순서 번호(Sequence Number), 확인 응답 번호(Acknowledgment Number).
확인 문제
1. 다음 가운데 UDP를 쓰는 것이 알맞은 경우를 고르세요.
- ① 쇼핑몰 주문서를 서버에 보낸다
- ② 경기장 전광판에 실시간 중계 영상을 흘려보낸다
- ③ 소스 코드 저장소에서 파일 수천 개를 받아 온다
- ④ 원격 서버에 접속해 명령을 입력한다
정답
②입니다. 중계 영상은 빠진 장면을 다시 받느니 다음 장면을 제때 받는 편이 낫습니다. 연결도 다시 보내기도 없는 UDP가 맞습니다.
- ① 주문서는 한 글자만 빠져도 틀린 주문이 됩니다. 빠짐없이 보내는 TCP가 맞습니다.
- ③ 파일이 하나라도 깨지면 쓸 수 없어 TCP가 맞습니다.
- ④ 명령 글자가 하나라도 빠지거나 차례가 바뀌면 다른 명령이 됩니다. TCP가 맞습니다.
2. 다음 (가)~(마)에 맞는 이름을 쓰세요. (가)·(나)는 약어와 영문 원어로, (다)~(마)는 한글 이름과 영문으로 함께 씁니다. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가) 보내기 전에 상대와 세 번 신호를 주고받아 통로를 열고, 확인이 오지 않은 조각은 다시 보내는 전송 계층 프로토콜
- (나) 통로를 열지 않고 바로 보내며, 헤더가 출발지·목적지 포트와 길이·체크섬뿐인 전송 계층 프로토콜
- (다) (가)가 통로를 열 때 청함 → 청함과 확인 → 확인으로 세 번 오가는 절차
- (라) (가)가 보내는 바이트마다 매겨, 받는 쪽이 조각의 차례를 맞출 수 있게 하는 번호
- (마) 받는 쪽이 '여기까지 받았으니 다음은 이것'이라고 돌려주는 번호
정답
받는 답: (가) TCP(Transmission Control Protocol) · (나) UDP(User Datagram Protocol) · (다) 3-way 핸드셰이크(3-Way Handshake) · (라) 순서 번호(Sequence Number) 또는 시퀀스 번호 · (마) 확인 응답 번호(Acknowledgment Number)
(가)의 실마리는 '세 번 주고받아 연다 · 다시 보낸다', (나)는 '열지 않고 바로 · 헤더 칸 넷', (다)는 '세 번 오가는 절차', (라)는 '바이트마다 매겨 차례를 맞춘다', (마)는 '다음에 받을 번호를 돌려준다'입니다.
- 틀리는 꼴 UDP — (가)에: 통로를 열지 않고 다시 보내지도 않습니다.
- 틀리는 꼴 4-way 핸드셰이크 — (다)에: 연결을 끊을 때 FIN과 ACK가 네 번 오가는 절차입니다.
- 틀리는 꼴 순서 번호 — (마)에: 보내는 쪽이 자기 바이트에 매기는 번호입니다. 받는 쪽이 돌려주는 것은 확인 응답 번호입니다.
3. 클라이언트가 순서 번호 500으로 SYN을 보냈고, 서버는 자기 순서 번호를 900부터 쓰기로 했습니다. (가) 서버가 보내는 SYN+ACK의 확인 응답 번호와 (나) 클라이언트가 마지막으로 보내는 ACK의 확인 응답 번호를 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: (가) 501 · (나) 901
확인 응답 번호는 다음에 받을 번호입니다. SYN이 번호 하나를 차지하므로 서버는 500을 받고 501을, 클라이언트는 900을 받고 901을 돌려줍니다.
- 틀리는 꼴 (가) 900: 서버 자신의 시작 번호입니다. SYN+ACK에서 seq 자리에 들어갑니다.
- 틀리는 꼴 (나) 501: 클라이언트 자신의 다음 순서 번호입니다. ACK의 seq 자리에 들어갑니다.
4. 다음 가운데 TCP 헤더에는 있고 UDP 헤더에는 없는 칸을 고르세요.
- ① 출발지 포트
- ② 체크섬
- ③ 확인 응답 번호
- ④ 길이
정답
③입니다. 확인 응답 번호는 받은 것을 확인해 주는 TCP에만 있습니다.
- ① 두 헤더에 모두 있습니다. 어느 프로그램이 보냈는지 가리킵니다.
- ② 두 헤더에 모두 있습니다. 데이터가 깨졌는지 검사합니다.
- ④ 거꾸로 UDP 헤더에만 있는, 데이터까지 센 전체 길이 칸입니다. TCP 헤더의 길이 칸은 헤더 길이 하나입니다.