이것저것

[SK shieldus Rookies 29기] 13일차 본문

SK Shieldus Rookies 29

[SK shieldus Rookies 29기] 13일차

atfield1988 2025. 12. 4. 13:09

저번 수업 시간에 이어서 TCP/UDP/IP를 배웠다.
사실 저번 복습 글에는 안 배운 내용이 포함되어 있었지만 뭔가 흐름상 끊기가 애매해서
따로 구글링을 통해 학습 한 뒤 복습용 글을 적었다.


흐름 제어 (Flow Control)

Window Size란?

  • 수신자가 한 번에 받을 수 있는 데이터 양
  • 송신자는 Window Size만큼만 데이터 전송 가능

예시 1 - Window Size 조정:

      송신호스트                          수신호스트

Window Size = 3000

SN=5000 (Data: 1400)
                       ------→
SN=6400 (Data: 1000)
                       ------→

                                         AN=7800
                                     Window Size = 1000 (감소)
                       ←------

SN=7800 (Data: 1000)
                       ------→

                                         AN=8800
                                     Window Size = 1500 (증가)
                  ←------

예시 2 - Window Size 0 (Stop-and-Wait):

        송신호스트                    수신호스트

전송 데이터: 1400 바이트
                       ------→
수신 데이터: 1000 바이트

                                  Window Size = 0
                                  (수신 버퍼 가득 참)
                       ←------

(송신 중지)

Keep-Alive 패킷 주기적 송신
(수신자 버퍼가 비워질 때까지 대기)

                                 Window Size = 1000
                                 (버퍼 비워짐)
                       ←------

데이터 전송 재개

📦 UDP vs TCP - Message-Oriented vs Stream-Oriented

UDP (Message-Oriented Transport Protocol)

4000 byte 데이터
    ↓
단편화하지 않음
    ↓
하나의 메시지로 전송 (4000 bytes 그대로)

특징:
- 상위 계층 데이터를 그대로 전송
- 데이터 전송이 완료될 때까지 다른 데이터 흐름에 영향 받지 않음

예시:

Ether Header + IP Header + UDP Header + 4000 bytes

상황에 관계없이 4000 bytes가 하나의 전송 단위

TCP (Stream-Oriented Transport Protocol)

4000 byte 데이터
    ↓
자동 단편화 (MSS 기준)
    ↓
여러 개의 Segment로 분할
    ↓
각 Segment별로 전송

특징:
- 상위 계층 데이터를 단편화
- 단편화를 통해 다수의 데이터들과 네트워크 자원을 공유

MSS별 예시:

예1) MSS = 5000 bytes인 경우

원본 4000 bytes
    ↓
분할 필요 없음 (MSS보다 작음)
    ↓
하나의 Segment: 4000 bytes (ID=747)

예2) MSS = 2000 bytes인 경우

원본 4000 bytes
    ↓
2000 + 2000 분할
    ↓
Segment 1: SN=1100, ID=332 (1500 bytes)
Segment 2: SN=2600, ID=332 (500 bytes)
Segment 3: SN=3100, ID=400 (1500 bytes)
Segment 4: SN=4600, ID=400 (500 bytes)

예3) MSS = 1400 bytes인 경우

원본 4000 bytes
    ↓
1400 + 1400 + 1200 분할
    ↓
Segment 1: SN=1100, ID=232 (1400 bytes)
Segment 2: SN=2500, ID=233 (1400 bytes)
Segment 3: SN=3900, ID=234 (1200 bytes)


IP Header 구조

IP Header 상세

크기: 기본 20바이트 (옵션 포함 최대 60바이트)

필드 구성:

