• IP → L3 layer (OSI 7 Layer 중)

  • IP Header

    image.png

    • IPv4 헤더
      • 기본적으로 총 20 Byte 길이이며, 각 줄은 32 bit(4 Byte) 로 구성된다.

    1번째 줄 (0-31 비트)

    • Version → 필드 크기 : 4 bit (IPv4) (0x4)
    • IHL (Internet Header Length) → 필드 크기 : 4 bit
      • IP 헤더의 전체 길이를 4 Byte 단위로 표현 = “5”
        • 일반적으로 옵션이 없으면 헤더 길이는 20 Byte 이고, ⇒ 4 byte word(32-bit words) 단위로 표현하므로 20 Byte(헤더 길이) / 4 Byte word = “5”
        • 옵션이 포함되면 최대 15.
    • ToS → 필드 크기 : 8 bit
      • 패킷의 우선순위를 정하는데 사용
    • Total length → 필드 크기 : 16 bit
      • **IP 헤더와 Payload 전체를 포함한 IP 패킷의 전체 길이를 "바이트 단위"**로 표시.

        ⇒ IP Header 길이(4 * 5 Byte) + Payload 길이(28 Byte) = 48 Byte (icmp 가 상위 계층일 때)

      • 최대 표현 가능한 길이 : 16비트이므로 65535 바이트 (2^16 -1)

      • MTU (Maximum Transmission Unit)

        • 한 번에 전송할 수 있는 L2 계층 Ethernet Payload 최대 길이 (보통 1500 바이트)
        • IP 패킷의 Total Length 가 다음 경로의 MTU 보다 크면, 라우터는 패킷을 여러 작은 조각으로 단편화(Fragmentation) 해야 한다.

    2번째 줄 (32-63 비트)

    • Identification (식별자) → 필드 크기 → 16bit
      • 패킷이 단편화되었을 때, 원래 어떤 패킷에 속했는지 식별하는 데 사용
      • 동일한 원본 패킷에서 파생된 모든 단편들은 같은 Identification 값을 가지고, 수신 측에서는 이 값을 보고 흩어진 조각들을 다시 모음.
    • Flags (플래그) → 필드 크기 : 3bit
      • 단편화를 제어하는 비트
      • 첫째 비트: 예약됨 (항상 0).
      • 둘째 비트 (DF - Don't Fragment): 1이면 "단편화 불가"를 의미. 패킷이 MTU보다 커도 단편화하지 말고, 대신 패킷을 버리고 송신자에게 오류(ICMP 메시지)를 보냄.
      • 셋째 비트 (MF - More Fragments): 1이면 "뒤에 단편이 더 있음"을 의미. 마지막 단편은 이 비트가 0 이 됨.
    • Fragment Offset (단편화 오프셋) → 필드 크기 : 13bit
      • 단편화된 조각이 원래 데이터의 어느 위치에 해당하는지를 나타냄.
      • 단위는 8byte word. 수신 측은 이 값을 보고 조각들을 올바른 순서로 재조립

    3번째 줄 (64-95 비트)

    • TTL (Time To Live, 생존 시간) → 필드 크기 : 8bit
      • 패킷이 네트워크 상에서 무한정 떠도는 것을 방지하기 위한 필드.
      • 라우터를 하나 거칠 때마다 값이 1씩 감소.
      • TTL이 0이 되면 해당 패킷은 폐기되고, 송신자에게 ICMP "Time Exceeded" 메시지가 전송.
    • Protocol (프로토콜) → 필드 크기 : 8bit
      • IP 헤더 바로 뒤에 오는 페이로드(데이터)가 어떤 상위 계층 프로토콜에 속하는지를 알려줌.
      • TCP: 6
      • UDP: 17
      • ICMP: 1
      • 수신 측은 이 값을 보고 데이터를 TCP, UDP 등 적절한 처리기에게 전달.
    • Header Checksum (헤더 체크섬) → 필드 크기 : 16bit
      • IP 헤더에 오류가 있는지 검사하기 위한 값.
      • 라우터는 패킷을 수신할 때마다 체크섬을 검사하고, TTL 값을 변경한 후 체크섬을 다시 계산하여 전송. 헤더에 오류가 발견되면 패킷은 폐기됨.

    4번째 & 5번째 줄

    • Source Address (출발지 주소) → 필드 크기 : 32bit
      • 패킷을 보낸 송신자의 32비트 IPv4 주소.
    • Destination Address (목적지 주소) → 필드 크기 : 32bit
      • 패킷을 받을 최종 수신자의 32비트 IPv4 주소.

    그 외

    • Options (옵션) → 필드 크기 : 가변 (0 ~ 40 Byte)
      • 보안, 경로 추적 등 특수한 처리가 필요할 때 사용.
      • 이 필드가 존재하면 IHL 값은 5보다 커짐.
    • Payload (Data, 페이로드) → 필드 크기 : 가변
      • 실제 전송하려는 데이터 부분. (예: TCP 세그먼트, UDP 데이터그램)
      • 페이로드의 **데이터 크기는 Total Length - (IHL * 4)**로 계산
  • IP 헤더 구조체 정의

    typedef struct IpHeader {
    	unsigned char verIhl; // version(4bit) + IHL(4bit), 구분 시 '>>' bit 연산자 사용
    	unsigned char tos;
    	unsigned short length; // totalLength (16bit = 2Byte)
    	unsigned short id;
    	unsigned short fragOffset;
    	unsigned char ttl; // TTL (8bit = 1Byte)
    	unsigned char protocol;
    	unsigned short checksum; 
    	unsigned char srcIp[4];
    	unsigned char dstIp[4];
    } IpHeader;
    
    • verIhl 을 version 과 IHL 로 분리

      unsigned char version = (verIhl >> 4) & 0x0F;  // 상위 4비트
      unsigned char IHL = verIhl & 0x0F;             // 하위 4비트