檔案內容分成如下的區塊串接起來,前後有相同的長度欄位 (Block Total Length),限定出每個區塊的範圍,方便往後、或往前跳過不需要或不認得的 Block Type,容易擴展新定義的區塊。
|
- Block Total Length:整個區塊 byte 數。
- Block Type:決定區塊內容 (Block Body) 的格式,區塊內容都會補齊 32-bit,所以區塊長度也會是 4 的倍數。
- Block Body:依據 Block Type,除了必要欄位外,可放多個 TLV 選項。都 32-bit 對齊。
區塊雖然是一維線性串起來的,但有邏輯上的階層,最頂層一定是叫 Section Header Block 的區塊,一個檔案可以有多個頂層的 Section Header Block。
例如傳統 pcap 檔案轉成 pcapng 的區塊樹狀階層架構會是這樣:
Section Header Block +- Interface Description Block +- Enhanced Packet Block +- Enhanced Packet Block +- ... +- Enhanced Packet Block
選項表
每個選項有 Type、Length、Value 三個欄位,可依 Length 跳過不需要或不認得的選項。- Option Type (2-byte):Option Type 的編碼。Most Significant Bit 為 1 保留為內部使用。
- Option Length (2-byte):Option Value 不含補齊 32-bit 的實際長度。
- Option Value (variable length):Option 的值,補到 32-bit 對齊。如果是字串,不能假設是以 0 結束。Option Length 為 0 則無此項。
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, padded to 32 bits / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / / . . . other options . . . / / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Option Code == opt_endofopt | Option Length == 0 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 名稱 | Code | 長度 | 可多個? | 說明 |
|---|---|---|---|---|
| opt_endofopt | 0 | 0 | no | 選項表結束。 |
| opt_comment | 1 | 可變 | 可 | utf-8 編碼的註解,字串沒有結束的 0。換行用「\r\n」或「\n」。 |
| opt_custom 客訂選項 | 0x0BAC | 可變 | 可 | utf-8 編碼的字串,沒有結束的 0。複製到新檔案。 |
| 0x0BAD | 可變 | 可 | 二進位資料。複製到新檔案。 | |
| 0x4BAC | 可變 | 可 | utf-8 編碼的字串,沒有結束的 0。不複製到新檔案。 | |
| 0x4BAD | 可變 | 可 | 二進位資料。不複製到新檔案。 |
客訂選項有 4 種,選項值開頭放登記在 IANA 的 32-bit Private Enterprise Number (PEN) 來避免衝突。
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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Custom Option Code | Option Length | +---------------------------------------------------------------+ | Private Enterprise Number (PEN) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / Custom Data / / variable length, padded to 32 bits / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Section Header Block (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 | Section Header Block Type = 0x0A0D0D0A | +---------------------------------------------------------------+ 4 | Block Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 8 | Byte-Order Magic = 0x1A2B3C4D | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 12 | Major Version = 1 | Minor Version = 0 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 16 | | | Section Length | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 24 / / / Options (variable) / / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Block Total Length | +---------------------------------------------------------------+
- Block Type 0x0A0D0D0A (字串 "\n\r\r\n"):無論位元組順序怎樣都一樣都可以辨認到。透過 FTP 或 HTTP 傳送時,用來偵測不適當的 ASCII 轉換。
- Byte-Order Magic 0x1A2B3C4D:用來偵測位元組順序 (byte order)。
- Major Version 和 Minor Version:格式版本,目前 1.0。
- Section Length (signed 64-bit value):不含 Section Header Block 自己的 section 長度。可用來快速跳過 section。-1 代表未知。4 的倍數。
- Options:選項表。區塊特有選項有擷取機器的機型、作業系統、應用程式等。
Interface Description Block (IDB)
描述擷取封包的界面資訊。處理檔案的工具程式,會將每個 Section 的 IDB,獨立從 0 開始編號,稱為 Interface ID。Section 內其它有 Interface ID 欄位的區塊,就要有對應的 IDB。Simple Packet Block 沒有 Interface ID 欄位隱含 Interface ID 0。 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 = 0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
12 | SnapLen |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16 / /
/ Options (variable) /
/ /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Block Total Length |
+---------------------------------------------------------------+
- LinkType: 跟 pcap 的 header type 一樣。
- SnapLen:每個封包最多擷取前面的 byte 數。0 表示不限制。
| Name | Code | Length | 可多個? | 說明 |
|---|---|---|---|---|
| if_name | 2 | Variable | no | |
| if_description | 3 | Variable | no | |
| if_IPv4addr | 4 | 8 | yes | |
| if_IPv6addr | 5 | 17 | yes | |
| if_MACaddr | 6 | 6 | no | |
| if_EUIaddr | 7 | 8 | no | |
| if_speed | 8 | 8 | no | |
| if_tsresol | 9 | 1 | no | 時間精度。MSB 0:剩下是 10 的 negative power。MSB 1:剩下是 2 的 negative power。預設是 10-6,跟 pcap 預設的微秒一致。 |
| if_tzone | 10 | 4 | no | |
| if_filter | 11 | variable | no | |
| if_os | 12 | variable | no | |
| if_fcslen | 13 | 1 | no | |
| if_tsoffset | 14 | 8 | no |
Enhanced Packet Block (EPB)
標準放封包的區塊。另外封包也可以放在 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 | Enhanced Packet Block Type = 0x00000006 | +---------------------------------------------------------------+ 4 | Block Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 8 | Interface ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 12 | Timestamp (High) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 16 | Timestamp (Low) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 20 | Captured Packet Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 24 | Original Packet Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 28 / / / Packet Data / / variable length, padded to 32 bits / / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / / Options (variable) / / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Block Total Length | +---------------------------------------------------------------+
- Interface ID (32-bit):對應的 IDB。原本 Packet Block 只有 16-bit,另外 16-bit Drops Count 改移到 option。
- Timestamp (High) and Timestamp (Low): 64-bit 的 epoch 時間,單位在 IDB 的 'if_tsresol' 選項,預設是微秒。在 pcap 是分成 32-bit 秒和 32-bit 微秒。
- Captured Packet Length:Packet Data 的封包長度,不含補齊。會是 Original Packet Length 和 IDB 的 SnapLen 比較,值較小的。
- Original Packet Length:在網路實際傳送的封包長度。
- Packet Data:擷取的封包加上補到 32-bit 對齊。封包格式依據 IDB 的 LinkType 欄位。
Simple Packet Block (SPB)
SPB 簡化 EPB,只保留 Original Packet Length,只有 16-byte overhead,不需要取得 timestamp 和計算,適合有效能或空間瓶頸的情況。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 | Simple Block Type = 0x00000003 |
+---------------------------------------------------------------+
4 | Block Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8 | Original Packet Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
12 / /
/ Packet Data /
/ variable length, padded to 32 bits /
/ /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Block Total Length |
+---------------------------------------------------------------+
- Original Packet Length: 在網路實際傳送的封包長度。和 IDB 的 SnapLen 比較,較小的就是實際擷取的封包長度。
- Packet Data:擷取的封包和 padding。封包格式依據 IDB 的 LinkType 欄位。
沒有留言:
張貼留言