RFC 791 - Internet Protocol Version 4(L3 Layer) Network

[Internet Header Packet Format]
아이피 헤더 포맷은 다음과 같다.

Version(1바이트 중 상위 4비트)
    IP의 버전을 나타낸 필드다. 4는 ipV4를 나타낸다.

IHL(1바이트 중 하위 4비트)
    Internet Header Length의 약자. 실제 길이는 IHL 필드의 값 * 4이다.

Type of Service(1바이트)
    이 필드는 QoS가 요구하는 추상적인 파라미터들을 제공한다. 
    QoS에 대한 정의는 http://ko.wikipedia.org/wiki/QoS를 참조하자.
    예를 들어, 일부 네트워크는 precedence network(선행 네트워크) 서비스를 제공하는데
    precedence network의 트래픽은 전송 스케줄링을 할 시에 다른 트래픽보다 우선적으로 먼저 전송이 된다.

    보통은 low-delay, high-reliability, high-throughput 옵션을 많이 사용한다.
    
    Type of Service 필드의 구조는 아래와 같다.

    Bits 0 - 2 : Precedence
        111 - Network Control
        110 - Internetwork Control
        101 - CRITIC/ECP
        100 - Flash Override
        011 - Flash
        010 - Immediate
        001 - Priority
        000 - Routine
    Bit 3 : 0 = Normal Delay, 1 = Low Delay.
    Bit 4 : 0 = Normal Throughput, 1 = High Throughput.    
    Bit 5 : 0 = Normal Relibility, 1 = High Relibility.
    Bits 6-7 : Reserved for Future Use.

Total Length(2바이트)
    이더넷 프레임에서 MAC 헤더를 제외한(즉, IP 헤더부터 시작하는) 데이터그램의 길이를 나타내는 필드이다.

Identification(2바이트)
    identifying value는 fragmentation 된 데이터그램의 fragment들을 어셈블링하는데 사용된다.

Flags(2바이트 중 상위 3비트)

    Bit 0 : reserved, must be zero
    Bit 1 : (DF) 0 = May Fragment, 1 = Don't Fragment.
    Bit 2 : (MF) 0 = Last Fragment, 1 = More Fragments.
    
Fragment Offset(2바이트 중 하위 13비트)
    이 필드는 데이터그램의 fragment가 어디에 있는지를 나타낸다.

Time to Live(1바이트)
    Time to Live 값을 저장한 필드이다.

Protocol(1바이트)
    다음 레벨의 프로토콜을 명시한 필드이다.

Header Checksum(2바이트)
    Checksum은 Source와 Dest의 패킷 통신에 있어 유효성 체크를 하는 역할을 한다.
    Source가 Dest에 보낼 패킷의 체크썸을 구한후, Dest에 패킷을 보내고
    Dest는 받은 패킷의 체크썸을 구하여 두 체크썸의 값이 일치하면 유효한 패킷이라 간주하고 받는다.
    만약, 두 체크썸의 값이 일치하지 않으면 유효하지 않은 패킷이라 간주하고 
    Dest는 받은 패킷을 버린후 Source로부터 다음 패킷이 오기를 기다린다.
    
    계산은 순수한 IP 헤더의 패킷 값들을 1의 보수로 변환한 후 2바이트 단위로 끊어서 모두 더한다.
    (단, Checksum 필드는 FF FF로 처리하여 연산)
    
    예를 들어, IP 헤더의 패킷이 아래와 같다고 하자.
    45 00 00 28 01 00 00 00 40 06  7B CE 7F 00 00 01 7F 00 00 01
    이것을 1의 보수로 변환을 하면 아래와 같다.
    BA FF FF D7 FE FF FF FF BF F9 FF FF 80 FF FF FE 80 FF FF FE
    이제 이것을 2바이트 단위로 끊은후에 모두 더하면 아래와 같이 더해야한다.
    BAFF + FFD7 + FEFF + FFFF + BFF9 + FFFF + 80FF + FFFE + 80FF + FFFE = 87BC6. 
   하지만, Header Checksum 필드는 2바이트이므로 상위 4비트인 8를 따로 뽑아내고 
   남아있는 7BC6에 뽑아낸 상위 4비트의 값인 8을 더한 값이 체크썸
이다.

Source Address(4바이트)
    Source의 IP 주소이다.

Destination Address(4바이트)

    Dest의 IP 주소이다.

Options(variable)
    옵션 필드는 데이터그램에 포함이 되어있을 수도 있고 안 되어있을 수도 있다.
    그렇기 때문에 옵션 필드는 길이가 가변이다. 

    옵션 필드의 포맷2개의 케이스로 나뉜다. 
    1. option-type octet(octet이 option-type 하나만 존재)
        해당 타입 : End of Option List, No Operation
    2. option-type octet, option-length octet, actual option-data octets(octet이 3개가 존재)
        해당 타입 : Security, Loose Source and Record Route, Strict Source and Record Route,
                      Record Route, Stream Identifier, Internet Timestamp
              
    option-type octet은 3개의 필드로 나뉜다.
    1 bit : copied flag 
        0 = not copied, 1 = copied
    2 bits : option class 
        0 = control, 1 = reserved for future use, 2 = debugging and measurement, 3 = reserved for future use
    5 bits : option number 

    option number, length의 조합으로 구성되는 internet options와 specific option definitions는
    http://www.faqs.org/rfcs/rfc791.html의 Section 3.1을 참조하면 자세히 나와있다.

Padding(variable)
    아무 내용이 없는 필드이다. 단지, options 필드를 포함하여 길이를 32비트로 맞추어야 하기 때문에
    options 필드가 끝난 후 남은 비트들을 단순히 0으로 채우는 필드이다.


[IP Fragmentation & Reassembly]
http://en.wikipedia.org/wiki/IPv4에 원리가 알기 쉽게 잘 나와있다.
    

1 2 3 4 5 6 7 8 9 10 다음