Pcap 数据包捕获格式详解

article/2025/9/23 20:32:28

Pcap 是 Packet Capture 的英文缩写,是一种行业标准的网络数据包捕获格式。如果你是网络开发人员,那么通常会使用 Wireshark、Tcpdump 或 WinDump 等网络分析器捕获 TCP/IP 数据包,而抓包后存盘的文件格式就是 .pcap 文件。

文件格式

Pcap 文件格式是一种二进制格式,支持纳秒级精度的时间戳。虽然这种格式在不同的实现中有所不同,但是所有的 pcap 文件都具有如下图所示的一般结构。

全局报头

全局报头(Global Header)包含魔数(Magic number)、GMT 偏移量、时间戳精度、捕获的数据包的最大长度,以及数据链路的类型。内部具体格式和区域划分如下:

                           1                   2                   30 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 |                          Magic Number                         |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+4 |          Major Version        |         Minor Version         |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+8 |                           Reserved1                           |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+12 |                           Reserved2                           |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+16 |                            SnapLen                            |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+20 | FCS |f|                   LinkType                            |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Pcap 文件全局报头的长度为 24 字节,各区域/字段说明如下:

  • Magic Number(32 位)

    一个无符号幻数,其值为十六进制数 0xA1B2C3D4 或十六进制数 0xA1B23C4D。如果值为 0xA1B2C3D4,则 Packet Records 中的时间戳以秒和微秒为单位;如果是 0xA1B23C4D,则数据包记录中的时间戳以秒和纳秒为单位。另外,这个幻数也可用于区分保存在小端机器上的部分和保存在大端机器上的部分,并自动识别 pcap 文件。

  • Major Version(16 位)

    一个无符号值,给出 pcap 格式的当前主要版本的编号。

  • Minor Version(16 位)

    一个无符号值,给出 pcap 格式的当前次要版本的编号。

  • Reserved1(32 位)

    未使用的保留字段,pcap 文件写入器应填充 0,pcap 文件读取器必须忽略。这个值被一些较早的实现记录为“gmt to local correction”,因此一些较旧的 pcap 文件编写器在此字段中存储了非零值。

  • Reserved2(32 位)

    未使用的保留字段,pcap 文件写入器应填充 0,pcap 文件读取器必须忽略。这个值被一些较旧的实现记录为“accuracy of timestamps”,因此一些较旧的 pcap 文件编写器在此字段中存储了非零值。

  • SnapLen(32 位)

    一个无符号值,表示从每个数据包中捕获的最大字节数。每个数据包中超过此值的部分将不会存储在文件中。注意:该值不得为零;如果未指定限制,则该值应为大于或等于文件中最大数据包长度的数字。

  • LinkType(28 位)

    一个无符号值,在全局报头最后 4 字节的低 28 位中定义文件中数据包的链路层类型。

  • Frame Cyclic Sequence present(4 位)

    如果设置了“f”位,则 FCS 位提供附加到每个数据包的 FCS 字节数,有效值介于 0 和 7 之间。

在全局报头后面,跟着 0 条或多条捕获的数据包数据记录(Packet Record)。

数据记录

数据包记录(Packet Record)是存储来自网络的数据包的标准容器,包括 Packet Header 和 Packet Data 两部分。其中,Packet Header 长度固定为 16 字节,Packet Data 则是可变长度的负荷数据。

Packet Record 内部具体格式和区域划分如下:

                          1                   2                   30 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 |                      Timestamp (Seconds)                      |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+4 |            Timestamp (Microseconds or nanoseconds)            |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+8 |                    Captured Packet Length                     |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+12 |                    Original Packet Length                     |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+16 /                                                               //                          Packet Data                          //                        variable length                        //                                                               /+---------------------------------------------------------------+

数据记录各区域/字段说明如下:

  • Timestamp(秒)和 Timestamp(微秒或纳秒)

    时间戳,包括整数(秒数)和小数(微秒或纳秒)部分。秒值是一个 32 位无符号整数,表示自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的秒数,微秒或纳秒值表示自那以后经过的微秒或纳秒数秒。值得一提的是,该值是表示微秒还是纳秒,由文件头中的幻数指定。

  • Captured Packet Length(32 位)

    一个无符号值,表示从数据包中捕获的字节数(即数据包数据字段的长度)。它将是原始数据包长度(Original Packet Length)和接口的快照长度(上图中的 SnapLen 定义)中的最小值。

  • Original Packet Length(32 位)

    一个无符号值,表示数据包在网络上传输时的实际长度。如果数据包已被捕获过程截断,则它可能与捕获的数据包长度不同。

  • Packet Data

    来自网络的数据,包括链路层标头。该字段的实际长度为 Captured Packet Length。链路层头部的格式取决于文件头中指定的 LinkType 字段。

pcap 库

libpcap 是用 C 语言编写的 pcap 库,在类 Unix 系统中透过 libpcap 库来实现 pcap,在 Microsoft Windows 上则是透过 Npcap 库来实现,之前还可以透过 WinPcap 库来实现,但 WinPcap 库已不再维护。

我们自己设计的监控软件可以使用 libpcap 来捕获在计算机网络上传输的网络数据包。

更多 >> libpcap 使用教程

相关链接

  • tcpdump 官方网站(基于 libpcap)
  • Wireshark 官方网站
  • WinPcap 官方网站
  • Npcap 官方网站
  • libpcap 代码仓库

http://chatgpt.dhexx.cn/article/XN0IJ61u.shtml

