dh_0e

[Network Layer] IPv4 Datagrams 본문

Network Programming/Network Layer

[Network Layer] IPv4 Datagrams

dh_0e 2025. 4. 22. 06:35

Introduction

  • IP(Internet Protocol)는 TCP/IP 프로토콜 스택의 네트워크 계층에서 사용되는 전송 메커니즘이다.
  • IP는 비신뢰성(unreliable)비연결성(connectionless) 특성을 가진 데이터그램 기반 프로토콜이다.
  • Best-effort delivery service란?
    → IP는 데이터그램이 손상되거나, 손실되거나, 순서가 바뀌거나, 지연되거나, 네트워크 혼잡을 유발할 수 있음을 의미한다.
  • 이처럼 IP 자체는 문제가 생겨도 처리하지 않기 때문에, 상위 계층 프로토콜(예: TCP)이 이런 문제들을 해결해줘야 한다.
IP는 연결 없이 데이터를 보내는 방식이며, 신뢰성은 상위 계층에서 처리해야 한다.

  • ICMP (Internet Control Message Protocol): 네트워크 계층에서 발생하는 오류를 제어하는 프로토콜
  • IGMP (Internet Group Management Protocol): 멀티캐스트 트래픽을 관리하는 데 사용되는 프로토콜
  • ARP: 네트워크에서 IP 주소를 MAC 주소(데이터링크 계층)로 매핑해주는 프로토콜

Datagrams

  • 네트워크 계층(인터넷 계층)에서 사용하는 패킷의 명칭이다.
  • 데이터그램은 가변 길이를 가지며 두 부분으로 구성됨:
    1. Header(헤더):
      • 길이는 20~60byte (20byte가 default)
        • 기본 헤더 = 20바이트 → 옵션에 남는 공간 = 40바이트
      • 라우팅 및 전달에 필수적인 정보 포함
    2. Data(데이터):
      • 실제 전송하고자 하는 내용

데이터그램은 헤더와 데이터로 구성되며, 헤더에는 네트워크 전달에 필요한 정보가 담긴다.

 

Version (VER)

  • 4비트 필드
  • IP 프로토콜의 버전 명시 (IPv4인지 IPv6인지 확인용)
  • 버전이 맞지 않으면 해당 머신은 데이터그램을 버림(discard)

Header Length (HLEN)

  • 4비트 필드
  • IP 헤더 전체 길이 (4바이트 단위로 계산됨)
  •  예시:
    • 옵션이 없으면 헤더는 20바이트 → HLEN = 5 (5 × 4 = 20)
    • 옵션 최대 시 헤더는 60바이트 → HLEN = 15 (15 × 4 = 60)
헤더에는 IP 버전과 헤더 길이가 포함되며, 버전이 다르면 데이터그램은 무시된다.

 

DSCP (Differentiated Services Code Point)

  • 6비트 필드
  • 원래는 ToS(Type of Service)로 불렸음
  • QoS(서비스 품질)를 위한 필드
  • 예: VoIP(인터넷 음성 통화)처럼 실시간 데이터 스트리밍에 사용됨
  • 트래픽을 우선 순위에 따라 다르게 처리할 수 있게 함
  • 어떤 서비스를 위한, 어떤 데이터를 실어 나르는지를 위한 필드였음

ECN (Explicit Congestion Notification)

  • 2비트 필드
  • 네트워크 혼잡 상황을 알리는 용도
  • 패킷을 드롭(drop)하지 않고도 혼잡을 통지할 수 있음
  • 단, 송신자와 수신자 모두 ECN을 지원해야 하고, 네트워크도 지원해야 작동함
DSCP와 ECN은 각각 서비스 품질 제어와 네트워크 혼잡 알림에 사용되는 필드다.

 

Total Length (총길이)

  • 16비트 필드로, 헤더 + 데이터 포함한 전체 IP 데이터그램의 길이를 바이트 단위로 나타냄
  • 데이터 길이 = 전체 길이 - 헤더 길이
  • 16비트이므로 최대 크기 65,535 바이트까지 나타낼 수 있음
  • 데이터그램이 너무 클 경우 → 일부 물리 네트워크에서는 한 프레임에 담기지 못함
    → 이 경우 단편화(Fragmentation)가 필요함
  • Ethernet처럼 프레임 크기에 제약이 있는 프로토콜 예시
    • 최소: 46바이트(Data Link 계층에서 minimum 길이), 최대: 1500바이트
    • IP 데이터그램이 46바이트보다 작으면, 패딩(padding)을 넣어 맞춰야 함
    • 이때는 총길이 필드를 통해 진짜 데이터 길이를 확인해야 함

