소켓(Socket): 네트워크 통신의 핵심 개념과 TCP/UDP 프로토콜
🔨 절차형
💡
학습 전략: 연습 (Practice)
즉시 실전에 적용해 보는 것이 핵심
소켓이란?
소켓(Socket)은 네트워크 통신의 기본 단위로, 두 프로그램 간의 양방향 통신 연결을 위한 엔드포인트입니다.
쉽게 말해, 소켓은 전화기의 연결 구멍과 같습니다. 전화를 걸거나 받기 위해서는 전화선을 연결할 구멍이 필요한 것처럼, 네트워크 통신을 하려면 소켓이 필요합니다.
네트워크 통신의 핵심 요소
네트워크에서 두 컴퓨터가 통신하려면 다음 세 가지 정보가 필요합니다:
- IP 주소: 통신 대상 컴퓨터의 위치
- 프로토콜: 통신 규칙 (TCP 또는 UDP)
- 포트 번호: 특정 애플리케이션 식별
예시: 웹 브라우저 통신
1
2
3
IP 주소: 192.168.0.1
프로토콜: TCP
포트: 80 (HTTP)
데이터 송수신 기본 구성
네트워크 계층 구성 요소
- NIC (Network Interface Card)
- 물리적인 네트워크 연결 장치
- LAN 카드라고도 불림
- 데이터를 전기 신호로 변환
- IP (Internet Protocol)
- 데이터 패킷의 주소 지정 및 라우팅
- 목적지까지 데이터 전달 책임
OSI 7계층 모델
네트워크 통신은 7개의 계층으로 나뉩니다:
| 계층 | 이름 | 역할 | 예시 |
|---|---|---|---|
| Layer 7 | 응용 계층 | 사용자 인터페이스 제공 | HTTP, FTP, SMTP |
| Layer 6 | 표현 계층 | 데이터 암호화/압축 | SSL, JPEG |
| Layer 5 | 세션 계층 | 세션 연결 관리 | NetBIOS |
| Layer 4 | 전송 계층 | 데이터 전송 방식 결정 | TCP, UDP |
| Layer 3 | 네트워크 계층 | 주소 지정 및 라우팅 | IP, ICMP |
| Layer 2 | 데이터 링크 계층 | 물리적 연결 관리 | Ethernet, MAC |
| Layer 1 | 물리 계층 | 비트 전송 | 케이블, 허브 |
프로토콜 종류
1. TCP (Transmission Control Protocol) - 연결형
신뢰성 있는 연결형 프로토콜로, 데이터 전송을 보장합니다.
특징
- 연결 지향: 3-way handshake로 연결 수립
- 신뢰성: 데이터 전송 보장, 재전송 메커니즘
- 순서 보장: 패킷 순서대로 전달
- 속도: UDP보다 느림
TCP를 사용하는 프로토콜
- SMTP (Simple Mail Transfer Protocol): 이메일 전송
- POP3 (Post Office Protocol): 이메일 수신
- Telnet: 원격 접속
- FTP (File Transfer Protocol): 파일 전송
- HTTP/HTTPS: 웹 브라우징
TCP 소켓 예제 (Python)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import socket
# 서버 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8080))
server_socket.listen(5)
print("서버 대기 중...")
client_socket, addr = server_socket.accept()
print(f"클라이언트 연결: {addr}")
# 데이터 수신
data = client_socket.recv(1024)
print(f"받은 데이터: {data.decode()}")
# 데이터 송신
client_socket.send("안녕하세요!".encode())
client_socket.close()
server_socket.close()
2. UDP (User Datagram Protocol) - 비연결형
빠르지만 신뢰성이 낮은 비연결형 프로토콜입니다.
특징
- 비연결 지향: 연결 수립 과정 없음
- 신뢰성 낮음: 데이터 전송 보장 안 함
- 순서 보장 안 함: 패킷 순서 뒤바뀔 수 있음
- 속도: TCP보다 빠름
UDP를 사용하는 프로토콜 및 서비스
- DNS: 도메인 이름 조회
- DHCP: IP 주소 할당
- 온라인 게임: 실시간 통신
- 스트리밍: 영상/음성 전송
- VoIP: 인터넷 전화
UDP 소켓 예제 (Python)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import socket
# UDP 소켓 생성
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.bind(('localhost', 9090))
print("UDP 서버 대기 중...")
data, addr = udp_socket.recvfrom(1024)
print(f"받은 데이터: {data.decode()}, 보낸 주소: {addr}")
# 응답 전송
udp_socket.sendto("응답 메시지".encode(), addr)
udp_socket.close()
Well-Known Ports (잘 알려진 포트)
포트 번호는 0~65535 범위이며, 특정 서비스에는 고정된 포트가 할당됩니다.
| 포트 번호 | 프로토콜 | 서비스 |
|---|---|---|
| 20, 21 | FTP | 파일 전송 |
| 22 | SSH | 보안 원격 접속 |
| 23 | Telnet | 원격 접속 |
| 25 | SMTP | 이메일 전송 |
| 53 | DNS | 도메인 이름 조회 |
| 80 | HTTP | 웹 브라우징 |
| 110 | POP3 | 이메일 수신 |
| 143 | IMAP | 이메일 수신 |
| 443 | HTTPS | 보안 웹 브라우징 |
| 3306 | MySQL | 데이터베이스 |
TCP vs UDP 비교
| 항목 | TCP | UDP |
|---|---|---|
| 연결 방식 | 연결형 (Connection-oriented) | 비연결형 (Connectionless) |
| 신뢰성 | 높음 ✅ | 낮음 ⚠️ |
| 속도 | 느림 | 빠름 ✅ |
| 순서 보장 | 보장 ✅ | 보장 안 함 |
| 데이터 경계 | 스트림 방식 | 데이터그램 방식 |
| 오버헤드 | 높음 | 낮음 |
| 사용 사례 | 파일 전송, 이메일, 웹 | 스트리밍, 게임, DNS |
소켓 프로그래밍 기본 흐름
TCP 소켓 통신 과정
서버
socket(): 소켓 생성bind(): IP 주소와 포트 바인딩listen(): 연결 대기accept(): 클라이언트 연결 수락recv()/send(): 데이터 송수신close(): 소켓 닫기
클라이언트
socket(): 소켓 생성connect(): 서버에 연결send()/recv(): 데이터 송수신close(): 소켓 닫기
C/C++ 소켓 프로그래밍
라이브러리 포함
1
2
3
4
5
6
7
// 표준 라이브러리
#include <sys/socket.h> // 소켓 함수
#include <netinet/in.h> // 인터넷 주소 구조체
#include <arpa/inet.h> // IP 주소 변환
// 사용자 정의 라이브러리
#include "myheader.h"
간단한 TCP 서버 예제 (C++)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
using namespace std;
int main() {
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
bind(server_fd, (struct sockaddr*)&address, sizeof(address));
listen(server_fd, 3);
int client_fd = accept(server_fd, nullptr, nullptr);
char buffer[1024] = {0};
read(client_fd, buffer, 1024);
cout << "받은 메시지: " << buffer << endl;
close(client_fd);
close(server_fd);
return 0;
}
결론
소켓은 네트워크 통신의 핵심 개념으로, TCP와 UDP 프로토콜을 통해 다양한 방식의 데이터 전송을 지원합니다.
- 신뢰성이 중요한 경우: TCP 사용 (파일 전송, 웹 브라우징)
- 속도가 중요한 경우: UDP 사용 (게임, 스트리밍)
OSI 7계층 모델과 포트 번호를 이해하면 네트워크 통신의 전체 구조를 파악할 수 있습니다.