전송 계층의 역할

전송 계층의 역할

전송 계층의 역할

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:80

3. 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 HandshakeTCP 연결 설정 (SYN → SYN+ACK → ACK)
4-Way HandshakeTCP 연결 종료 (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): 오류 검출을 위한 값