IP 데이터그램의 전체 길이는 65,535 바이트까지 가능하며, 물리 네트워크 제약 때문에 단편화되거나 패딩이 추가될 수 있다.

 

Identification / Flags / Fragmentation Offset

  • 모두 단편화(fragmentation)와 관련된 필드들
  • 큰 데이터그램을 작은 조각으로 나누어 전송할 때 사용됨
  • 뒤에서 다시 설명

Time to Live (TTL)

  • 8비트 field
  • 데이터그램이 지나갈 수 있는 최대 라우터 수 (홉 수)를 제한함
  • 각 라우터는 이 값을 1씩 감소시킴
  • 0이 되면 해당 라우터는 데이터그램을 버림(discard)

Protocol

  • 8비트 field
  • 상위 계층 프로토콜(TCP, UDP, ICMP, IGMP 등)을 나타내는 8비트 값
  • IP 데이터그램 안에 어떤 종류의 데이터가 들어있는지 알려줌

TTL은 경로 제한용, Protocol은 상위 계층 식별용, 그리고 단편화 관련 필드들이 함께 데이터그램 전달을 제어한다.

 

Header Checksum (체크섬)

  • IP 헤더 오류 검출용 필드
  • 데이터 손상이 있는지 확인하기 위한 정보이며, 헤더에만 적용됨 (데이터에는 적용되지 않음)
  • XOR 연산 + 1의 보수
  • 뒤에서 다시 설명

Source IP Address (출발지 주소)

  • 32비트 크기의 송신자 IP 주소
  • 공용 인터넷을 통해 전달되는 동안 변경되면 안 됨

Destination Address (목적지 주소)

  • 32비트 크기의 수신자 IP 주소
  • 마찬가지로 인터넷을 통해 전달되는 동안 절대 변경되면 안 됨
출발지와 목적지 주소는 변하지 않으며, 체크섬은 헤더의 오류 검출을 위해 사용된다

Fragmentation

  • 라우터는 프레임에서 IP 데이터그램을 꺼내어(decapsulate) 처리한 뒤,
    다음 네트워크에 맞게 다른 프레임으로 재포장(encapsulate)해서 보냄
  • 각 네트워크는 사용하는 물리 계층 프로토콜(MAC)이 다르기 때문에,
    프레임 형식과 최대 전송 크기(MTU)가 달라짐

Maximum Transfer Unit (MTU)

  • 각 네트워크는 전송할 수 있는 데이터의 최대 크기(MTU)가 정해져 있음
  • 예시:
    • Ethernet LAN: 1,500바이트
    • Wi-Fi: 1,460바이트
    • BLE(Bluetooth Low Energy): 기본 23바이트, 확장 가능
    • LTE: 보통 1,500바이트
라우터는 IP 데이터그램을 목적지에 맞게 재포장한다.
이때, 물리 네트워크마다 MTU가 달라 IP 데이터그램은 필요에 따라 라우터에서 단편화되어 전송된다.
  • 단편화가 발생하면, 각각의 조각(fragment)도 자신만의 IP 헤더를 가짐
    → 대부분 필드는 원본과 같지만 일부 필드(예: 길이, 오프셋 등)는 수정됨
  • 추가 단편화 가능성
    • 이미 단편화된 조각도, 더 작은 MTU를 가진 네트워크를 만나면 다시 단편화될 수 있음
    • 즉, 하나의 데이터그램은 전송 중 여러 번 나뉠 수 있다
  • 재조립은 수신자(host)만 수행
    • 단편화된 조각들은 서로 다른 경로를 통해 전송될 수도 있고
    • 도중 라우터에서는 재조립하지 않음
  • 단편화 시 반드시 변경되는 필드 3가지
    1. Flags (플래그)
    2. Fragmentation Offset (단편화 오프셋)
    3. Total Length (총길이)
    • 그리고 Checksum(체크섬)다시 계산되어야 함

