참고로 파일의 기본 확장자는 .pcapng 를 사용합니다.
1. PCAPNG 기본 블럭 구조
캡쳐파일은 여러개의 블럭으로 이뤄지는데, 기본적으로 사용되는 골격 형태는 다음과 같은 포맷을 가지고 있습니다.
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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Block Type | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Block Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / Block Body / / /* variable length, aligned to 32 bits */ / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Block Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
32비트의 블럭 타입이 있습니다. 이 블록 타입은 이미 사전정의되어 있으며, 뒤에서 차차 언급하도록 하겠습니다. 그리고 블럭의 전체길이, 블럭 몸체, 블럭의 전체길이가 다시 이어집니다. 특이한 것은 뒷 부분에 다시 블럭의 전체길이가 나오는데, 이것은 패킷 구조내에서 이동에 참고하기 위해서 중복되어 기록되는 내용입니다.
블럭은 해당 패킷파일을 다루는 프로그램에 따라 사용될 수도 있고 안될 수도 있습니다. 어떤 블럭은 반드시 포함되어야 하는 블럭이 있는 반면 어떤 블럭은 옵션에 따라 선택 되는 것이므로 프로그램에서도 해당 블럭을 처리할 것인지는 옵션일 뿐입니다.
2. 블럭 타입 소개
블럭 타입은 아래 [블럭 타입 정보] 에 기술되어 있으며, 각 패킷파일에는 항상 2개의 블럭이 존재해야 합니다.
- Section Header Block
- Interface Description Block
그리고 옵션 블럭으로 가능한 것은
- Enhanced Packet Block
- Simple Packet Block
- Name Resolution Block
- Interface Statistics Block
입니다. 이외 실험적으로 사용되고 있는 블럭은 다음과 같습니다.
- Alternative Packet Blocks
- Compression Block
- Encryption Block
- Fixed Length Block
- Directory Block
- Traffic Statistics and Monitoring Blocks
- Event/Security Blocks
실험적으로 사용되는 블럭에 대해서는 언급하지 않도록 하겠습니다.
3. 패킷 파일헤더 레이아웃
파일은 처음 SHB(Section Header Block) 부터 시작되어야 합니다. 차세대패킷 포맷은 여러개의 블럭 형태로 이루어져 있기 때문에 해당 블록의 시작을 대표할 수 있는 SHB 가 필요한 것입니다. 블럭 단위로 헤더를 인식하기 위해서 각 헤더는 헤더 초반에 블럭의 타입과 길이에 대한 정보를 반드시 가지고 있어야 합니다. 이후 설명드리는 각 블럭 정보를 보면 아시겠지만 모두 타입과 길이 정보를 가지고 있습니다.
블럭 단위로 패킷 파일이 만들어지기 때문에 기존 패킷파일보다 좀더 유연한 구성이 가능해 집니다. 블럭 단위로 만들어지는 패킷 파일의 다양한 레이아웃을 다음과 같이 살펴보겠습니다.
위와 같이 여러개의 블럭의 조합으로 다양한 레이아웃 형태로 패킷파일을 구성할 수 있습니다.
4. 옵션(Option)
모든 블럭은 옵션 필드를 포함할 수 있습니다. 옵션 필드는 말그대로 선택될 수 있는 정보로 패킷 처리에 있어서 반드시 필요한 정보가 아닙니다. 옵션의 이름대로 데이터를 읽었을때 좀더 유용한 정보를 제공해 줄 수 있는 부가정보라고 볼 수 있습니다. 이런 정보는 구현할 때 해당 정보를 읽을 수도 있고 그렇지 않을수도 있습니다. 즉, 구현하는 소프트웨어에 따라 정보가 있음에도 불구하고 출력해주지 않을수 있는 것입니다. 옵션 필드는 크게 3 가지로 이루어져 있습니다. 타입, 크기 그리고 해당 옵션의 값입니다.
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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Option Code | Option Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / Option Value / / /* variable length, aligned to 32 bits */ / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / / . . . other options . . . / / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Option Code == opt_endofopt | Option Length == 0 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 옵션 타입 (2바이트) : 각 블럭에서 사용되는 2바이트 코드 값
- 옵션 길이 (2바이트) : 실제 옵션 값의 길이
- 옵션 값 (유동적) : 옵션의 실제 값이 들어가 있는 필드
옵션은 여러번 반복이 될 수도 있습니다. 예를들어 인터페이스가 여러개의 IP 를 가지고 구성되어 있는 경우 해당 정보를 기록하려면 반복이 될수 있습니다. 옵션 정보가 끝났다는 것은 마지막에 opt_endofopt 코드 정보를 참고합니다. 해당 코드가 있다면 더 이상 옵션 정보를 참고하지 않습니다. 참고로, 패킷 코멘트 정보가 바로 여기에 기록됩니다.
옵션 이름 | 코드번호 | 설명 |
---|---|---|
opt_endofopt | 0 | 옵션 필드가 끝났다는 것을 알려주는 것 |
opt_comment | 1 | 해당 블럭의 코멘트 정보 |
5. 블럭정의
5-1. SHB(Section Header Block) - 필수
이 세션 헤더블럭은 꼭 있어야 되는 블럭중에 하나이며, 캡쳐 덤프파일 세션의 가장 처음에 나타납니다. 이 헤더 자체에는 데이터가 포함되지 않으며, 사용될 블럭 정보들이 기록되게 됩니다.
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 +---------------------------------------------------------------+ 0 | Block Type = 0x0A0D0D0A | +---------------------------------------------------------------+ 4 | Block Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 8 | Byte-Order Magic | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 12 | Major Version | Minor Version | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 16 | | | Section Length | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 24 / / / Options (variable) / / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Block Total Length | +---------------------------------------------------------------+
각 포맷의 의미를 알아보면 처음 시작되는 블럭 타입에 대한 고정된 값이 있습니다. 이 값은 캐리지리턴값 과도 같은 "\r\n\n\r" 입니다. 16진수로는 0x0A0D0D0A 가 되겠죠. 다음은 블럭전체에 대한 길이가 나오고 바이트 오더 매직인 0X1A2B3C4D 가 나옵니다. 1234 와 ABCD 로 연속적인 값이니 외우기는 쉽겠죠? 이 값은 리틀엔디안 또는 빅엔디안 시스템에서 저장된 데이터인지 판별하는데 사용됩니다. 그 다음으로 Major, Minor 버전 정보는 해당 포맷에 대한 정보로 현재 Major 는 1 이고 Minor 는 0 입니다. 포맷 자체가 변경되지 않는 이상 해당 값은 블럭타입과 같이 항상 고정되어 있는 값으로 볼 수 있습니다. Section Length는 이어지는 세션에대한 길이 정보롤 64비트 값을 가지고 있습니다. 이 세션 길이에 대한 계산시에는 SHB 헤더 자체는 포함되지 않습니다. 그리고 이 필드는 조금 다른 용도로도 이용되는데요, 큰 패킷파일을 처리할때 빠른 이동을 위해 세션 정보를 스킵하는데 사용될 수 있습니다. 만약 세션 길이가 -1 (0xFFFFFFFFFFFFFFFF) 로 정의되어 있다면 이 세션에 대한 크기가 정의되어 있지 않고 해당 블록이 포함이 하고 있는 데이터의 세션은 Skip 하는데 사용되는데 이용됩니다. 마지막으로 옵션 필드는 이름 그대로 추가적인 정보가 덧 붙을 수 있는데, 다음과 같습니다.
이름 | 코드번호 | 설명 |
---|---|---|
shb_hardware | 2 | 이 세션이 만들어지는데 이용된 하드웨어 정보 |
shb_os | 3 | 이 세션이 만들어지는데 이용된 운영체제 이름 정보 |
shb_userappl | 4 | 이 세션이 만들어지는데 이용된 애플리케이션 이름 정보 |
5-2. IDB(Interface Description Block) - 필수
IDB 또한 SHB 와 마찬가지로 필수적으로 필요한 블럭입니다. 이 블럭은 패킷 캡쳐를 수행한 네트워크 인터페이스에 대한 정보를 담고 있습니다. 이 블럭은 다른 블럭정보를 표시하기 전에 사전에 정의되어 있어야 하므로 보통은 SHB 블럭 다음에 위치합니다.
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 +---------------------------------------------------------------+ 0 | Block Type = 0x00000001 | +---------------------------------------------------------------+ 4 | Block Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 8 | LinkType | Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 12 | SnapLen | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 16 / / / Options (variable) / / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Block Total Length | +---------------------------------------------------------------+
IDB 의 포맷을 살펴보면 처음 블럭타입을 지정하는 정보가 나옵니다. 그리고 블럭 대한 전체 길이 정보와 인터페이스의 링크레이어 타입 정보가 이어집니다. 대부분의 경우라면 링크타입은 이더넷이 될 것입니다. Snaplen 은 패킷 덤프할 시에도 지정할 수 있는 값으로 각 패킷의 최대 바이트 값이 되고 다양한 옵션 정보가 추가될 수 있습니다.
옵션 이름 | 코드번호 | 설명 |
---|---|---|
if_name | 2 | 캡쳐 디바이스로 사용된 인터페이스 이름 |
if_description | 3 | 캡쳐 디바이스로 사용된 인터페이스 설명. 예를들면 "Broadcom NetXtreme" |
if_IPv4addr | 4 | 인터페이스의 네트워크 주소와 넷마스크 - IPv4 |
if_IPv6addr | 5 | 인터페이스의 네트워크 주소와 프리픽스 길이 - IPv6 |
if_MACaddr | 6 | 인터페이스 하드웨어 맥 주소 (48비트) |
if_EUIaddr | 7 | 인터페이스 하드웨어 EUI 주소 (64비트) |
if_speed | 8 | 인터페이스 속도 ( bps 단위) |
if_tsresol | 9 | 타임스탬프 표현 (만약 값이 6이면 1970/1/1 이후 마이크로세컨드 표시) |
if_tzone | 10 | 타임존 |
if_filter | 11 | 캡쳐필터로 사용한 필터 정보 (ex. "tcp port 80" ) |
if_os | 12 | 운영체제 정보 |
if_fcslen | 13 | FCS(Frame Check Sequence) 길이 값 |
if_tsoffset | 14 | 각 패킷에 더해지는 특정 오프셋 정수 값 |
5-3. EPB(Enhanced Packet Block)
EPB 가 네트워크 패킷 정보를 저장하는 기본 블럭이 됩니다. 패킷저장을 할때 EPB 또는 아래에서 설명드릴 SPB(Simple Packet Block) 가 사용될 수 있으므로 반드시 사용되어야 할 블럭이기 보단 옵션으로 선택할 수 있는 블럭입니다.
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 +---------------------------------------------------------------+ 0 | Block Type = 0x00000006 | +---------------------------------------------------------------+ 4 | Block Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 8 | Interface ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 12 | Timestamp (High) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 16 | Timestamp (Low) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 20 | Captured Len | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 24 | Packet Len | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 28 / / / Packet Data / / /* variable length, aligned to 32 bits */ / / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / / Options (variable) / / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Block Total Length | +---------------------------------------------------------------+
옵션 이름 | 코드번호 | 설명 |
---|---|---|
epb_flags | 2 | 링크 레이어 정보가 포함된 플래그 (비트 단위로 표현한 것으로 패킷의 인바운드 또는 아웃 바운드도 표현할 수 있다) |
epb_hash | 3 | 패킷 해쉬 정보 |
epb_dropcount | 4 | 패킷 손실된 개수 - 64비트 |
5-4. SPB(Simple Packet Block)
SPB 는 EPB 보다 가벼운 패킷 저장 구조입니다. SPB 는 PB(Packet Block)와 유사하면서 더 작은 구조로 최소한의 정보만을 담고 있습니다. EPB 보다 저장하는 것이 적기 때문에 빠른 속도로 패킷 저장이 필요하다면 이 블럭이 더 유리합니다. SPB 의 큰 차이점은 인터페이스 ID 필드를 포함하고 있지 않습니다. 그렇기 때문에 IDB 에서 정의된 첫번째 인터페이스에서 캡쳐가 되고 있는 것으로 가정할 수 있습니다. 이 뜻은 한 개 이상의 인터페이스 패킷정보를 가질수가 없다는 뜻이 되기도 합니다. 인터페이스 ID 필드가 없기 때문에 해당 패킷이 어떤 인터페이스를 통해 들어왔는지 알수 없기 때문입니다. 또, 타임스탬프(Timestamp) 필드도 존재하지 않습니다. 타임스탬프가 필요한 경우도 있지만, 패킷 자체만을 고속으로 봐야 하는 경우는 타임스탬프 자체도 영향을 줄 수 있는 요소이기 때문에 SPB 에서는 사용되지 않습니다. 참고로 PB 는 더 이상 사용되지 않는 블럭이므로 패킷 데이터 저장에는 EPB 또는 SPB 로 저장된다고 볼 수 있습니다.
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 +---------------------------------------------------------------+ 0 | Block Type = 0x00000003 | +---------------------------------------------------------------+ 4 | Block Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 8 | Packet Len | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 12 / / / Packet Data / / /* variable length, aligned to 32 bits */ / / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Block Total Length | +---------------------------------------------------------------+
블럭타입은 3 (0x00000003) 이며, 다른 블럭과 마찬가지로 해당 블럭의 전체 크기가 이어집니다. 패킷 데이터가 기록되기 전 패킷 길이 필드가 존재하고 이후 데이터가 저장됩니다. EPB 에 비해 저장되는 필드 정보가 적기 때문에 디스크 용량 사용면에서도 유리하게 됩니다.
참고 정보- 블럭 타입 코드
블럭 타입 코드 | 설명 |
---|---|
0x00000000 | Reserved |
0x00000001 | IDB(Interface Description Block) |
0x00000002 | Packet Block |
0x00000003 | Simple Packet Block |
0x00000004 | Name Resolution Block |
0x00000005 | Interface Statistics Block |
0x00000006 | Enhanced Packet Block |
0x0A0D0D0A | Section Header Block |