본문으로 건너뛰기
김신건의 로그

[Network] IP: IPv4, IPv6, 패킷 구조, fragmentation

· 수정 · 📖 약 4분 · 1,223자/단어 #network #ip #ipv4 #ipv6 #l3
IPv4, IPv6, Internet Protocol, IP packet, IP fragmentation, TTL, MTU

정의

IP (Internet Protocol) 는 OSI L3 (네트워크 계층) 의 핵심 프로토콜. best-effort delivery (재전송 없음, 순서 보장 없음, 손실 가능). 신뢰성은 TCP 같은 상위 layer 가 담당.

두 버전:

  • IPv4: 32-bit 주소 (≈ 43억), 1981년 RFC 791
  • IPv6: 128-bit 주소 (사실상 무한), 1998년 RFC 2460 → 2017년 RFC 8200

현재 인터넷은 듀얼 스택. 점진적 IPv6 전환 중 (구글 클라이언트 통계 약 40-50%).

IPv4 주소

Dotted decimal: 192.168.1.1 = 32-bit (4 octet, 0~255 each).

범위종류예시
0.0.0.0/8미지정 / “this network”0.0.0.0
10.0.0.0/8private (Class A)10.x.x.x
127.0.0.0/8loopback127.0.0.1
169.254.0.0/16link-local (DHCP 실패 시)169.254.x.x
172.16.0.0/12private (Class B)172.16-31.x.x
192.168.0.0/16private (Class C)192.168.x.x
224.0.0.0/4multicast224.0.0.1
255.255.255.255broadcast-

NAT 가 있는 이유: IPv4 고갈 → 사설망 안에서 private + 인터넷 진출 시 NAT 가 public IP 로 변환. network-nat 참고.

IPv6 주소

Colon-separated hex: 2001:0db8:85a3:0000:0000:8a2e:0370:7334.

축약 규칙:

  • 각 그룹의 leading zero 생략: 2001:db8:85a3:0:0:8a2e:370:7334
  • 연속 0 그룹은 :: 한 번만 사용 가능: 2001:db8:85a3::8a2e:370:7334

특수 주소:

  • ::1 : loopback (IPv4 의 127.0.0.1)
  • :: : 미지정 (0.0.0.0)
  • fe80::/10 : link-local
  • fc00::/7 : ULA (Unique Local, private)
  • 2000::/3 : global unicast

IPv6 는 broadcast 없음 (multicast 만). NDP (Neighbor Discovery Protocol) 가 ARP 대체.

IPv4 헤더 (20 byte 기본)

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-------+-------+---------------+-------------------------------+
|Version|  IHL  |Type of Service|          Total Length         |
+-------+-------+---------------+-----+-------------------------+
|         Identification        |Flags|      Fragment Offset    |
+---------------+---------------+-----+-------------------------+
|  Time to Live |    Protocol   |         Header Checksum       |
+---------------+---------------+-------------------------------+
|                       Source Address                          |
+---------------------------------------------------------------+
|                    Destination Address                        |
+---------------------------------------------------------------+
|                    Options (옵션, 가변)                       |
+---------------------------------------------------------------+

핵심 필드:

  • Version: 4
  • IHL: 헤더 길이 (32-bit word 단위, 기본 5 = 20 byte)
  • Total Length: 전체 패킷 크기 (max 65535)
  • Identification + Flags + Fragment Offset: fragmentation 용
  • TTL: hop 수 제한 (0 도달 시 ICMP TTL Exceeded 후 폐기)
  • Protocol: 다음 layer (TCP=6, UDP=17, ICMP=1)
  • Source/Destination: 32-bit IP

IPv6 헤더 (고정 40 byte)

+-------+--------------+----------------------+
|Version| Traffic Class|     Flow Label       |
+-------+--------------+----------------------+
|    Payload Length    | Next Header | Hop Lim|
+----------------------+-------------+--------+
|             Source Address (128 bit)        |
+---------------------------------------------+
|          Destination Address (128 bit)      |
+---------------------------------------------+

IPv6 의 단순화:

  • 고정 길이 (옵션은 extension header)
  • 헤더 checksum 제거 (L2/L4 가 검증)
  • fragmentation 없음 (source 만, router 는 거부)
  • Flow Label: QoS

Fragmentation (IPv4)

