IPv4 헤더 필드와 옵션 정리
핵심 요약
IPv4 데이터그램은 헤더와 데이터로 구성된다. 기본 헤더는 20바이트이며, 옵션을 포함하면 최대 60바이트까지 늘어난다. 헤더에는 주소, 전체 길이, 단편화 정보, 수명, 상위 프로토콜, 오류 검출 정보 등이 들어간다.
이 문서는 1981년 9월의 IPv4 규격 원문을 기준으로 인터넷 헤더의 각 필드와 옵션을 정리한 것이다. 네트워크 계층의 전체적인 역할은 네트워크 기초도 함께 참고한다.
IPv4 헤더 구조
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+옵션이 없다면 헤더는 32비트 워드 5개, 즉 20바이트이다. 옵션과 패딩을 포함한 최대 헤더 크기는 32비트 워드 15개, 즉 60바이트이다.
기본 헤더 필드
| 필드 | 크기 | 역할 |
|---|---|---|
| Version | 4비트 | IP 헤더 형식을 나타낸다. IPv4에서는 값이 4이다. |
| IHL | 4비트 | 헤더 길이를 32비트 워드 단위로 나타낸다. 정상 헤더의 최솟값은 5이다. |
| Type of Service | 8비트 | 지연, 처리량, 신뢰성 등 원하는 서비스 특성을 표현한다. |
| Total Length | 16비트 | 헤더와 데이터를 모두 포함한 데이터그램 전체 길이를 바이트 단위로 나타낸다. 최댓값은 65,535바이트이다. |
| Identification | 16비트 | 단편화된 조각들을 원래 데이터그램으로 재조립할 때 사용하는 식별자이다. |
| Flags | 3비트 | 단편화 허용 여부와 뒤에 추가 조각이 존재하는지를 제어한다. |
| Fragment Offset | 13비트 | 현재 조각이 원본 데이터그램의 어느 위치에 속하는지 나타낸다. |
| Time to Live | 8비트 | 데이터그램이 네트워크에 무한히 남지 않도록 수명을 제한한다. |
| Protocol | 8비트 | 데이터 부분을 처리할 상위 계층 프로토콜을 나타낸다. |
| Header Checksum | 16비트 | IPv4 헤더의 오류를 검출한다. |
| Source Address | 32비트 | 송신지 IPv4 주소이다. |
| Destination Address | 32비트 | 목적지 IPv4 주소이다. |
| Options | 가변 | 보안, 경로 지정, 경로 기록, 타임스탬프 등의 부가 기능을 제공한다. |
| Padding | 가변 | 헤더 길이를 32비트 경계에 맞추기 위해 0으로 채운다. |
Version과 IHL
- Version은 헤더가 어떤 IP 버전의 형식으로 해석되어야 하는지를 나타낸다.
- **IHL(Internet Header Length)**은 데이터가 시작되는 위치를 알려준다.
- IHL의 단위는 바이트가 아니라 32비트 워드이다.
- 예를 들어 IHL이
5라면 헤더 길이는 바이트이다.
Type of Service
원문에서 Type of Service는 우선순위 3비트와 서비스 특성 3비트, 예약 영역 2비트로 구성된다.
bit: 0 1 2 3 4 5 6 7
+-----------+---+---+---+---+---+
| 우선순위 | D | T | R | 0 | 0 |
+-----------+---+---+---+---+---+D = 1: 낮은 지연(Low Delay)을 선호한다.T = 1: 높은 처리량(High Throughput)을 선호한다.R = 1: 높은 신뢰성(High Reliability)을 선호한다.- 6~7번 비트는 향후 사용을 위한 예약 영역이다.
지연, 처리량, 신뢰성은 서로 상충할 수 있다. 더 좋은 서비스를 요구할수록 비용이 커지거나 다른 특성이 나빠질 수 있으므로, 원문은 특별한 경우가 아니라면 세 지표 중 최대 두 개만 설정하도록 권고한다.
| 값 | 원문의 우선순위 명칭 | 의미 |
|---|---|---|
111 | Network Control | 개별 네트워크 내부의 제어 트래픽 |
110 | Internetwork Control | 게이트웨이 제어 트래픽 |
101 | CRITIC/ECP | 긴급 제어 수준 |
100 | Flash Override | Flash보다 높은 우선순위 |
011 | Flash | 높은 우선순위 |
010 | Immediate | 즉시 처리 |
001 | Priority | 우선 처리 |
000 | Routine | 일반 트래픽 |
원문 기준
위 설명은 1981년 규격의 Type of Service 정의를 정리한 것이다. Network Control은 해당 네트워크 안에서만 사용하며, Internetwork Control은 게이트웨이 제어 주체를 위한 값으로 설명되어 있다.
Total Length
Total Length는 헤더와 데이터를 포함한 전체 크기를 바이트 단위로 나타낸다.
- 16비트이므로 최대 크기는 65,535바이트이다.
- 원문은 모든 호스트가 전체 또는 단편 형태로 도착하는 576바이트 데이터그램을 수신할 수 있어야 한다고 규정한다.
- 576바이트는 512바이트 데이터와 64바이트의 헤더 공간을 함께 담을 수 있도록 선택된 값이다.
- 일반적인 IPv4 헤더는 20바이트, 최대 IPv4 헤더는 60바이트이다.
단편화 관련 필드
큰 데이터그램이 네트워크가 처리할 수 있는 크기보다 크면 여러 조각으로 나뉠 수 있다. 이때 다음 세 필드가 함께 사용된다.
- Identification: 같은 원본에서 나온 조각들을 식별한다.
- Flags: 단편화 허용 여부와 추가 조각의 존재 여부를 표시한다.
- Fragment Offset: 각 조각이 원본 데이터그램에서 차지하던 위치를 표시한다.
Flags의 구조는 다음과 같다.
| 비트 | 이름 | 값과 의미 |
|---|---|---|
| 0 | Reserved | 항상 0이어야 한다. |
| 1 | DF | 0: 단편화 가능, 1: 단편화 금지(Don’t Fragment) |
| 2 | MF | 0: 마지막 조각, 1: 뒤에 조각이 더 있음(More Fragments) |
Fragment Offset은 8바이트 단위로 위치를 표현한다. 첫 번째 조각의 오프셋은 0이다.
Time to Live
TTL은 데이터그램이 인터넷 시스템 안에 머무를 수 있는 최대 수명을 제한한다.
- 값이
0이 되면 데이터그램은 폐기되어야 한다. - 원문에서는 초 단위로 설명하지만, 각 처리 모듈은 1초보다 짧게 처리하더라도 TTL을 최소 1만큼 감소시킨다.
- 따라서 TTL은 정확한 체류 시간이라기보다 데이터그램이 존재할 수 있는 상한으로 보아야 한다.
- 목적지에 도달할 수 없는 데이터그램이 네트워크를 무한히 순환하는 것을 막는다.
Protocol
Protocol 필드는 IPv4 데이터그램의 데이터 부분을 어느 상위 프로토콜이 처리할지를 나타낸다. 즉, 수신 측 IP 모듈이 페이로드를 적절한 상위 계층으로 넘길 수 있게 한다.
Header Checksum
Header Checksum은 데이터가 아닌 IPv4 헤더만 검사한다. TTL처럼 전송 중에 바뀌는 필드가 있으므로, 헤더를 처리하는 각 지점에서 다시 계산하고 검증한다.
계산 방식은 다음과 같다.
- 체크섬 필드를
0으로 둔다. - 헤더를 16비트 워드 단위로 나눈다.
- 모든 워드를 1의 보수 덧셈으로 더한다.
- 합계의 1의 보수를 체크섬 값으로 사용한다.
Options와 Padding
IPv4 옵션은 데이터그램마다 포함하지 않아도 되지만, 원문은 모든 호스트와 게이트웨이의 IP 모듈이 옵션을 구현해야 한다고 설명한다. 즉, 옵션의 전송은 선택 사항이지만 옵션 처리 기능 자체는 선택 사항이 아니다.
옵션은 다음 두 형식 중 하나를 사용한다.
Option Type1바이트만 사용하는 형식Option Type + Option Length + Option Data를 사용하는 형식
Option Length는 타입과 길이 필드 자체를 포함한 옵션 전체 길이를 센다.
Option Type의 구성
Option Type 1바이트는 세 부분으로 나뉜다.
| 구성 요소 | 크기 | 의미 |
|---|---|---|
| Copied Flag | 1비트 | 단편화할 때 모든 조각에 이 옵션을 복사할지 결정한다. |
| Option Class | 2비트 | 옵션의 용도를 분류한다. |
| Option Number | 5비트 | 클래스 안에서 구체적인 옵션을 식별한다. |
Copied Flag는 0이면 복사하지 않고, 1이면 모든 조각에 복사한다.
| 클래스 | 의미 |
|---|---|
0 | 제어(Control) |
1 | 향후 사용을 위해 예약 |
2 | 디버깅 및 측정 |
3 | 향후 사용을 위해 예약 |
주요 IPv4 옵션
| 옵션 | Type | 길이 | 단편화 시 처리 | 역할 |
|---|---|---|---|---|
| End of Option List | 0 | 1바이트 | 필요에 따라 변경 가능 | 옵션 목록의 끝을 표시한다. |
| No Operation | 1 | 1바이트 | 필요에 따라 변경 가능 | 다음 옵션을 32비트 경계에 정렬할 때 사용한다. |
| Security | 130 | 11바이트 | 모든 조각에 복사 | 보안 등급, 구획, 취급 제한, TCC 정보를 전달한다. |
| Loose Source and Record Route | 131 | 가변 | 모든 조각에 복사 | 송신자가 느슨한 경로를 제시하고 실제 경로도 기록한다. |
| Strict Source and Record Route | 137 | 가변 | 모든 조각에 복사 | 송신자가 지정한 직접 연결 경로만 사용하고 경로를 기록한다. |
| Record Route | 7 | 가변 | 첫 번째 조각에만 포함 | 데이터그램이 거친 IP 주소를 기록한다. |
| Stream Identifier | 136 | 4바이트 | 모든 조각에 복사 | 16비트 SATNET 스트림 식별자를 전달한다. |
| Internet Timestamp | 68 | 가변, 최대 40바이트 | 첫 번째 조각에만 포함 | 통과 시각과 필요에 따라 기록 주체의 주소를 저장한다. |
End of Option List와 No Operation
- **End of Option List(EOL)**는 옵션 목록이 끝났음을 표시한다. IHL이 가리키는 헤더 끝보다 옵션이 먼저 끝날 때 사용한다.
- **No Operation(NOP)**은 옵션 사이에 삽입해 다음 옵션을 32비트 경계에 정렬하는 용도로 사용할 수 있다.
두 옵션 모두 Option Type 1바이트만 사용하며 별도의 길이 필드가 없다.
Security
Security 옵션은 다음 정보를 전달하기 위해 정의되었다.
- 보안 등급(Security)
- 정보 구획(Compartments)
- 취급 제한(Handling Restrictions)
- 전송 제어 코드(TCC)
전체 길이는 11바이트이며 단편화할 때 모든 조각에 복사된다. 하나의 데이터그램에는 최대 한 번만 나타날 수 있다.
역사적 맥락
이 옵션의 구체적인 등급과 코드는 당시 미국 국방 관련 요구 사항과 기관 문서를 전제로 정의되어 있다.
Loose Source and Record Route
LSRR은 송신자가 경로 정보를 제공하면서, 데이터그램이 실제로 지나간 경로도 같은 공간에 기록하게 한다.
- 형식은
Type + Length + Pointer + Route Data이다. - Route Data는 32비트 IPv4 주소의 연속이다.
- Pointer의 최솟값은
4이며, 다음에 처리할 주소의 위치를 가리킨다. - 다음에 지정된 주소까지 가는 중간 경로는 게이트웨이가 자유롭게 선택할 수 있다.
- 옵션의 전체 크기는 전송 중에도 변하지 않는다.
- 모든 조각에 복사되며, 한 데이터그램에 최대 한 번만 나타난다.
Strict Source and Record Route
SSRR의 형식과 기본 동작은 LSRR과 비슷하지만 경로 제약이 더 강하다.
- 다음에 지정된 주소까지 직접 연결된 네트워크만을 이용해야 한다.
- 지정되지 않은 중간 게이트웨이를 임의로 거쳐서는 안 된다.
- 모든 조각에 복사되며, 한 데이터그램에 최대 한 번만 나타난다.
Record Route
Record Route 옵션은 데이터그램을 전달한 IP 모듈의 주소를 순서대로 기록한다.
- 송신 호스트가 예상 경로를 담을 만큼 충분한 공간을 미리 확보해야 한다.
- 경로가 추가되더라도 옵션 크기는 변하지 않는다.
- 기록 공간이 가득 차면 주소를 더 기록하지 않고 전달한다.
- 주소 하나를 기록하기에는 공간이 부족한 애매한 상태라면 데이터그램을 오류로 보고 폐기할 수 있다.
- 단편화 시 첫 번째 조각에만 포함되며, 한 데이터그램에 최대 한 번만 나타난다.
Stream Identifier
Stream Identifier 옵션은 스트림 개념을 지원하지 않는 네트워크를 거칠 때도 16비트 SATNET 스트림 식별자를 전달하기 위해 정의되었다. 길이는 4바이트이며 모든 조각에 복사된다.
Internet Timestamp
Internet Timestamp 옵션은 데이터그램을 처리한 시각을 기록한다.
- 전체 길이는 최대 40바이트이다.
- Pointer는 다음 타임스탬프를 기록할 공간을 가리키며 최솟값은
5이다. - Overflow는 공간 부족으로 타임스탬프를 기록하지 못한 IP 모듈의 수를 나타낸다.
- Timestamp는 자정 이후의 밀리초를 32비트 값으로 표현한다.
- 표준 시각을 사용할 수 없다면 최상위 비트를
1로 설정해 비표준 값임을 표시한다.
Flag에 따른 기록 방식은 다음과 같다.
| Flag | 기록 방식 |
|---|---|
0 | 32비트 타임스탬프만 연속으로 기록한다. |
1 | 각 타임스탬프 앞에 기록 주체의 IPv4 주소를 함께 기록한다. |
3 | IPv4 주소를 미리 지정하고, 해당 주소와 일치하는 모듈만 타임스탬프를 기록한다. |
타임스탬프 공간이 가득 차면 Overflow를 증가시키고 데이터그램을 전달한다. 남은 공간이 타임스탬프 하나를 담기에는 부족하거나 Overflow 자체가 넘치면 데이터그램을 오류로 보고 폐기할 수 있다. 이 옵션은 단편화 시 첫 번째 조각에만 포함된다.
전체 흐름으로 이해하기
IPv4 데이터그램을 처리하는 장비는 대략 다음 순서로 헤더를 활용한다.
- Version과 IHL을 읽어 IPv4 헤더의 형식과 끝 위치를 확인한다.
- Total Length를 통해 전체 데이터그램의 범위를 파악한다.
- Header Checksum으로 헤더 오류를 검사한다.
- TTL을 감소시키고, 값이
0이 되면 데이터그램을 폐기한다. - Destination Address와 옵션의 경로 정보를 참고해 다음 전달 위치를 결정한다.
- 필요하면 Identification, Flags, Fragment Offset을 사용해 단편화를 처리한다.
- 최종 목적지에서는 Protocol 값을 확인해 페이로드를 적절한 상위 프로토콜로 전달한다.
핵심 포인트
- IPv4 기본 헤더는 20바이트, 옵션 포함 최대 헤더는 60바이트이다.
- Total Length가 표현할 수 있는 데이터그램의 최대 크기는 65,535바이트이다.
- 단편화는 Identification, DF/MF Flags, Fragment Offset이 함께 제어한다.
- Fragment Offset의 단위는 8바이트이다.
- TTL은 전송 경로의 각 처리 지점에서 최소 1씩 감소한다.
- Header Checksum은 페이로드가 아닌 헤더만 보호한다.
- 옵션의 전송은 선택적이지만, 원문에서는 IP 모듈이 옵션 처리 기능을 구현해야 한다고 규정한다.
- Padding은 헤더가 32비트 경계에서 끝나도록
0으로 채운다.