相关文章

MySQL - 多表查询与案例详解

目录 多表查询概述 内连接 外连接 1). 左外连接 2). 右外连接 自连接 联合查询 子查询 标量子查询 列子查询 行子查询 表子查询 多表查询练习 隐式内连接 显式内连接 去重distinct 左外连接 between ... and ... 三表查询 函数AVG 标量子查询 命名引用 多表查询概述 分…

MySQL数据库多表查询

MySQL数据库多表查询 前言 在之前的文章MySQL数据库之SQL入门中,我们讲到了四类SQL中的DQL(数据库查询语言,用于查询表中数据),但是我仅仅用DQL去查询一张表中数据,而在实际的应用中,经常是对多张数据库表进行查找。…

Oracle多表查询

什么是多表查询 多表查询:当查询的数据并不是来源一个表时,需要使用多表链接操作完成查询。根据不同表中的数据之间的关系查询相关联的数据 多表链接方式 内连接(inner join) 连接两个表,通过相等或不等判断链接列&…

(八)多表查询

目录 多表查询 笛卡尔积的错误 连接条件 表的别名 多表查询分类 自连接 和 非自连接 内连接 和 外连接 SQL92 SQL99 UNION的使用 UNION操作符 UNION ALL操作符 7种SQL JOINS的实现 QL99语法新特性 自然连接 USING连接 多表查询 多表查询,也称…

6、多表查询

第06章_多表查询 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了…

【MySQL】多表查询方法

目录 多表关系 多表查询之笛卡尔积 多表查询分类 连接查询 内连接 外连接 自连接 子查询 标量子查询 列子查询 行子查询 表子查询 联合查询 多表关系 一对多(多对一):员工与部门,一个部门可以对应多个员工一般在多的…

【MySQL】多表查询

首先,为了方便说明问题,创建两个表emp(雇员信息)和dept(雇员部门信息),其数据如下: 在之前的博客中,我们分享了单表查询的方法,但是在实际应用中&#xff…

mysql 多表查询

一、概念 多表查询也叫关联查询, 其就是指 一次性查询多张表,并且将每张表得到的数据联系作为查询结果 二、关键字 当我们需要一次查询两张表时,如果使用: select * from employees,departmaents; 这样的话会出现笛卡尔积错误 (笛卡尔积错…

数据库-MySQL-多表查询(总结)

目录 前言 多表查询概述 多表查询分类 1、连接查询 2、子查询 内连接 内连接查询语法 案例演示 外连接 外连接查询的语法 案例演示 联合查询-union,union all 子查询 概念 分类 标量子查询 自连接 自连接查询语法 案例演示 子查询 列子查询 行子查询 表子…

多表查询(整理)

一、多表关系 概述:项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间互相关联,所以各个表结构之间也存在着各种联系。 基本上有三种:…

mybatis多表查询

目录 前言 一、Mybatis多表查询 2.一对一查询(多对一) 2.2 一对多查询 2.3 多对多查询 2.4 知识小结 前言 mybatis初学者记录每日学习日常 提示:以下是本篇文章正文内容,下面案例可供参考 一、Mybatis多表查询 内连接、左外连…

多表查询(连接查询)

在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询最终需要查询的数据来源于不同的表中时,这个时候需要考虑使用连接查询 新建一张员工表 -- emp drop t…

数据库高级——多表查询

多表查询 多表查询有如下几种: 合并结果集:union、union all连接查询: 2.1. 内连接:inner join on 2.2. 外连接:outer join on – 左外连接:left outer join – 右外连接:right outer join 2.…

MySQL多表查询

文章目录 一、什么是多表查询1、概述2、笛卡尔积现象 二、多表查询的分类1、等值连接 vs非等值连接2、自连接 vs 非自连接3、内连接 vs 外连接4、满外连接(FULL OUTER JOIN) 三、UNION[ALL]的使用四、7种SQL JOINS的实现 一、什么是多表查询 1、概述 多…

【MySQL】多表查询策略(多表联查子查询)

目录 一、MySQL多表查询 二、准备工作 1.运行环境 2.创建公司表 3.创建员工表 三、多表查询 (一)多表联查—同时查询多张表 1.联结 2.左连接 3.右连接 4.内连接 (二)子查询 1.SELECT子查询 2.WHERE子查询 3.FROM子…

MySQL----多表查询

MySQL----多表查询 多表关系表与表之间的联系:一对多(多对一)多对多一对一 多表查询多表查询的分类数据准备内连接外连接自连接联合查询子查询标量子查询列子查询行子查询表子查询 多表查询案例 多表关系 在进行数据库表结构的设计时,会根据业务的需求和…

SQL语句多表查询

多表查询 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键&a…

十、多表查询

十、多表查询 *多表查询的本质就是把多张表合并成一个临时表 1、多表数据合并方案 连接查询合并方案【最常见】 首先确保两张表之间存在【隶属关系】将两张表中的数据行【沿着水平方向进行拼接】最终得到一个拥有【完整隶属关系】的新数据行 联合查询合并方案 不需要两张表之…

图解数据库多表查询(多表联查)的几种方式

多表查询,也被称为多表连接查询。 为什么会有多表查询这个操作呢? 在实际项目开发过程中,会出现多张表,用于分类存储不同的信息,我们测试需要的数据也会来自不同的表,因此需要使用多表查询。 我们常用的…

史上最牛mysql-06 (多表连接)

多表连接 个人博客 :www.xiaobeigua.icu 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段&…