MTU (Maximum Transmission Unit): link 가 한 번에 전송 가능한 최대 크기.

  • Ethernet: 1500 byte
  • VPN tunnel: 줄어들 수 있음 (1400 등)

IP 패킷이 MTU 보다 크면 fragmentation:

원본: 4000 byte 패킷
   ↓ MTU 1500 link
fragment 1: 1500 byte (More Fragments=1)
fragment 2: 1500 byte (More Fragments=1, offset=1480)
fragment 3: 1040 byte (More Fragments=0, offset=2960)

목적지 host 에서 reassembly. 함정:

  • 한 fragment 손실 = 전체 재전송 필요
  • 보안: fragment overlap 공격
  • IPv6 는 source-only fragmentation (router 는 거부 + ICMPv6 Too Big)

PMTUD (Path MTU Discovery)

Don’t Fragment (DF) flag 켜고 보내며 router 가 “Too Big” ICMP 반환하면 줄임:

source ─→ link 1500 ─→ tunnel 1400 ─→ destination
       ↓ DF=1, 1500
       ← ICMP "Frag needed, MTU=1400"
       ↓ retry with 1400

ICMP 차단된 환경에선 PMTUD 깨짐 (“PMTUD black hole”). TCP MSS clamping 으로 회피.

ICMP (Internet Control Message Protocol)

IP 의 control plane:

  • Echo Request/Reply: ping
  • Destination Unreachable: 목적지 도달 불가
  • TTL Exceeded: traceroute 의 원리
  • Fragmentation Needed: PMTUD
  • Redirect: 더 좋은 route 알림 (보안상 위험)

ICMPv6 는 더 광범위 (NDP, MLD 등 통합).

TTL (Time To Live)

각 router 통과 시 1 씩 감소. 0 도달 시 패킷 폐기 + ICMP Time Exceeded.

목적: 라우팅 루프 무한 폭주 방지. 일반적 OS 기본값:

  • Linux: 64
  • Windows: 128
  • Cisco router: 255

traceroute 가 이걸 활용:

traceroute google.com
# TTL=1 보냄 → 1번째 router 가 TTL Exceeded 반환 (그 router 의 IP 노출)
# TTL=2 보냄 → 2번째 router 가 반환
# ...

각 hop 의 IP 와 latency 측정. network-cidr-subnetting 참고.

주요 함정

함정 1: NAT 뒤의 IP

192.168.1.10 에서 외부 접속 시 라우터가 SNAT → public IP. 외부에서 보면 라우터의 IP. inbound 는 port forwarding 필요.

함정 2: IPv6 dual-stack 의 happy eyeballs

브라우저는 IPv4 / IPv6 둘 다 시도해 빠른 쪽 사용. IPv6 라우팅이 깨졌어도 IPv4 fallback 되므로 사용자는 모름 → 진단 어려움.

함정 3: MTU mismatch

Docker / Kubernetes 의 overlay network 가 보통 MTU 1450 (encapsulation overhead). 호스트가 1500 으로 보내면 성능 저하 / 패킷 손실.

# 진단
ping -M do -s 1472 google.com   # 1472 + 28 (IP+ICMP) = 1500

함정 4: IPv4 exhaustion 과 CGNAT

ISP 의 Carrier-Grade NAT 환경에서 같은 IP 가 수천 명 공유. P2P / inbound 어려움. IPv6 보급 가속 이유.

IP 라우팅 흐름

flowchart LR
    A["호스트 A (192.168.1.10)"] -->|"1. 패킷 생성"| R1["Router/NAT"]
    R1 -->|"2. public IP 변환"| ISP[인터넷 라우터]
    ISP -->|"3. longest prefix match"| R2[Edge Router]
    R2 -->|"4. TTL 감소 후 전달"| B["호스트 B (8.8.8.8)"]
    ISP -->|"TTL=0, ICMPv4 반환"| A

각 hop 에서 라우터 동작:

  1. 목적지 IP 의 라우팅 테이블 longest prefix match 조회
  2. 매칭 경로 없으면 default route (0.0.0.0/0) 사용
  3. TTL 1 감소. 0 이면 패킷 폐기 + ICMP Time Exceeded 반환

서브넷 / CIDR

CIDR (Classless Inter-Domain Routing): 가변 길이 prefix 로 IP 대역 표현.