단편화된 각 조각은 독립적인 헤더를 가지며, 최종 목적지에서만 재조립되고 체크섬도 새로 계산된다.
  • 단편화 및 재조립 관련 주요 필드
    → Identification, Flags, Fragmentation Offset

Identification (식별자 필드)

  • 16비트 필드: datagram의 ID
  • 출발지 호스트에서 전송되는 데이터그램마다 고유한 식별번호 부여
  • Identification + 출발지 IP주소 조합이 유일해야 함
  • 일반적으로 카운터 방식 사용 → 전송될 때마다 값 1씩 증가
  • 단편화(fragment)된 조각들도 같은 Identification 값을 공유함
    → 수신자가 동일한 데이터그램 조각임을 구분하고 재조립 가능하게 해줌
Identification 필드는 데이터그램 조각들을 구분하기 위한 고유 번호로, 재조립 시 필수 기준이다.

 

Flags (플래그 필드)

  • 총 3비트로 구성된 필드 (단편화 제어용)
  1. 첫 번째 비트
    • 예약됨 (Reserved): 사용하지 않음
  2. 두 번째 비트: DF (Don't Fragment)
    • 값이 1이면 단편화 금지
    • 데이터그램이 네트워크를 통과할 수 없을 정도로 크면 버리고 ICMP 오류 메시지 반환
    • 값이 0이면 필요시 단편화 허용
  3. 세 번째 비트: MF (More Fragments)
    • 값이 1이면 뒤에 더 많은 조각이 있음
    • 값이 0이면 마지막 조각이거나 단편화되지 않은 단일 데이터그램임

Flags 필드는 단편화 가능 여부와 조각의 위치(마지막 여부)를 제어하는 세 비트로 구성된다.

 

Fragmentation Offset (단편화 오프셋)

  • 13비트 필드
  • 이 조각(fragment)의 원래 데이터그램 내 위치를 나타냄 (fragment 내에서 일종의 인덱스 정보)
  • 단위는 8바이트(64비트)
    → 즉, 오프셋 값이 1이면 실제 위치는 8바이트 지점을 의미함

예시

  • 원래 데이터 길이: 4000 바이트
  • 3개의 조각으로 나눔
  1. 첫 번째 조각
    • 데이터: 바이트 0 ~ 1399
    • Offset = 0 / 8 = 0
  2. 두 번째 조각
    • 데이터: 바이트 1400 ~ 2799
    • Offset = 1400 / 8 = 175
  3. 세 번째 조각
    • 데이터: 바이트 2800 ~ 3999
    • Offset = 2800 / 8 = 350
Fragmentation Offset은 조각의 상대 위치를 8바이트 단위로 표시하여 재조립 시 올바른 순서를 알려준다.

 

Example of total length, identification, flags, offset


Options (옵션)

  • IP 헤더는 두 부분으로 나뉨:
    1. 고정 부분(Fixed Part): 20바이트
    2. 가변 부분(Variable Part): 옵션 필드, 최대 40바이트
  • 옵션은 네트워크 테스트나 디버깅 용도로 사용됨
    → 반드시 사용되진 않지만, 모든 IP 구현은 옵션이 존재할 경우 해석할 수 있어야 함
옵션 필드는 IP 헤더의 가변 영역이며, 네트워크 제어와 디버깅을 위한 정보를 담을 수 있다.

Format (형식)

  • 옵션은 다음 3가지 필드로 구성됨:
    1. Type (1바이트): 옵션의 종류를 나타냄
    2. Length (1바이트): 옵션 전체의 길이
    3. Value (가변 크기): 옵션 값(실제 데이터)

Type 필드

  • 실제로 3개의 하위 필드로 구성되어 있음
  1. Copy (1비트)
    • 단편화 시, 이 옵션을 모든 조각에 복사할지 여부를 지정
    • 0: 첫 번째 조각에만 포함
    • 1: 모든 조각에 포함
  2. Class (2비트)
    • 옵션의 일반 목적을 지정
      • 00: 데이터그램 제어용
      • 10: 디버깅 및 관리용
      • 01, 11: 아직 정의되지 않음
  3. Number (5비트)
    • 옵션의 구체적인 타입을 정의함
    • 총 5비트 → 최대 32가지 옵션 타입 정의 가능
    • 현재는 6가지 옵션만 사용되고 있음 ( 밑에서 계속 )

Length (길이 필드)

  • 옵션의 전체 길이를 나타냄
  • 이 길이는 Type + Length + Value 전체의 크기 포함

Value (값 필드)

  • 실제 옵션에서 요구하는 데이터를 담는 공간
  • 옵션의 기능에 따라 값의 내용과 크기가 달라짐
옵션의 타입 필드는 복사 여부, 목적 클래스, 구체적 번호로 나뉘며 총 6가지가 실제로 사용된다.
옵션은 Type, Length, Value로 구성되며, 현재 6가지 타입만 실제로 사용되고 있다.

Type (옵션 타입)

6가지 Option Type

1. No-Operation Option

  • 1바이트짜리 옵션
  • 여러 옵션 사이에 공백 또는 정렬을 위한 채움(filler) 역할
  • 옵션의 시작, 경계에 등장
  • 예: 다음 옵션을 16비트 혹은 32비트 경계에 정렬시키기 위해 삽입

2. End-of-Option Option

  • 옵션 필드의 끝을 나타냄
  • 옵션 목록의 마지막에만 사용됨
  • 이후 나머지 공간은 패딩(padding)으로 채움

3. Record-Route Option

  • 데이터그램이 지나가는 라우터들의 IP 주소를 기록하기 위한 옵션
  • 최대 9개 라우터의 IP 주소를 저장 가능
    • 이유: IP 헤더 최대 크기 = 60바이트
      • 기본 헤더 = 20바이트 → 옵션에 남는 공간 = 40바이트
      • IP 주소 하나당 4바이트이므로: 40 ÷ 4 = 10칸 중 1칸은 포인터용 → IP 최대 9개 기록 가능
  • 출발지 호스트가 빈 공간을 미리 만들어두면,
    → 라우터들이 자신들의 주소를 그 안에 순서대로 채워 넣음

 

Pointer 필드

  • 정수형 오프셋 값
  • 다음 IP 주소가 기록될 위치를 나타냄
  • 데이터그램이 출발할 때:
    → 포인터 값은 4 (첫 번째 빈 IP 주소 위치)
  • 동작 방식
    1. 출발지에서 보낼 때, 옵션 필드의 IP 주소 자리들은 비어 있음
    2. 포인터는 4를 가리킴 (첫 위치)
    3. 데이터그램이 라우터를 지나갈 때마다,
      → 해당 라우터는 자기 IP 주소를 포인터 위치에 씀
      → 그리고 포인터 값을 4 증가시킴
      (IP 주소는 4바이트이므로)

 

4. Strict-Source-Route Option

  • 출발지 호스트가 데이터그램이 반드시 거쳐야 할 정확한 경로(IP들)를 지정하는 옵션
  • 사용 목적
    • 더 안전하거나 신뢰할 수 있는 경로 선택
    • 경쟁사의 네트워크를 우회하기 위한 목적 등

조건

  • 데이터그램이 지정된 라우터 IP 목록에 없는 라우터에 도달하면 폐기됨
  • 최종 목적지에 도달했는데, 목록에 지정된 라우터 중 일부를 지나지 않았다면역시 폐기됨
  • 즉, 지정된 모든 라우터를 정확히 통과해야 하며, 그 외 라우터는 절대 통과 불가

과정

  • 라우터는 먼저 Pointer 값과 Length 값을 비교함
    • Pointer > Length → 지정된 모든 라우터를 방문한 상태 → 이제 목적지로 전송 가능
    • Pointer ≤ Length → 아직 지정된 경로의 라우터 중 방문하지 않은 곳이 있음

IP 주소 스왑(Swap) 동작

  • 만약 Pointer가 Length보다 작다면:
    1. 라우터는 Pointer가 가리키는 IP 주소와 라우터의 목적지 주소를 서로 바꿈
      → 이렇게 하면 다음 라우터가 올바르게 목적지를 인식함
      → 라우터는 pointer가 가리키는 IP 주소를 next hop으로 지정
    2. Pointer 값을 4 증가
      → 다음 라우터가 기록된 주소를 가리키게 됨

 

5. Loose-Source-Route Option

  • 지정된 라우터들은 반드시 통과해야 함
  • 하지만 그 외 라우터들을 지나가는 것은 허용
  • 즉, 지정된 경유지만 꼭 거치면, 그 사이 경로는 자유롭게 선택 가능
    → Strict보다 자유도가 높음

6. Timestamp Option

  • 데이터그램이 라우터를 통과할 때의 시간 정보 기록
  • 시간은 UTC 기준 자정부터 밀리초 단위로 계산
  • 네트워크 성능 측정, 경로 분석 등에 유용함
No-Operation은 정렬용, End-of-Option은 옵션 필드의 끝을 나타내는 특수한 옵션이다.
Record-Route 옵션은 데이터그램이 거치는 라우터의 IP를 기록하여 경로 추적에 활용된다.
Strict-Source-Route 옵션은 데이터그램이 반드시 지정된 IP 주소들만 순서대로 통과하도록 강제한다.
Loose-Source-Route는 필수 경유지만 지정하고 나머지는 자유롭게 경로 설정하며, Timestamp는 라우터 통과 시간을 기록한다.

(Header) Checksum

  • 대부분의 TCP/IP 프로토콜은 오류 검출을 위해 체크섬(Checksum)을 사용함
  • 체크섬은 전송 중 손상된 데이터를 확인하기 위한 중복 정보
    → 데이터에 추가되어 전송되며, 수신자가 이를 검증함

과정 (어근데이거안배운거같은데)

전송자(Sender)의 체크섬 계산 절차

  1. 패킷을 여러 섹션으로 나눔
    • 예: 16비트 단위로 나눔
  2. 나눈 섹션들을 1의 보수(One’s Complement) 방식으로 모두 더함
    • 일반적인 덧셈이 아니라, 자리 올림은 다시 더하는 방식
  3. 최종 합계를 반전(Complement)시켜 → 체크섬으로 설정

수신자(Receiver)의 체크섬 확인 절차

  1. 수신자는 모든 섹션 + 체크섬 값을 다시 더함
  2. 이론상 결과는 -0(마이너스 0)이 되어야 함
    • 1의 보수 체계에서는 -0도 허용됨
  3. 결과가 -0이면 → 정상 데이터
    • 아니면 → 오류로 간주하고 패킷 폐기
체크섬은 송신자가 만든 오류 검출용 값으로, 수신자는 이를 통해 데이터가 손상됐는지 확인한다.

Security - 보안 위협 요소

1. Packet Sniffing (패킷 도청)

  • 공격자가 네트워크에서 패킷을 가로채 복사하는 행위
  • 패킷 내용은 변경하지 않음 (Passive 공격)
  • 송신자와 수신자는 대부분 도청 사실을 인지하지 못함
  • 해결책: 패킷 암호화 → 내용을 읽지 못하게 만들어 무력화 (요즘은 암호화해도 못 막음)

2. Packet Modification (패킷 변조)

  • 공격자가 패킷을 가로채 내용 일부를 수정한 후 다시 전송
  • 수신자는 이것을 정상적인 송신자로부터 온 것으로 착각함
  • 해결책: 데이터 무결성(Data Integrity) 검증
    → 해시 함수, MAC(Message Authentication Code) 등 사용

3. IP Spoofing (IP 주소 위조)

  • 공격자가 자신의 IP 주소를 다른 사람의 IP로 위조하여 패킷을 생성
  • 수신자는 이를 정상적인 송신자의 패킷으로 착각
  • 심각한 보안 문제로, DoS 공격 등에 악용됨
  • 방어 방법: 원본 인증(Origin Authentication)
    → 패킷이 실제로 누구로부터 왔는지 검증

IPSec (IP Security)

  • IP 패킷의 보안을 강화하기 위한 표준 프로토콜
  • 주요 기능:
    1. 암호화(Encryption) – 도청 방지
    2. 데이터 무결성(Data Integrity) – 변조 감지
    3. 원본 인증(Origin Authentication) – 위조 방지
    4. 암호화 알고리즘 및 키 정의
IP는 도청이나 변조에 취약하며, 암호화와 무결성 검증으로 이를 방어할 수 있다.
IP Spoofing은 출발지 위조 공격이며, 이를 방어하기 위해 IPSec이 암호화·무결성·인증 기능을 제공한다.