にいやんブログ『【パケット解析】Wiresharkのpcapとpcapngの違いとは?ファイルサイズ比較とログ保存で失敗しない選び方』 では、実務における pcap と pcapng のメリットや使い分けについて詳しく解説されています。
本記事ではその発展編として、「バイナリレベルで両者の構造はどう異なっているのか?」 という内部仕様(フォーマット構造)に焦点を当てて深掘り解説します。独自スクリプトの作成や、パケット解析エンジンの仕組みを学びたい方はぜひ参考にしてください。
1. 伝統的な .pcap のバイナリ構造(Libpcap File Format)
pcap(libpcap形式)の構造は極めてシンプルです。
ファイル全体は 「1つのグローバルヘッダ(Global Header)」 と、その後に続く 「パケットヘッダ + パケットデータ」 の繰り返しのみで構成されています。

Global Header(24バイト固定)
キャプチャ開始時に一度だけ出力されるヘッダです。
| フィールド | サイズ | 役割・説明 |
| Magic Number | 4 bytes | エンディアン判定およびタイムスタンプ精度(マイクロ秒: 0xa1b2c3d4 / ナノ秒: 0xa1b23c4d) |
| Major / Minor Version | 4 bytes | フォーマットバージョン(通常は Major 2, Minor 4) |
| Thiszone | 4 bytes | GMTと現地時刻の時差(通常は 0) |
| Sigfigs | 4 bytes | タイムスタンプの精度指定(通常は 0) |
| SnapLen | 4 bytes | 1パケットあたりの最大キャプチャサイズ(例: 65535) |
| Network (LinkType) | 4 bytes | データリンク層のタイプ(例: 1 = Ethernet, 105 = IEEE 802.11) |
pcapの限界:
Global Headerに
Network (LinkType)が1つしか記載できないため、1つのファイル内でイーサネット(Ethernet)とWi-Fi(802.11)など異なるキャプチャインターフェースのデータを混在させることが構造上不可能です。
2. 次世代規格 .pcapng のブロック構造(PCAPNG Specification)
pcapng(PCAP Next Generation)は、特定の固定ヘッダを持たず、すべてのデータが 「Block(ブロック)」 という概念で管理されています。
各ブロックは先頭に Block Type と Block Total Length を持ち、終端にも Block Total Length を持つため、解析ツールは未知のブロックを安全にスキップ(読み飛ばし)できます。

基本的なブロックフォーマット
すべてのブロックは以下の共通枠組みを持っています。

主なブロックタイプ一覧
| ブロック名 | Type値 (Hex) | 役割 |
| Section Header Block (SHB) | 0x0A0D0D0A | ファイル/セクションの開始を表す。マジックナンバーやOS情報、ハードウェア情報を格納 |
| Interface Description Block (IDB) | 0x00000001 | キャプチャ対象インターフェース(例: eth0)のLinkTypeやIP、タイムスタンプ精度を定義 |
| Enhanced Packet Block (EPB) | 0x00000006 | パケットデータ本体と高精度タイムスタンプ、Interface IDを格納する主ブロック |
| Interface Statistics Block (ISB) | 0x00000005 | キャプチャ終了時のドロップ数や受信パケット数などの統計情報 |
| Decryption Secrets Block (DSB) | 0x0000000A | TLSの TLS Key Log など、復号に必要な鍵情報をログ内部に保持 |
3. なぜpcapngは柔軟で高機能なのか?(構造的な理由)
前回の記事 で触れた「複数インターフェース対応」や「パケットへのコメント機能」は、このバイナリ構造の変更によって実現されています。
- 複数インターフェースの共存メカニズムファイル冒頭に
IDB #0 (eth0)、IDB #1 (wlan0)のように複数のインターフェース記述ブロックを並べ、パケットブロック(EPB)側でInterface ID = 0/Interface ID = 1を参照することで、単一ファイル内に異なるネットワークカードのログを混在記録できます。 - TLV(Type-Length-Value)形式によるオプション拡張各ブロックの末尾には任意の
Options領域が存在します。ここにopt_comment (Option Code: 1)を追加することで、パケット単位のコメント、OS情報、フィルタ条件などを自由に保持できるようになっています。 - 安全な互換性維持ブロック構造の長さ(
Block Total Length)が定義されているため、古いツールが最新のブロック(例: 暗号鍵情報を保持するDSBなど)を解釈できなくても、単にそのバイト長分をスキップして次のパケットへ進むことができます。
4. まとめ:構造を知ることで見えてくる選択基準
pcap:Global Header(24B)+ Packet Header(16B)という単純な構造。古くからの C ライブラリや簡素な自作アナライザーで解析しやすい。pcapng:ブロック単位(SHB / IDB / EPB等)で構成された拡張型構造。マルチIF、コメント、TLS鍵、統計データなどを柔軟に保持可能。
より詳細な使い分けやファイルサイズ比較については、ぜひ にいやんブログの解説記事 を併せてご覧ください!


コメント