Datagram Socket과 Stream Socket: UDP와 TCP 소켓 비교
네트워크 통신 방식에 따라 소켓은 크게 두 종류로 나뉜다. UDP 기반의 Datagram Socket과 TCP 기반의 Stream Socket이다.
1. Datagram Socket (UDP 기반)
| 항목 | 내용 |
|---|---|
| 기반 프로토콜 | UDP (User Datagram Protocol) |
| 연결 방식 | 비연결형 (Connectionless) |
| 신뢰성 | 없음 — 순서 보장 X, 재전송 X, 확인 응답 X |
| 오버헤드 | 작음 (빠르고 단순) |
| 용도 | 스트리밍(비디오/오디오), 실시간 게임, DNS 요청 |
C에서는 socket()의 두 번째 인자에 SOCK_DGRAM을 넘긴다.
int sockfd = socket(AF_INET, SOCK_DGRAM, 0); // SOCK_DGRAM이 핵심
내부 동작
- 데이터를 전송하면 데이터그램(Datagram) 단위로 만들어진다
- 각 데이터그램은 독립적으로 처리된다 (순서·재전송을 신경 쓰지 않음)
- 수신 측이 없어도 전송은 진행되므로, 전송 성공 여부를 알 수 없다
연결 상태를 유지하지 않고 sendto/recvfrom에서 주소를 직접 지정한다.
// 송신자
sendto(sockfd, msg, len, 0, (struct sockaddr *)&addr, sizeof(addr));
// 수신자
recvfrom(sockfd, buf, BUFLEN, 0, (struct sockaddr *)&from, &fromlen);
2. Stream Socket (TCP 기반)
| 항목 | 내용 |
|---|---|
| 기반 프로토콜 | TCP (Transmission Control Protocol) |
| 연결 방식 | 연결형 (Connection-oriented) — 통신 전 3-way handshake 필요 |
| 신뢰성 | 높음 — 순서 보장, 오류 검출, 재전송 |
| 흐름 제어 | 수신자가 감당할 수 있는 만큼만 전송 |
| 혼잡 제어 | 네트워크 상황에 따라 전송 속도 조절 |
| 용도 | 웹 서비스(HTTP), 이메일(SMTP), 파일 전송(FTP) |
속도는 느릴 수 있지만 신뢰성이 높다. C에서는 SOCK_STREAM을 넘긴다.
int sockfd = socket(AF_INET, SOCK_STREAM, 0); // SOCK_STREAM이 핵심
2-1. 연결 설정: 3-way handshake
3-way handshake는 양쪽 통신자가 연결을 동기화하고 준비됐는지 확인하는 과정이다.
| 단계 | 송신자 | 수신자 | 내용 |
|---|---|---|---|
| 1 | Client | Server | SYN, seq = x (연결 요청) |
| 2 | Server | Client | SYN + ACK, seq = y, ack = x+1 (수락 + 서버도 연결 요청) |
| 3 | Client | Server | ACK, seq = x+1, ack = y+1 (서버의 수락 확인) |
이 과정을 거치면 양쪽 모두 연결이 성립되어 데이터를 주고받을 수 있다.
2-2. 데이터 전송
- 데이터는 스트림(stream) 으로 보내지며, 내부적으로 작은 단위로 나뉘어 전송된다
- 각 패킷은 시퀀스 번호(sequence number) 를 가진다
- 수신자는 받은 데이터를 순서대로 조립하고,
ACK로 확인 메시지를 보낸다 - 손실된 패킷은 재전송한다
2-3. 연결 종료: 4-way handshake
| 단계 | 전송 | 플래그 | 설명 |
|---|---|---|---|
| 1 | A → B | FIN |
A가 종료 요청 |
| 2 | B → A | ACK |
B가 확인 |
| 3 | B → A | FIN |
B도 종료 요청 |
| 4 | A → B | ACK |
A가 확인하고 종료 |
3. 비교 요약
| 항목 | Datagram Socket (UDP) | Stream Socket (TCP) |
|---|---|---|
| 연결 여부 | 비연결 (Connectionless) | 연결 (Connection-oriented) |
| 연결 과정 | 없음 | 3-way handshake 필요 |
| 오류 처리 | 없음 | ACK + 재전송 |
| 신뢰성 | 낮음 | 높음 |
| 순서 보장 | 안 됨 | 됨 (시퀀스 번호 기반) |
| 속도 | 빠름 | 상대적으로 느림 |
| 오버헤드 | 작음 | 큼 |
| 사용 예시 | 실시간 전송, DNS 등 | 웹, 이메일, 파일 전송 등 |