전송 계층의 역할
전송 계층의 역할
1. 전송 계층이란?
전송 계층 개념
┌─────────────────────────────────────────────────────────────┐
│ 전송 계층 (Transport Layer) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 정의: │
│ • OSI 7계층 중 4계층 │
│ • 종단 간(End-to-End) 통신을 담당 │
│ • 신뢰성 있는 데이터 전송 보장 │
│ │
│ 주요 역할: │
│ ───────────────────────────────────────── │
│ 1. 신뢰성 있는 데이터 전송 │
│ 2. 오류 검출 및 재전송 │
│ 3. 흐름 제어 (Flow Control) │
│ 4. 혼잡 제어 (Congestion Control) │
│ 5. 포트 번호를 통한 애플리케이션 식별 │
│ │
│ 주요 프로토콜: │
│ • TCP (Transmission Control Protocol) │
│ • UDP (User Datagram Protocol) │
│ │
└─────────────────────────────────────────────────────────────┘OSI 7계층에서의 위치
┌─────────────────────────────────────────────────────────────┐
│ OSI 7계층 모델 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 7. 애플리케이션 계층 (Application Layer) │
│ • HTTP, FTP, SMTP, DNS │
│ • 사용자 인터페이스 │
│ │
│ 6. 프레젠테이션 계층 (Presentation Layer) │
│ • 데이터 형식 변환, 암호화 │
│ │
│ 5. 세션 계층 (Session Layer) │
│ • 세션 연결 관리 │
│ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ 4. 전송 계층 (Transport Layer) ← 여기 │ │
│ │ • TCP, UDP │ │
│ │ • 종단 간 통신 │ │
│ │ • 포트 번호 │ │
│ │ • 신뢰성 보장 │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ 3. 네트워크 계층 (Network Layer) │
│ • IP, ICMP, 라우팅 │
│ • 경로 설정 │
│ │
│ 2. 데이터링크 계층 (Data Link Layer) │
│ • MAC 주소, 스위치 │
│ • 프레임 전송 │
│ │
│ 1. 물리 계층 (Physical Layer) │
│ • 케이블, 허브 │
│ • 비트 전송 │
│ │
└─────────────────────────────────────────────────────────────┘
계층 간 데이터 전달:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 송신측: │
│ │
│ [애플리케이션] 데이터 │
│ │ │
│ ↓ 헤더 추가 │
│ [전송 계층] TCP/UDP 헤더 + 데이터 = 세그먼트 │
│ │ (포트 번호, 순서 번호 등) │
│ ↓ 헤더 추가 │
│ [네트워크] IP 헤더 + 세그먼트 = 패킷 │
│ │ (출발지/목적지 IP) │
│ ↓ 헤더 추가 │
│ [데이터링크] MAC 헤더 + 패킷 = 프레임 │
│ │ (출발지/목적지 MAC) │
│ ↓ │
│ [물리 계층] 비트 스트림 │
│ │
│ ↓ 네트워크 전송 ↓ │
│ │
│ 수신측: │
│ │
│ [물리 계층] 비트 스트림 │
│ ↓ │
│ [데이터링크] MAC 헤더 제거 │
│ ↓ │
│ [네트워크] IP 헤더 제거 │
│ ↓ │
│ [전송 계층] TCP/UDP 헤더 제거, 포트 번호 확인 │
│ ↓ │
│ [애플리케이션] 데이터 → 해당 애플리케이션으로 전달 │
│ │
└─────────────────────────────────────────────────────────────┘2. 전송 계층의 주요 기능
1) 신뢰성 있는 데이터 전송
┌─────────────────────────────────────────────────────────────┐
│ 신뢰성 보장 메커니즘 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 순서 번호 (Sequence Number) │
│ ───────────────────────────────────────── │
│ • 데이터를 순서대로 전송 │
│ • 수신측에서 순서대로 재조립 │
│ │
│ 예시: │
│ 송신: [1] [2] [3] [4] [5] │
│ 수신: [1] [3] [2] [5] [4] ← 순서 뒤바뀜 │
│ 재조립: [1] [2] [3] [4] [5] ← 순서 번호로 재정렬 │
│ │
├─────────────────────────────────────────────────────────────┤
│ │
│ 2. 확인 응답 (Acknowledgment, ACK) │
│ ───────────────────────────────────────── │
│ • 데이터를 받았음을 송신측에 알림 │
│ • ACK를 받지 못하면 재전송 │
│ │
│ [송신측] [수신측] │
│ │ │ │
│ ├──── 데이터 #1 ────→│ │
│ │←──── ACK #1 ───────┤ ✓ 받았음 │
│ │ │ │
│ ├──── 데이터 #2 ────→│ │
│ │ (손실!) │ │
│ │ │ ✗ ACK 없음 │
│ │ │ │
│ ├──── 데이터 #2 ────→│ 재전송! │
│ │←──── ACK #2 ───────┤ ✓ 받았음 │
│ │
├─────────────────────────────────────────────────────────────┤
│ │
│ 3. 체크섬 (Checksum) │
│ ───────────────────────────────────────── │
│ • 데이터 오류 검출 │
│ • 헤더와 데이터에 대한 체크섬 계산 │
│ • 수신측에서 재계산하여 비교 │
│ │
│ 송신측: │
│ 데이터: "Hello" → 체크섬 계산 → 0x1A2B │
│ │
│ 수신측: │
│ 데이터: "Hello" → 체크섬 계산 → 0x1A2B ✓ 일치, 정상 │
│ 데이터: "Hxllo" → 체크섬 계산 → 0x3C4D ✗ 불일치, 오류! │
│ │
└─────────────────────────────────────────────────────────────┘2) 포트 번호를 통한 애플리케이션 식별
┌─────────────────────────────────────────────────────────────┐
│ 포트 번호 (Port Number) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 정의: │
│ • 0 ~ 65535 범위의 16비트 숫자 │
│ • 같은 컴퓨터에서 실행되는 여러 애플리케이션 구분 │
│ • IP 주소 + 포트 번호 = 소켓 (Socket) │
│ │
│ 분류: │
│ ───────────────────────────────────────── │
│ • Well-Known Ports (0 ~ 1023) │
│ 시스템/표준 서비스용 │
│ │
│ • Registered Ports (1024 ~ 49151) │
│ 사용자 애플리케이션용 │
│ │
│ • Dynamic/Private Ports (49152 ~ 65535) │
│ 임시 포트 (클라이언트가 사용) │
│ │
└─────────────────────────────────────────────────────────────┘
포트 번호 사용 예시:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 컴퓨터 (IP: 192.168.1.10) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌───────────┐ │ │
│ │ │ 웹 브라우저 │ │ 이메일 클라이언트│ │ FTP │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ 포트 52341 │ │ 포트 52342 │ │ 포트 52343│ │ │
│ │ └──────┬───────┘ └──────┬───────┘ └─────┬─────┘ │ │
│ │ │ │ │ │ │
│ │ └─────────────────┴────────────────┘ │ │
│ │ │ │ │
│ │ [전송 계층] │ │
│ │ │ │ │
│ └───────────────────────────┼──────────────────────────┘ │
│ ↓ │
└──────────────────────────────┼─────────────────────────────┘
│
[네트워크]
│
┌──────────────────────────────┼─────────────────────────────┐
│ ↓ │
│ 서버 (IP: 203.0.113.50) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ [전송 계층] │ │
│ │ │ │ │
│ │ ┌─────────────────┴────────────────┐ │ │
│ │ │ │ │ │ │
│ │ ┌──────┴───────┐ ┌──────┴───────┐ ┌─────┴─────┐ │ │
│ │ │ 웹 서버 │ │ 메일 서버 │ │ FTP 서버 │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ 포트 80 │ │ 포트 25 │ │ 포트 21 │ │ │
│ │ └──────────────┘ └──────────────┘ └───────────┘ │ │
│ │ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
통신 예시:
• 웹 브라우저 (192.168.1.10:52341) → 웹 서버 (203.0.113.50:80)
• 이메일 (192.168.1.10:52342) → 메일 서버 (203.0.113.50:25)주요 포트 번호
┌─────────────────────────────────────────────────────────────┐
│ Well-Known Ports (0-1023) │
├──────────┬────────────────────────────────────────────────┤
│ 포트번호 │ 서비스/프로토콜 │
├──────────┼────────────────────────────────────────────────┤
│ 20 │ FTP (데이터 전송) │
│ 21 │ FTP (제어) │
│ 22 │ SSH (Secure Shell) │
│ 23 │ Telnet │
│ 25 │ SMTP (메일 전송) │
│ 53 │ DNS (Domain Name System) │
│ 67 │ DHCP (서버) │
│ 68 │ DHCP (클라이언트) │
│ 80 │ HTTP (웹) │
│ 110 │ POP3 (메일 수신) │
│ 143 │ IMAP (메일 수신) │
│ 443 │ HTTPS (보안 웹) │
│ 465 │ SMTPS (보안 메일 전송) │
│ 993 │ IMAPS (보안 IMAP) │
│ 995 │ POP3S (보안 POP3) │
│ 3306 │ MySQL │
│ 3389 │ RDP (원격 데스크톱) │
│ 5432 │ PostgreSQL │
│ 8080 │ HTTP 대체 포트 │
└──────────┴────────────────────────────────────────────────┘
포트 번호 확인 명령어:
Windows:
> netstat -an
프로토콜 로컬 주소 외부 주소 상태
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING
TCP 192.168.1.10:52341 203.0.113.50:80 ESTABLISHED
Linux:
$ netstat -tuln
$ ss -tuln
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
tcp ESTAB 0 0 192.168.1.10:52341 203.0.113.50:803. TCP vs UDP
전송 계층의 두 가지 프로토콜
┌─────────────────────────────────────────────────────────────┐
│ TCP vs UDP │
├─────────────────────────────────────────────────────────────┤
│ │
│ TCP (Transmission Control Protocol) │
│ ───────────────────────────────────────── │
│ • 연결 지향형 (Connection-Oriented) │
│ • 신뢰성 보장 │
│ • 순서 보장 │
│ • 흐름 제어, 혼잡 제어 │
│ • 느리지만 정확 │
│ │
│ 사용 예: │
│ • 웹 (HTTP/HTTPS) │
│ • 이메일 (SMTP, POP3, IMAP) │
│ • 파일 전송 (FTP) │
│ • 원격 접속 (SSH, Telnet) │
│ │
├─────────────────────────────────────────────────────────────┤
│ │
│ UDP (User Datagram Protocol) │
│ ───────────────────────────────────────── │
│ • 비연결형 (Connectionless) │
│ • 신뢰성 보장 없음 │
│ • 순서 보장 없음 │
│ • 빠르지만 손실 가능 │
│ │
│ 사용 예: │
│ • 실시간 스트리밍 (음성, 영상) │
│ • DNS 쿼리 │
│ • DHCP │
│ • 온라인 게임 │
│ • IoT 센서 데이터 │
│ │
└─────────────────────────────────────────────────────────────┘상세 비교
┌─────────────────────────────────────────────────────────────┐
│ TCP vs UDP 상세 비교 │
├──────────────────┬────────────────────┬─────────────────────┤
│ 항목 │ TCP │ UDP │
├──────────────────┼────────────────────┼─────────────────────┤
│ 연결 방식 │ 연결 지향 │ 비연결형 │
│ │ (3-way handshake) │ (연결 설정 없음) │
├──────────────────┼────────────────────┼─────────────────────┤
│ 신뢰성 │ 보장됨 │ 보장 안 됨 │
│ │ (ACK, 재전송) │ │
├──────────────────┼────────────────────┼─────────────────────┤
│ 순서 보장 │ 보장됨 │ 보장 안 됨 │
│ │ (순서 번호) │ │
├──────────────────┼────────────────────┼─────────────────────┤
│ 속도 │ 느림 │ 빠름 │
│ │ (오버헤드 큼) │ (오버헤드 작음) │
├──────────────────┼────────────────────┼─────────────────────┤
│ 헤더 크기 │ 20~60 바이트 │ 8 바이트 (고정) │
├──────────────────┼────────────────────┼─────────────────────┤
│ 흐름 제어 │ 있음 │ 없음 │
│ │ (윈도우 크기) │ │
├──────────────────┼────────────────────┼─────────────────────┤
│ 혼잡 제어 │ 있음 │ 없음 │
├──────────────────┼────────────────────┼─────────────────────┤
│ 오류 검출 │ 체크섬 + 재전송 │ 체크섬만 │
├──────────────────┼────────────────────┼─────────────────────┤
│ 브로드캐스트 │ 지원 안 함 │ 지원 │
├──────────────────┼────────────────────┼─────────────────────┤
│ 멀티캐스트 │ 지원 안 함 │ 지원 │
├──────────────────┼────────────────────┼─────────────────────┤
│ 통신 방식 │ 1:1 (유니캐스트) │ 1:1, 1:다, 다:다 │
├──────────────────┼────────────────────┼─────────────────────┤
│ 사용 시나리오 │ 정확성이 중요 │ 속도가 중요 │
│ │ (파일 전송, 웹) │ (스트리밍, 게임) │
└──────────────────┴────────────────────┴─────────────────────┘선택 기준
TCP를 사용해야 하는 경우:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌─────────────────────────────────────────────────────────────┐
│ │
│ • 데이터 손실이 허용되지 않는 경우 │
│ 예: 파일 다운로드, 이메일, 금융 거래 │
│ │
│ • 순서가 중요한 경우 │
│ 예: 텍스트 메시지, 데이터베이스 쿼리 │
│ │
│ • 연결 상태가 중요한 경우 │
│ 예: 로그인 세션, API 호출 │
│ │
│ • 신뢰성이 최우선인 경우 │
│ 예: 원격 접속 (SSH), 설정 파일 전송 │
│ │
└─────────────────────────────────────────────────────────────┘
UDP를 사용해야 하는 경우:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌─────────────────────────────────────────────────────────────┐
│ │
│ • 실시간성이 중요한 경우 │
│ 예: 음성 통화, 화상 회의, 라이브 스트리밍 │
│ │
│ • 약간의 데이터 손실이 허용되는 경우 │
│ 예: 비디오 스트리밍 (일부 프레임 손실 OK) │
│ │
│ • 작은 데이터를 빠르게 보내야 하는 경우 │
│ 예: DNS 쿼리, DHCP, SNMP │
│ │
│ • 브로드캐스트/멀티캐스트가 필요한 경우 │
│ 예: IPTV, 온라인 게임 (위치 브로드캐스트) │
│ │
│ • 많은 클라이언트에게 동시 전송 │
│ 예: IoT 센서 데이터 수집 │
│ │
└─────────────────────────────────────────────────────────────┘
비유로 이해하기:
TCP = 등기우편
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 받는 사람 확인 (연결 설정)
• 수령 확인 (ACK)
• 분실 시 재전송
• 순서 보장
• 느리지만 확실
UDP = 일반우편
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 그냥 발송 (연결 없음)
• 수령 확인 없음
• 분실 가능
• 순서 뒤바뀔 수 있음
• 빠르지만 불확실4. TCP (연결형 통신)
TCP 헤더 구조
┌─────────────────────────────────────────────────────────────┐
│ TCP 헤더 구조 │
│ (20~60 바이트) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 0 16 31 │
│ ├────────────────────┼────────────────────┤ │
│ │ 출발지 포트 │ 목적지 포트 │ │
│ │ (16비트) │ (16비트) │ │
│ ├────────────────────┴────────────────────┤ │
│ │ 순서 번호 (Sequence Number) │ │
│ │ (32비트) │ │
│ ├─────────────────────────────────────────┤ │
│ │ 확인 응답 번호 (ACK Number) │ │
│ │ (32비트) │ │
│ ├────────┬────────┬──────────────────────┤ │
│ │헤더길이│예약 │ 플래그 (6비트) │ │
│ │(4비트) │(6비트) │ URG ACK PSH RST SYN FIN │
│ ├────────┴────────┴──────────────────────┤ │
│ │ 윈도우 크기 (16비트) │ │
│ │ (흐름 제어용) │ │
│ ├─────────────────────────────────────────┤ │
│ │ 체크섬 (16비트) │ 긴급 포인터(16비트)│ │
│ ├─────────────────────────────────────────┤ │
│ │ 옵션 (0~40 바이트) │ │
│ ├─────────────────────────────────────────┤ │
│ │ 데이터 │ │
│ │ ... │ │
│ └─────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
주요 필드 설명:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 출발지/목적지 포트: │
│ • 애플리케이션 식별 │
│ │
│ 순서 번호 (Sequence Number): │
│ • 전송하는 데이터의 순서 │
│ • 수신측이 순서대로 재조립 │
│ │
│ 확인 응답 번호 (ACK Number): │
│ • 다음에 받을 데이터의 순서 번호 │
│ • "여기까지 받았으니 다음 거 보내" │
│ │
│ 플래그 (Flags): │
│ • URG: 긴급 데이터 │
│ • ACK: 확인 응답 │
│ • PSH: 즉시 전달 (버퍼링 없이) │
│ • RST: 연결 리셋 │
│ • SYN: 연결 시작 │
│ • FIN: 연결 종료 │
│ │
│ 윈도우 크기: │
│ • 한 번에 받을 수 있는 데이터 크기 │
│ • 흐름 제어에 사용 │
│ │
└─────────────────────────────────────────────────────────────┘3-Way Handshake (연결 설정)
┌─────────────────────────────────────────────────────────────┐
│ 3-Way Handshake (TCP 연결 설정) │
├─────────────────────────────────────────────────────────────┤
│ │
│ [클라이언트] [서버] │
│ (CLOSED) (LISTEN) │
│ │ │ │
│ │ 1. SYN │ │
│ │ (SYN=1, Seq=100) │ │
│ ├────────────────────────────────────────→│ │
│ │ │ │
│ (SYN_SENT) (SYN_RECEIVED) │
│ │ │ │
│ │ 2. SYN + ACK │ │
│ │ (SYN=1, ACK=1, Seq=200, Ack=101) │ │
│ │←────────────────────────────────────────│ │
│ │ │ │
│ │ 3. ACK │ │
│ │ (ACK=1, Seq=101, Ack=201) │ │
│ ├────────────────────────────────────────→│ │
│ │ │ │
│ (ESTABLISHED) (ESTABLISHED) │
│ │ │ │
│ │ ─────── 데이터 전송 가능 ───── │ │
│ │ │ │
└─────────────────────────────────────────────────────────────┘
단계별 설명:
Step 1: SYN (연결 요청)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 클라이언트 → 서버
• SYN 플래그 = 1
• 초기 순서 번호(ISN) 전송: Seq=100
• 의미: "연결하고 싶어요. 내 시작 번호는 100이에요"
Step 2: SYN + ACK (연결 승인)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 서버 → 클라이언트
• SYN 플래그 = 1, ACK 플래그 = 1
• 서버의 순서 번호: Seq=200
• 확인 번호: Ack=101 (클라이언트 Seq+1)
• 의미: "OK! 내 시작 번호는 200이고, 당신 101번 기다릴게요"
Step 3: ACK (연결 확인)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 클라이언트 → 서버
• ACK 플래그 = 1
• 순서 번호: Seq=101
• 확인 번호: Ack=201 (서버 Seq+1)
• 의미: "알았어요! 당신 201번 기다릴게요. 이제 시작!"
→ 양방향 연결 설정 완료!4-Way Handshake (연결 종료)
┌─────────────────────────────────────────────────────────────┐
│ 4-Way Handshake (TCP 연결 종료) │
├─────────────────────────────────────────────────────────────┤
│ │
│ [클라이언트] [서버] │
│ (ESTABLISHED) (ESTABLISHED) │
│ │ │ │
│ │ 1. FIN │ │
│ │ (FIN=1, Seq=300) │ │
│ ├────────────────────────────────────────→│ │
│ │ │ │
│ (FIN_WAIT_1) (CLOSE_WAIT) │
│ │ │ │
│ │ 2. ACK │ │
│ │ (ACK=1, Ack=301) │ │
│ │←────────────────────────────────────────│ │
│ │ │ │
│ (FIN_WAIT_2) │ │
│ │ │ │
│ │ (서버가 남은 데이터 전송) │ │
│ │ │ │
│ │ 3. FIN (LAST_ACK) │
│ │ (FIN=1, Seq=400) │ │
│ │←────────────────────────────────────────│ │
│ │ │ │
│ (TIME_WAIT) │ │
│ │ │ │
│ │ 4. ACK │ │
│ │ (ACK=1, Ack=401) │ │
│ ├────────────────────────────────────────→│ │
│ │ │ │
│ │ (일정 시간 대기: 2 × MSL) │ │
│ │ (CLOSED) │
│ (CLOSED) │ │
│ │
└─────────────────────────────────────────────────────────────┘
단계별 설명:
Step 1: FIN (연결 종료 요청)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 클라이언트 → 서버
• FIN 플래그 = 1
• 의미: "나는 더 이상 보낼 데이터 없어요. 종료할게요"
Step 2: ACK (종료 승인)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 서버 → 클라이언트
• ACK 플래그 = 1
• 의미: "알았어요. 잠깐만 기다려요 (남은 데이터 보낼게요)"
Step 3: FIN (서버도 종료)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 서버 → 클라이언트
• FIN 플래그 = 1
• 의미: "이제 나도 다 보냈어요. 종료할게요"
Step 4: ACK (최종 확인)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 클라이언트 → 서버
• ACK 플래그 = 1
• 의미: "알았어요. 안녕히 계세요"
• TIME_WAIT: 늦게 도착하는 패킷 대기 (보통 2분)
→ 연결 완전히 종료!
왜 4-Way일까?
• 3-Way는 SYN+ACK를 한 번에 보냄
• 4-Way는 서버가 ACK를 먼저 보내고, 남은 데이터를 보낸 후 FIN 전송
• 즉, 서버는 ACK와 FIN을 따로 보냄5. UDP (비연결형 통신)
UDP 헤더 구조
┌─────────────────────────────────────────────────────────────┐
│ UDP 헤더 구조 │
│ (8 바이트 고정) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 0 16 31 │
│ ├────────────────────┼────────────────────┤ │
│ │ 출발지 포트 │ 목적지 포트 │ │
│ │ (16비트) │ (16비트) │ │
│ ├────────────────────┼────────────────────┤ │
│ │ 길이 (16비트) │ 체크섬 (16비트) │ │
│ ├────────────────────┴────────────────────┤ │
│ │ │ │
│ │ 데이터 │ │
│ │ ... │ │
│ │ │ │
│ └─────────────────────────────────────────┘ │
│ │
│ • TCP 헤더(20~60바이트)보다 훨씬 작음 │
│ • 순서 번호, ACK 번호 없음 │
│ • 플래그, 윈도우 크기 없음 │
│ • 단순하고 빠름 │
│ │
└─────────────────────────────────────────────────────────────┘UDP 통신 과정
UDP 통신 (연결 없음):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌─────────────────────────────────────────────────────────────┐
│ │
│ [송신측] [수신측] │
│ │ │ │
│ │ │ │
│ │ 데이터그램 #1 │ │
│ ├──────────────────────────────────────────→│ │
│ │ │ ✓ 받음 │
│ │ 데이터그램 #2 │ │
│ ├──────────────────────────────────────────→│ │
│ │ (손실!) │ ✗ 못 받음 │
│ │ │ │
│ │ 데이터그램 #3 │ │
│ ├──────────────────────────────────────────→│ │
│ │ │ ✓ 받음 │
│ │ │ │
│ │ 데이터그램 #4 │ │
│ ├──────────────────────────────────────────→│ │
│ │ │ ✓ 받음 │
│ │ │ │
│ │ ← ACK 없음! 재전송 없음! │ │
│ │ │ │
│ │
│ 특징: │
│ • 연결 설정 없이 바로 전송 │
│ • 확인 응답(ACK) 없음 │
│ • 손실되어도 재전송 안 함 │
│ • 순서 보장 안 함 (#3이 #4보다 늦게 도착 가능) │
│ │
└─────────────────────────────────────────────────────────────┘
UDP 사용 예시:
DNS 쿼리:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[클라이언트] [DNS 서버]
│ │
│ "google.com IP 주소는?" │
├──────────────────────────────→│
│ │
│ "172.217.175.46" │
│←──────────────────────────────│
│ │
• 한 번만 주고받으면 끝
• 연결 설정 오버헤드 없음
• 빠른 응답 가능
• 실패하면 재시도 (애플리케이션 레벨)
실시간 스트리밍:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[스트리밍 서버] [플레이어]
│ │
├──── 프레임 #1 ─────────────→│ ✓
├──── 프레임 #2 ─────────────→│ ✗ 손실
├──── 프레임 #3 ─────────────→│ ✓
├──── 프레임 #4 ─────────────→│ ✓
│ │
• 프레임 #2 손실되어도 재전송 안 함
• 실시간성이 더 중요
• 약간의 화질 저하는 허용
• 빠른 전송이 우선6. 흐름 제어와 혼잡 제어
흐름 제어 (Flow Control)
┌─────────────────────────────────────────────────────────────┐
│ 흐름 제어 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 목적: │
│ • 송신측과 수신측의 처리 속도 차이 조절 │
│ • 수신측이 처리할 수 있는 만큼만 전송 │
│ • 수신 버퍼 오버플로우 방지 │
│ │
│ 방법: 슬라이딩 윈도우 (Sliding Window) │
│ │
└─────────────────────────────────────────────────────────────┘
슬라이딩 윈도우 동작:
┌─────────────────────────────────────────────────────────────┐
│ │
│ [송신측 버퍼] │
│ ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │
│ │1 │2 │3 │4 │5 │6 │7 │8 │9 │10│ │
│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │
│ ├────────┤ │
│ 윈도우 크기 = 4 │
│ (한 번에 4개까지 전송 가능) │
│ │
│ │
│ Step 1: 1~4번 전송 │
│ ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │
│ │1 │2 │3 │4 │5 │6 │7 │8 │9 │10│ │
│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │
│ ├────────┤ │
│ 전송 완료, ACK 대기 │
│ │
│ Step 2: 1~2번 ACK 받음 → 윈도우 슬라이딩 │
│ ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐ │
│ │✓│✓│3 │4 │5 │6 │7 │8 │9 │10│ │
│ └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘ │
│ ├────────┤ │
│ 새 윈도우 (3~6) │
│ │
│ Step 3: 5~6번 추가 전송 │
│ │
│ │
│ [수신측] │
│ 윈도우 크기 = 수신 버퍼 여유 공간 │
│ • 버퍼가 가득 차면 윈도우 크기 = 0 → 전송 중단 │
│ • 버퍼가 비면 윈도우 크기 증가 → 전송 재개 │
│ │
└─────────────────────────────────────────────────────────────┘혼잡 제어 (Congestion Control)
┌─────────────────────────────────────────────────────────────┐
│ 혼잡 제어 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 목적: │
│ • 네트워크 혼잡 방지 │
│ • 네트워크 전체의 성능 유지 │
│ • 패킷 손실 최소화 │
│ │
│ 방법: │
│ 1. Slow Start (천천히 시작) │
│ 2. Congestion Avoidance (혼잡 회피) │
│ 3. Fast Retransmit (빠른 재전송) │
│ 4. Fast Recovery (빠른 회복) │
│ │
└─────────────────────────────────────────────────────────────┘
혼잡 윈도우 크기 변화:
윈도우 크기
↑
│ 혼잡 감지!
│ ↓
16 │ ╱╲
│ ╱ ╲
14 │ ╱ ╲
│ ╱ ╲
12 │ ╱ ╲ Congestion
│ ╱ ╲ Avoidance
10 │ ╱ ╲ (선형 증가)
│ ╱ ╲
8 │ ╱ ╲╱╲
│ ╱ ╲
6 │ ╱ ╲
│ ╱ ╲
4 │ ╱ Slow Start ╲
│ ╱ (지수 증가) ╲
2 │ ╱ ╲
│ ╱ ╲
1 │ ─────╱ ╲────
│
└────────────────────────────────────────────────→ 시간
단계별 설명:
1. Slow Start (느린 시작)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 처음에는 윈도우 크기 = 1
• ACK 받을 때마다 2배로 증가 (1→2→4→8→16...)
• 빠르게 네트워크 용량 탐색
2. Congestion Avoidance (혼잡 회피)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 임계값(ssthresh)에 도달하면 선형 증가
• ACK 받을 때마다 1씩 증가
• 혼잡 발생 가능성 줄임
3. Fast Retransmit (빠른 재전송)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 중복 ACK 3개 받으면 즉시 재전송
• 타임아웃 기다리지 않음
4. Fast Recovery (빠른 회복)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 혼잡 감지 시 윈도우 크기를 절반으로
• 1부터 다시 시작하지 않음핵심 정리
| 개념 | 설명 |
|---|---|
| 전송 계층 | OSI 4계층, 종단 간 신뢰성 있는 데이터 전송 |
| 포트 번호 | 애플리케이션 식별 (0~65535) |
| TCP | 연결 지향, 신뢰성 보장, 순서 보장 |
| UDP | 비연결형, 빠른 전송, 신뢰성 보장 없음 |
| 3-Way Handshake | TCP 연결 설정 (SYN → SYN+ACK → ACK) |
| 4-Way Handshake | TCP 연결 종료 (FIN → ACK → FIN → ACK) |
| 흐름 제어 | 송수신 속도 조절 (슬라이딩 윈도우) |
| 혼잡 제어 | 네트워크 혼잡 방지 (Slow Start, Congestion Avoidance) |
전송 계층 요약
┌─────────────────────────────────────────────────────────────┐
│ 전송 계층 핵심 개념 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 역할: │
│ 1. 종단 간(End-to-End) 통신 │
│ 2. 신뢰성 있는 데이터 전송 │
│ 3. 포트 번호로 애플리케이션 식별 │
│ 4. 흐름 제어 및 혼잡 제어 │
│ │
│ 프로토콜 선택: │
│ • 신뢰성 중요 → TCP │
│ • 속도 중요 → UDP │
│ │
│ TCP 특징: │
│ • 연결 설정 (3-Way Handshake) │
│ • 데이터 전송 │
│ • 연결 종료 (4-Way Handshake) │
│ • 순서 보장, 재전송, 흐름/혼잡 제어 │
│ │
│ UDP 특징: │
│ • 연결 없이 바로 전송 │
│ • 빠르지만 신뢰성 없음 │
│ • 실시간 애플리케이션에 적합 │
│ │
└─────────────────────────────────────────────────────────────┘
프로토콜 선택 플로차트:
데이터 전송 필요
│
↓
┌───────────────┐
│ 데이터 손실이 │
│ 허용되는가? │
└───────┬───────┘
│
┌───────┴───────┐
│ │
YES NO
│ │
↓ ↓
┌───────┐ ┌───────┐
│ UDP │ │ TCP │
└───────┘ └───────┘
│ │
↓ ↓
• 스트리밍 • 웹 (HTTP)
• DNS • 이메일
• 게임 • 파일 전송
• VoIP • SSH용어 정리
- 전송 계층 (Transport Layer): OSI 7계층 중 4계층, 종단 간 신뢰성 있는 데이터 전송 담당
- TCP (Transmission Control Protocol): 연결 지향형, 신뢰성 보장 프로토콜
- UDP (User Datagram Protocol): 비연결형, 빠른 전송 프로토콜
- 포트 번호 (Port Number): 애플리케이션을 식별하는 16비트 숫자 (0~65535)
- 세그먼트 (Segment): 전송 계층의 데이터 단위
- 순서 번호 (Sequence Number): 데이터의 순서를 나타내는 번호
- 확인 응답 (ACK, Acknowledgment): 데이터 수신 확인
- 3-Way Handshake: TCP 연결 설정 과정 (SYN → SYN+ACK → ACK)
- 4-Way Handshake: TCP 연결 종료 과정 (FIN → ACK → FIN → ACK)
- 흐름 제어 (Flow Control): 송수신 속도 조절
- 혼잡 제어 (Congestion Control): 네트워크 혼잡 방지
- 슬라이딩 윈도우 (Sliding Window): 흐름 제어 기법
- 체크섬 (Checksum): 오류 검출을 위한 값