Version (4 bits): IP 프로토콜 버전
HLEN (4 bits): Header Length (값 × 5 = byte 단위)
ToS (8 bits): Type of Service (우선순위)
Total Length (16 bits): 전체 길이 (헤더 + 데이터, 20-65,536 bytes)
Identification (16 bits): 패킷 단편화 식별자
Flags (3 bits): DF (Don't Fragment), MF (More Fragment)
Fragment Offset (13 bits): 단편의 위치
TTL (8 bits): Time To Live (홉 수)
Protocol (8 bits): 상위 프로토콜 (TCP:6, UDP:17, ICMP:1)
Header Checksum (16 bits): 헤더 검증
Source IP (32 bits): 송신자 IP 주소
Destination IP (32 bits): 수신자 IP 주소
Options (선택): 선택 옵션

📋 IP Header 필드 설명

필드 설명
Version IP 프로토콜의 버전을 나타내는 4비트 정보
HLEN Internet Header Length (값 × 5 = IP 헤더 크기)
ToS 패킷의 처리 우선순위
Total Length IP 헤더와 Payload를 포함한 바이트 크기
Identification 패킷 단편화 시 같은 패킷임을 식별하는 값
DF Don't Fragment 플래그 (단편화 금지)
MF More Fragment 플래그 (추가 단편 있음)
Fragment Offset 원본에서의 단편의 위치 (8 바이트 단위)
TTL 라우터를 거칠 때마다 -1, 0이 되면 폐기
Protocol 다음 프로토콜 (TCP=6, UDP=17, ICMP=1)
Header Checksum 헤더 오류 검증
Source IP 송신자 IP 주소
Destination IP 수신자 IP 주소

단편화 (Fragmentation)

단편화 개념

정의: MTU보다 큰 데이터그램을 작은 단위로 분할하여 전송

필요한 이유:

  • 각 네트워크의 MTU는 다름
  • 작은 MTU 네트워크를 거칠 수 없음

단편화 관련 필드:

  • Identification: 같은 패킷임을 식별
  • Flags: DF, MF 플래그
  • Fragment Offset: 단편의 위치

📦 단편화 예제

상황: 4000 byte 데이터그램이 3개로 단편화될 경우

원본 데이터그램: 4000 bytes

Fragment 1:
├─ Bytes: 0-1,399 (1,400 bytes)
├─ Offset = 0 / 8 = 0
└─ Identification: 14567

Fragment 2:
├─ Bytes: 1,400-2,799 (1,400 bytes)
├─ Offset = 1,400 / 8 = 175
└─ Identification: 14567

Fragment 3:
├─ Bytes: 2,800-3,999 (1,200 bytes)
├─ Offset = 2,800 / 8 = 350
└─ Identification: 14567

재조립: 최종 목적지 호스트에서만 수행

📊 MTU (Maximum Transfer Unit)

전송 매체 MTU (Bytes)
Ethernet v2 1500 (표준) ⭐
Ethernet LLC/SNAP 1492
Ethernet Jumbo Frames 1501-9216
WLAN (802.11) 7981
Token Ring 4464
FDDI 4352
IPv4 Path MTU 최소 68
IPv6 Path MTU 최소 1280

💾 MSS (Maximum Segment Size)

정의: TCP에서 전송할 수 있는 사용자 데이터의 최대 크기

MSS = MTU - IP Header (20) - TCP Header (20)
    = 1500 - 20 - 20
    = 1460 bytes


TTL (Time To Live)

TTL 개념

정의: 패킷이 네트워크에서 생존할 수 있는 최대 홉(hop) 수

동작:

초기 TTL: 64 (또는 128, 255 등)

Router 1 통과: TTL = 63
Router 2 통과: TTL = 62
Router 3 통과: TTL = 61
Router 4 통과: TTL = 60
...
Router N 통과: TTL = 0
            → 라우터에서 패킷 폐기
            → ICMP Time Exceeded 전송

목적:

  • 패킷 무한 루프 방지
  • 잘못된 경로의 패킷 제거

OS별 기본 TTL 값

OS/Version TCP TTL UDP TTL
Linux 64 64
Windows 10 64 64
Windows Server 2008 128 128
Solaris 2.x 255 255
HP/UX 10.01 64 64

Windows에서 TTL 설정 변경

# TTL 확인
C:\> netsh interface ipv4 show global

# TTL 변경
C:\> netsh interface ipv4 set global defaultcurhoplimit=64

# 레지스트리 직접 변경
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Name: DefaultTTL
Type: REG_DWORD
Valid Range: 1-255

ICMP 프로토콜

ICMP란?

ICMP (Internet Control Message Protocol)

목적:

  • IP 프로토콜의 부족한 기능 보완
  • 오류 보고
  • 진단 기능
  • 상황 정보 제공

📊 ICMP 메시지 종류

오류 보고 메시지 (Error Reporting)

Type Code 설명
3 0 Network Unreachable (라우터 발생)
3 1 Host Unreachable (마지막 라우터 발생)
3 2 Protocol Unreachable (목적지 호스트 발생)
3 3 Port Unreachable (목적지 호스트 발생)
3 4 Fragmentation Needed (MTU 초과)
3 5 Source Route Failed
4 0 Source Quench (혼잡 발생)
5 0-3 Redirection (더 나은 경로 알림)
11 0 Time Exceeded (TTL 만료)


질의 메시지 (Query)

Type Code 설명
8 0 Echo Request (ping 요청)
0 0 Echo Reply (ping 응답)
9 0 Router Advertisement
10 0 Router Solicitation

ICMP Header 구조

크기: 8 bytes

필드 설명
Type ICMP 메시지의 업무 (Echo, Destination Unreachable 등)
Code Type의 세부 내용
Checksum ICMP 메시지의 이상 유무 판단

Ethernet Frame

Ethernet Frame 구조

크기:

  • 최소 프레임: 64 bytes
  • 최대 프레임: 1,518 bytes

구조:

┌─────────────┬──────────┬──────────┬──────┬─────────────┬─────┐
│ Preamble &  │   Dest   │   Src    │Type/ │    Data     │ CRC │
│    SFD      │   MAC    │   MAC    │Length│             │     │
├─────────────┼──────────┼──────────┼──────┼─────────────┼─────┤
│  8 bytes    │ 6 bytes  │ 6 bytes  │2bytes│46-1500bytes │4bytes│
└─────────────┴──────────┴──────────┴──────┴─────────────┴─────┘

필드 설명:

필드 크기 설명
Preamble & SFD 8 bytes 동기화 신호 및 시작 프레임 구분자
Destination MAC 6 bytes 수신자 MAC 주소
Source MAC 6 bytes 송신자 MAC 주소
Type/Length 2 bytes 0x0800=IP, 0x0806=ARP, 0x86DD=IPv6
Data 46-1500 bytes 페이로드 (L3 Packet)
CRC/FCS 4 bytes 오류 검사

ARP 프로토콜

ARP 정의

ARP (Address Resolution Protocol)

목적: IP 주소 → MAC 주소 변환


ARP 요청/응답 프로세스

1️⃣ ARP Request (브로드캐스트)

특징:

  • 송신: 모든 호스트에게 전송 (브로드캐스트)
  • 목적: "누가 이 IP 주소를 가지고 있나요?" 질문

구조:

Ethernet Header:
├─ Destination MAC: FFFF.FFFF.FFFF (브로드캐스트)
├─ Source MAC: 송신자 MAC (예: 1111.1111.1111)
└─ Type: 0x0806 (ARP)

ARP Header:
├─ Operation: Request (1)
├─ Sender MAC: 1111.1111.1111
├─ Sender IP: 192.168.1.10
├─ Target MAC: 0000.0000.0000 (미지정)
└─ Target IP: 192.168.1.20 (조회 대상)

질문: "누가 IP 192.168.1.20을 가지고 있나요?"

2️⃣ ARP Reply (유니캐스트)

특징:

  • 송신: ARP Request 송신자에게만 전송 (유니캐스트)
  • 목적: "저입니다! 제 MAC 주소는 이겁니다" 응답

구조:

Ethernet Header:
├─ Destination MAC: 1111.1111.1111 (ARP Request 송신자)
├─ Source MAC: 응답자 MAC (예: 2222.2222.2222)
└─ Type: 0x0806 (ARP)

ARP Header:
├─ Operation: Reply (2)
├─ Sender MAC: 2222.2222.2222 (자신의 MAC)
├─ Sender IP: 192.168.1.20 (자신의 IP)
├─ Target MAC: 1111.1111.1111 (요청자 MAC)
└─ Target IP: 192.168.1.10 (요청자 IP)

응답: "저입니다! 제 MAC은 2222.2222.2222입니다"

📊 ARP Request vs Reply 비교

항목 ARP Request ARP Reply
전송 방식 브로드캐스트 📣 유니캐스트 📬
수신 MAC FFFF.FFFF.FFFF 특정 MAC
수신 대상 모든 호스트 Request 송신자만
목적 MAC 조회 MAC 응답
Operation 1 (Request) 2 (Reply)
캐시 저장 ✅ (송신자가 저장)

ARP Cache Table

정의: 이미 조회한 IP-MAC 매핑을 저장하여 반복 조회 시 시간 절약

예시:

명령어: arp -a

IP Address      MAC Address        Type
192.168.1.10    1111.1111.1111    Dynamic
192.168.1.20    2222.2222.2222    Dynamic
192.168.1.30    3333.3333.3333    Dynamic

ARP 동작 전체 흐름

상황:

  • Client (192.168.1.10, MAC: 1111.1111.1111)
  • Server (192.168.1.20, MAC: 2222.2222.2222)
  • Client가 Server로 데이터 전송하려고 함

단계:

1️⃣ Client: ARP Request 송신
   "누가 192.168.1.20을 가지고 있나요?"
   → 모든 호스트에게 브로드캐스트

2️⃣ Server: 자신의 IP를 받음
   "저입니다!"

3️⃣ Server: ARP Reply 송신
   "저의 MAC은 2222.2222.2222입니다"
   → Client에게만 유니캐스트

4️⃣ Client: ARP 캐시에 저장
   ├─ 192.168.1.20 → 2222.2222.2222
   └─ 이제 데이터 전송 가능

5️⃣ 데이터 전송 (Ethernet Frame)
   ├─ Destination MAC: 2222.2222.2222
   ├─ Source MAC: 1111.1111.1111
   └─ 데이터 페이로드

ARP 캐시 테이블 변화

초기 상태:

Client ARP Cache:
(비어있음)

Server ARP Cache:
(비어있음)

ARP Request/Reply 후:

Client ARP Cache:
192.168.1.20 → 2222.2222.2222 ✅

Server ARP Cache:
192.168.1.10 → 1111.1111.1111 ✅

📋 핵심 요약

✅ 반드시 암기할 10가지

  1. TCP 연결 관리: 3-Way (설정) + 데이터 전송 + 4-Way (종료)

  2. TCP 공식: AN = SN + Data Size

  3. UDP: Message-Oriented (단편화 안 함)

  4. TCP: Stream-Oriented (단편화 함)

  5. MSS = MTU(1500) - IP Header (20) - TCP Header (20) = 1460

  6. MTU: Ethernet 표준 = 1500 bytes

  7. TTL: 라우터 통과 시마다 -1, 0이 되면 폐기

  8. ICMP Type 8: Echo Request (ping 요청)

  9. ICMP Type 0: Echo Reply (ping 응답)

  10. ARP Request: 브로드캐스트 (모든 호스트)
    ARP Reply: 유니캐스트 (요청자만)


돌아서면 까먹을 내용인 듯....