
L3 즉, IP Layer에서 수행하는 기본적인 기능과 특성은 다음과 같습니다.
Function
1. Routing
2. Transport Layer로 Packet 전송
3. Error detection
Properties
1. Best effort delivery
2. Not responsible for reliable transmission
빠른 시간내의 데이터 전송을 최우선 하지만 전송이 안될 시 책임은 없다라는 것을 알 수 있습니다.
Packet이 Network를 타고 들어와서 Layer 3에 도달하게 되면, IP Header를 까보고 Routing을 진행하거나, Transport Layer로 넘기게 됩니다.
IP Header의 구성을 나타낸 사진입니다. 크기는 4byte (32bit)이고, id, 출발지 주소, 도착지 주소 등으로 구성 되어 있습니다. 이때 Packet의 최대 길이는 2^16 - 1 = 64kb입니다. 필수 정보는 Destination IP address까지 20byte입니다.
TTL and How Traceroute Works
TTL이란, Packet의 유효기간입니다. 우리가 보낸 Packet이 Router에 도착할 때마다 TTL이 1씩 감소하고, TTL값이 0이 되면, Packet이 폐기되고, ICMP가 trigger됩니다.
보통 window os는 TTL을 128, Linux는 64로 설정합니다.Traceroute는 ICMP 패킷을 전송함으로써 작동하며, 데이터 전송과 관련된 모든 라우터는 이러한 패킷을 받습니다. ICMP 패킷은 전송에 사용되는 라우터가 데이터를 효과적으로 전송할 수 있는지 여부에 대한 정보를 제공합니다.
a = IP() a.dst. = 'ip address' b = ICMP() for TTL in range(1, 20): a.ttl = TTL h = srl(a/b, timeout = 2, verbose = 0) if h is None: print("Router: *** (hops = {})".format(TTL)) else: print("Router: {} (hops = {})".format(h.src, TTL))해당 코드는 traceroute 기능을 구현한 것입니다. Python Scapy를 이용해 직접 ICMP 기반 traceroute 를 수행하며, 네트워크 상의 각 중간 라우터 IP와 홉 수(hop count)를 순서대로 출력해 줍니다.
먼저 MTU란, packet의 최대 크기를 의미합니다. 이때 MTU는 64kb입니다.
Packet 구성시 Data 크기가 46byte부터인 이유는 랜선 하나에서 충돌을 감지하기 위해 필요하기 때문이라고 합니다.
packet size는 무한하지 않기 때문에 하나의 packet을 n개의 packet으로 쪼개어 보내게 됩니다.
그러면 조각화 된 패킷이 들어올 때 같은 패킷이라는 것을 어떻게 알 수 있을까요?
IP Header Field에는 Flag와 Fragment offset이 있어 이 두 가지 필드를 통해 같은 패킷이라는 것을 알 수 있습니다.
Flag는 bit 0, 1, 2에 따라 다른 의미를 가집니다.
Flags 필드에서 비트 0은 예약용(항상 0), 비트 1은 단편화 금지(DF), 비트 2(MF)는 추가 단편 여부를 나타내며, MF가 0이면 마지막 조각, 1이면 뒤이을 조각이 있음을 의미합니다.
IPv4 헤더의 Fragment offset 필드는 13비트로 구성되어 있습니다. 만약 바이트 단위 오프셋을 그대로 저장하려면, 최대 헤더 전체 길이(최대 2¹⁶−1 = 64kb)까지 표현하기 위해 16비트가 필요합니다. 그러나 실제 필드 크기는 13bit에 불과하므로, 오프셋 값을 8바이트 단위(=64비트)로 나눠서 저장합니다.
예를 들어 ID field가 100이고, payload size가 100 byte인 packet이 있다고 할 때 packet fragment의 최대 크기는 40byte이기 때문에 3개의 packet으로 나누게 됩니다.
이때 조각화 된 첫번째 packet만 transport layer header를 설정하고 나머지 조각들은 설정하지 않습니다.
목적지에서 조각들을 합칠 때, 첫 조각의 페이로드(전송 계층 헤더)를 기준으로 평가하면 되므로 로직이 간단해지기 때문이라고 합니다.
만약 Fragment 중 일부가 손실된다면, UDP는 전체 패킷을 재전송하고, TCP는 손실된 조각만 다시 보냅니다.
지금까지 Layer 3에 대한 내용과 Packet Fragmentation에 대해 알아봤습니다.
다음 포스트에서는 Packet Fragmentation 과정에서 발생할 수 있는 공격과 Routing에 대한 내용을 정리 해보겠습니다.