일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- insomnia
- 백준 9527번
- 자바스크립트
- map
- vector insert
- HTTP
- JavaScript
- 이분 탐색
- DP
- 트라이
- Prisma
- MongoDB
- 그리디
- 그래프 탐색
- string
- localstorage
- Github
- html5
- 게임 서버 아키텍처
- Express.js
- router
- Next
- MySQL
- branch
- pm2
- PROJECT
- ccw 알고리즘
- trie
- Keys
- ERD
Archives
- Today
- Total
dh_0e
[Network Layer] IPv4 Datagrams 본문
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
- 네트워크 계층(인터넷 계층)에서 사용하는 패킷의 명칭이다.
- 데이터그램은 가변 길이를 가지며 두 부분으로 구성됨:
- Header(헤더):
- 길이는 20~60byte (20byte가 default)
- 기본 헤더 = 20바이트 → 옵션에 남는 공간 = 40바이트
- 라우팅 및 전달에 필수적인 정보 포함
- 길이는 20~60byte (20byte가 default)
- Data(데이터):
- 실제 전송하고자 하는 내용
- Header(헤더):
데이터그램은 헤더와 데이터로 구성되며, 헤더에는 네트워크 전달에 필요한 정보가 담긴다.
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가지
- Flags (플래그)
- Fragmentation Offset (단편화 오프셋)
- Total Length (총길이)
- 그리고 Checksum(체크섬)도 다시 계산되어야 함
단편화된 각 조각은 독립적인 헤더를 가지며, 최종 목적지에서만 재조립되고 체크섬도 새로 계산된다.
- 단편화 및 재조립 관련 주요 필드
→ Identification, Flags, Fragmentation Offset
Identification (식별자 필드)
- 16비트 필드: datagram의 ID
- 출발지 호스트에서 전송되는 데이터그램마다 고유한 식별번호 부여
- Identification + 출발지 IP주소 조합이 유일해야 함
- 일반적으로 카운터 방식 사용 → 전송될 때마다 값 1씩 증가
- 단편화(fragment)된 조각들도 같은 Identification 값을 공유함
→ 수신자가 동일한 데이터그램 조각임을 구분하고 재조립 가능하게 해줌
Identification 필드는 데이터그램 조각들을 구분하기 위한 고유 번호로, 재조립 시 필수 기준이다.
Flags (플래그 필드)
- 총 3비트로 구성된 필드 (단편화 제어용)
- 첫 번째 비트
- 예약됨 (Reserved): 사용하지 않음
- 두 번째 비트: DF (Don't Fragment)
- 값이 1이면 단편화 금지
- 데이터그램이 네트워크를 통과할 수 없을 정도로 크면 버리고 ICMP 오류 메시지 반환
- 값이 0이면 필요시 단편화 허용
- 세 번째 비트: MF (More Fragments)
- 값이 1이면 뒤에 더 많은 조각이 있음
- 값이 0이면 마지막 조각이거나 단편화되지 않은 단일 데이터그램임
Flags 필드는 단편화 가능 여부와 조각의 위치(마지막 여부)를 제어하는 세 비트로 구성된다.
Fragmentation Offset (단편화 오프셋)
- 13비트 필드
- 이 조각(fragment)의 원래 데이터그램 내 위치를 나타냄 (fragment 내에서 일종의 인덱스 정보)
- 단위는 8바이트(64비트)
→ 즉, 오프셋 값이 1이면 실제 위치는 8바이트 지점을 의미함
예시
- 원래 데이터 길이: 4000 바이트
- 3개의 조각으로 나눔
- 첫 번째 조각
- 데이터: 바이트 0 ~ 1399
- Offset = 0 / 8 = 0
- 두 번째 조각
- 데이터: 바이트 1400 ~ 2799
- Offset = 1400 / 8 = 175
- 세 번째 조각
- 데이터: 바이트 2800 ~ 3999
- Offset = 2800 / 8 = 350
Fragmentation Offset은 조각의 상대 위치를 8바이트 단위로 표시하여 재조립 시 올바른 순서를 알려준다.
Options (옵션)
- IP 헤더는 두 부분으로 나뉨:
- 고정 부분(Fixed Part): 20바이트
- 가변 부분(Variable Part): 옵션 필드, 최대 40바이트
- 옵션은 네트워크 테스트나 디버깅 용도로 사용됨
→ 반드시 사용되진 않지만, 모든 IP 구현은 옵션이 존재할 경우 해석할 수 있어야 함
옵션 필드는 IP 헤더의 가변 영역이며, 네트워크 제어와 디버깅을 위한 정보를 담을 수 있다.
Format (형식)
- 옵션은 다음 3가지 필드로 구성됨:
- Type (1바이트): 옵션의 종류를 나타냄
- Length (1바이트): 옵션 전체의 길이
- Value (가변 크기): 옵션 값(실제 데이터)
Type 필드
- 실제로 3개의 하위 필드로 구성되어 있음
- Copy (1비트)
- 단편화 시, 이 옵션을 모든 조각에 복사할지 여부를 지정
- 0: 첫 번째 조각에만 포함
- 1: 모든 조각에 포함
- Class (2비트)
- 옵션의 일반 목적을 지정
- 00: 데이터그램 제어용
- 10: 디버깅 및 관리용
- 01, 11: 아직 정의되지 않음
- 옵션의 일반 목적을 지정
- Number (5비트)
- 옵션의 구체적인 타입을 정의함
- 총 5비트 → 최대 32가지 옵션 타입 정의 가능
- 현재는 6가지 옵션만 사용되고 있음 ( 밑에서 계속 )
Length (길이 필드)
- 옵션의 전체 길이를 나타냄
- 이 길이는 Type + Length + Value 전체의 크기 포함
Value (값 필드)
- 실제 옵션에서 요구하는 데이터를 담는 공간
- 옵션의 기능에 따라 값의 내용과 크기가 달라짐
옵션의 타입 필드는 복사 여부, 목적 클래스, 구체적 번호로 나뉘며 총 6가지가 실제로 사용된다.
옵션은 Type, Length, Value로 구성되며, 현재 6가지 타입만 실제로 사용되고 있다.
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개 기록 가능
- 이유: IP 헤더 최대 크기 = 60바이트
- 출발지 호스트가 빈 공간을 미리 만들어두면,
→ 라우터들이 자신들의 주소를 그 안에 순서대로 채워 넣음
Pointer 필드
- 정수형 오프셋 값
- 다음 IP 주소가 기록될 위치를 나타냄
- 데이터그램이 출발할 때:
→ 포인터 값은 4 (첫 번째 빈 IP 주소 위치) - 동작 방식
- 출발지에서 보낼 때, 옵션 필드의 IP 주소 자리들은 비어 있음
- 포인터는 4를 가리킴 (첫 위치)
- 데이터그램이 라우터를 지나갈 때마다,
→ 해당 라우터는 자기 IP 주소를 포인터 위치에 씀
→ 그리고 포인터 값을 4 증가시킴
(IP 주소는 4바이트이므로)
4. Strict-Source-Route Option
- 출발지 호스트가 데이터그램이 반드시 거쳐야 할 정확한 경로(IP들)를 지정하는 옵션
- 사용 목적
- 더 안전하거나 신뢰할 수 있는 경로 선택
- 경쟁사의 네트워크를 우회하기 위한 목적 등
조건
- 데이터그램이 지정된 라우터 IP 목록에 없는 라우터에 도달하면 폐기됨
- 최종 목적지에 도달했는데, 목록에 지정된 라우터 중 일부를 지나지 않았다면 → 역시 폐기됨
- 즉, 지정된 모든 라우터를 정확히 통과해야 하며, 그 외 라우터는 절대 통과 불가
과정
- 라우터는 먼저 Pointer 값과 Length 값을 비교함
- Pointer > Length → 지정된 모든 라우터를 방문한 상태 → 이제 목적지로 전송 가능
- Pointer ≤ Length → 아직 지정된 경로의 라우터 중 방문하지 않은 곳이 있음
IP 주소 스왑(Swap) 동작
- 만약 Pointer가 Length보다 작다면:
- 라우터는 Pointer가 가리키는 IP 주소와 라우터의 목적지 주소를 서로 바꿈
→ 이렇게 하면 다음 라우터가 올바르게 목적지를 인식함
→ 라우터는 pointer가 가리키는 IP 주소를 next hop으로 지정 - Pointer 값을 4 증가
→ 다음 라우터가 기록된 주소를 가리키게 됨
- 라우터는 Pointer가 가리키는 IP 주소와 라우터의 목적지 주소를 서로 바꿈
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)의 체크섬 계산 절차
- 패킷을 여러 섹션으로 나눔
- 예: 16비트 단위로 나눔
- 나눈 섹션들을 1의 보수(One’s Complement) 방식으로 모두 더함
- 일반적인 덧셈이 아니라, 자리 올림은 다시 더하는 방식
- 최종 합계를 반전(Complement)시켜 → 체크섬으로 설정
수신자(Receiver)의 체크섬 확인 절차
- 수신자는 모든 섹션 + 체크섬 값을 다시 더함
- 이론상 결과는 -0(마이너스 0)이 되어야 함
- 1의 보수 체계에서는 -0도 허용됨
- 결과가 -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 패킷의 보안을 강화하기 위한 표준 프로토콜
- 주요 기능:
- 암호화(Encryption) – 도청 방지
- 데이터 무결성(Data Integrity) – 변조 감지
- 원본 인증(Origin Authentication) – 위조 방지
- 암호화 알고리즘 및 키 정의
IP는 도청이나 변조에 취약하며, 암호화와 무결성 검증으로 이를 방어할 수 있다.
IP Spoofing은 출발지 위조 공격이며, 이를 방어하기 위해 IPSec이 암호화·무결성·인증 기능을 제공한다.
'Network Programming > Network Layer' 카테고리의 다른 글
[Network Layer] ICMPv4 (Internet Control Message Protocol Version 4) (0) | 2025.04.23 |
---|---|
[Network Layer] ARP (Address Resolution Protocol) (0) | 2025.04.22 |
[Network Layer] Delivery and Forwarding of IP Packets (1) | 2025.04.22 |
[Network Layer] IPv4 Address (0) | 2025.04.21 |
[Network Layer] Network Layer 기초 (0) | 2025.04.20 |