192.168.1.0/24
          └─ prefix 24 bit → subnet mask 255.255.255.0
               → 192.168.1.0 ~ 192.168.1.255 (256개 주소)
               → 사용 가능: 192.168.1.1 ~ 192.168.1.254 (네트워크 주소/브로드캐스트 제외)
Prefix주소 수사용 가능용도
/3042P2P 링크
/2986소규모
/24256254일반 LAN
/2210241022중규모
/166553665534대규모 VPC

Subnetting 계산

10.0.0.0/8 (Class A private) 를 /24 로 쪼개면:
  10.0.0.0/24, 10.0.1.0/24, ..., 10.255.255.0/24 → 65536 개 서브넷

AWS VPC 설계 예:
  10.0.0.0/16
    ├── Public:  10.0.1.0/24
    ├── Private: 10.0.2.0/24
    └── DB:      10.0.3.0/24

bitwise AND 로 네트워크 주소 계산:

IP:   192.168.1.100 = 11000000.10101000.00000001.01100100
Mask: 255.255.255.0 = 11111111.11111111.11111111.00000000
AND:  192.168.1.0   = 11000000.10101000.00000001.00000000

ARP (Address Resolution Protocol)

IPv4 에서 L3 → L2 변환: IP 주소 → MAC 주소 결정.

송신: ARP Request (broadcast)  "192.168.1.1 의 MAC 주소는?"
수신: ARP Reply (unicast)       "내 MAC 은 aa:bb:cc:dd:ee:ff"
캐싱: ARP 테이블에 IP-MAC 매핑 저장 (보통 TTL ~20분)
# ARP 테이블 확인
arp -n

# IPv6 NDP 테이블 (Neighbor Discovery Protocol)
ip -6 neigh

IPv6 에서는 NDP (Neighbor Discovery Protocol) 가 ARP 대체. ICMPv6 기반, Solicited-Node Multicast 사용 → broadcast 불필요.

함정과 베스트 프랙티스

  • 항상 dual-stack 고려: IPv4 + IPv6 동시 지원
  • MTU 명시: container / VPN 환경에서 1500 가정 위험
  • traceroute / mtr 활용: 경로 진단의 기본
  • TTL 짧으면 우회: anycast / CDN 에서 같은 IP 가 여러 위치
  • PMTUD 깨질 때 MSS clamping: TCP 헤더에서 협상 가능한 최대 크기
  • private IP 충돌 회피: 사내 다중 사이트 시 RFC 1918 범위 신중 할당
  • IPv6 ULA: 사설망에선 fd00::/8 권장 (link-local 은 라우팅 안 됨)

관련 위키

이 글의 용어 (7개)
[Network] CIDR와 Subnettingnetwork
정의 CIDR (Classless Inter-Domain Routing) 은 IPv4 / IPv6 주소를 prefix length 로 표기하는 표준. 1993년 등장 (RFC 1…
[Network] DNS: 도메인 이름 해석network
정의 DNS (Domain Name System) 는 도메인 이름 ( ) 을 IP 주소 ( ) 로 변환하는 분산 데이터베이스. 인터넷의 가장 중요한 인프라. 기본 동작: 1. 클…
[Network] NAT: Network Address Translationnetwork
정의 NAT (Network Address Translation) 는 IP 패킷의 헤더에서 소스 또는 목적지 IP 주소(포트 포함)를 변환하는 기법이다. 주로 사설 IP와 공인 …
Head-of-Line Blockingnetwork
정의 Head-of-Line Blocking (HOLB) 은 처리 순서가 정해진 큐에서 맨 앞 항목의 지연이 그 뒤 항목 전체의 지연으로 전파되는 현상이다. 네트워크 프로토콜에서…
QUICnetwork
정의 QUIC (Quick UDP Internet Connections)은 Google이 2012년 처음 제안하고 2021년 RFC 9000으로 표준화된 UDP 기반 전송 프로토…
TCPnetwork
정의 TCP (Transmission Control Protocol) 는 신뢰성 있는 연결 지향 전송 계층 프로토콜이다. RFC 9293 으로 정의되어 있다. HTTP/1.1·2…
UDPnetwork
정의 UDP (User Datagram Protocol)는 비연결·비신뢰 전송 계층 프로토콜이다. RFC 768 (1980) 로 정의되었다. TCP 와 대비된다. "보내고 잊는다…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기