📌 네트워크 기본 개념: TCP/UDP, 핸드셰이크, 소켓 상태, 라우팅, 서브넷
1. TCP와 UDP 개요
TCP와 UDP는 전송 계층(Transport Layer, L4)에서 사용되는 대표적인 프로토콜이다.
프로토콜 | 특징 | 장점 | 단점 |
---|---|---|---|
TCP (Transmission Control Protocol) | 연결 지향(Connection-oriented), 신뢰성 보장 | 신뢰성 높은 데이터 전송, 패킷 순서 보장 | 속도가 느림, 오버헤드 발생 |
UDP (User Datagram Protocol) | 비연결 지향(Connectionless), 신뢰성 없음 | 빠른 전송 속도, 실시간 데이터 전송에 적합 | 패킷 손실 가능성 있음, 흐름제어 없음 |
💡 TCP는 신뢰성이 필요한 통신 (예: 웹 브라우징, 이메일)에 사용되고,
💡 UDP는 속도가 중요한 서비스 (예: 스트리밍, 온라인 게임, VoIP)에 적합하다.
2. TCP 3-Way Handshake (3단계 핸드셰이크)
TCP는 신뢰성 있는 연결을 위해 3-Way Handshake 과정을 거친다.
📌 3단계 핸드셰이크 과정
1️⃣ SYN (Synchronize) 전송 → 클라이언트가 서버에게 연결 요청
2️⃣ SYN-ACK (Synchronize + Acknowledgment) 응답 → 서버가 요청 수락
3️⃣ ACK (Acknowledgment) 전송 → 클라이언트가 최종 확인 후 연결 확립
🔽 패킷 흐름
클라이언트 → [SYN] → 서버
클라이언트 ← [SYN-ACK] ← 서버
클라이언트 → [ACK] → 서버
➡ 연결이 완료되면 데이터 전송 시작!
✅ 3-Way Handshake의 특징
✔ 양쪽이 서로 통신 가능 상태인지 확인
✔ 패킷 전달 경로를 확립하고 신뢰성을 보장
3. TCP 4-Way Handshake (4단계 핸드셰이크)
TCP 연결을 종료할 때는 4-Way Handshake를 사용한다.
📌 4단계 핸드셰이크 과정
1️⃣ FIN 전송 → 클라이언트가 연결 종료 요청
2️⃣ ACK 응답 → 서버가 확인
3️⃣ FIN 전송 → 서버도 연결 종료 요청
4️⃣ ACK 응답 → 클라이언트가 확인 후 종료
🔽 패킷 흐름
클라이언트 → [FIN] → 서버
클라이언트 ← [ACK] ← 서버
클라이언트 ← [FIN] ← 서버
클라이언트 → [ACK] → 서버
➡ 연결이 완전히 종료됨!
✅ 4-Way Handshake의 특징
✔ 데이터 손실을 방지하고 정상적인 종료를 보장
✔ TCP의 신뢰성을 유지하면서 연결을 끊음
4. 리눅스의 소켓 상태
리눅스에서 netstat -an
또는 ss -an
명령어를 사용하면 소켓 상태를 확인할 수 있다.
📌 TCP 소켓 상태
상태 | 설명 |
---|---|
LISTEN | 서버가 클라이언트의 연결을 기다리는 상태 |
SYN_SENT | 클라이언트가 SYN 패킷을 보내고 응답을 기다리는 상태 |
SYN_RECEIVED | 서버가 SYN을 받고 SYN-ACK를 보낸 상태 |
ESTABLISHED | 양쪽 연결이 완료된 상태 |
FIN_WAIT_1 | 클라이언트가 FIN을 보내고 종료 대기 |
FIN_WAIT_2 | 서버가 ACK를 보냈지만 FIN을 아직 안 보낸 상태 |
CLOSE_WAIT | 서버가 FIN을 받고 응답을 기다리는 상태 |
LAST_ACK | 서버가 마지막 ACK를 보내고 종료 준비 상태 |
TIME_WAIT | 모든 패킷이 정리될 때까지 기다리는 상태 |
5. 3계층 레벨의 라우팅
네트워크 계층(L3)에서 라우팅(Routing)은 패킷을 최적의 경로로 전달하는 과정이다.
📌 주요 라우팅 기법
✔ 정적 라우팅 (Static Routing) → 수동으로 경로 설정
✔ 동적 라우팅 (Dynamic Routing) → 라우터가 자동으로 경로 업데이트
📌 주요 라우팅 프로토콜
- RIP (Routing Information Protocol): 홉(hop) 수 기반, 소규모 네트워크에서 사용
- OSPF (Open Shortest Path First): 최단 경로 알고리즘 사용, 대규모 네트워크에서 효율적
- BGP (Border Gateway Protocol): 인터넷의 핵심 프로토콜
🔎 라우팅 테이블 확인 명령어 (리눅스)
ip route show
6. IP 서브넷과 서브넷 마스크
📌 IP 주소 체계
IPv4 주소는 네트워크 주소 + 호스트 주소로 구성된다.
예) 192.168.1.10/24
→ 네트워크 주소 192.168.1.0
, 호스트 10
📌 서브넷 마스크
서브넷 마스크는 네트워크와 호스트를 구분하는 역할을 한다.
| CIDR 표기 | 서브넷 마스크 | 최대 호스트 수 |
|-----------|--------------|---------------|
| /8
| 255.0.0.0
| 16,777,214 |
| /16
| 255.255.0.0
| 65,534 |
| /24
| 255.255.255.0
| 254 |
📌 서브넷 계산 예제 (Python)
```python
import ipaddress
서브넷 정보 출력
network = ipaddress.ip_network("192.168.1.0/24", strict=False)
print(f"네트워크 주소: {network.network_address}")
print(f"브로드캐스트 주소: {network.broadcast_address}")
print(f"사용 가능한 호스트 수: {network.num_addresses - 2}") # 네트워크, 브로드캐스트 제외
``