pcap详解

article/2025/9/23 20:50:50

 一、pcap文件格式

一共三部分:

①Global Header:文件头(共24bytes),它定义了本文件的读取规则、最大储存长度限制等内容。

  • Magic:4Byte:标记文件开始,并用来识别文件自己和字节顺序。0xa1b2c3d4用来表示按照原来的顺序读取,0xd4c3b2a1表示下面的字节都要交换顺序读取。考虑到计算机内存的存储结构,一般会采用0xd4c3b2a1,即所有字节都需要交换顺序读取。
    • Major:2Byte: 当前文件主要的版本号,一般为 0x0200【实际上因为需要交换读取顺序,所以计算机看到的应该是 0x0002】
    • Minor:2Byte: 当前文件次要的版本号,一般为 0x0400【计算机看到的应该是 0x0004】
    • ThisZone:4Byte:当地的标准时间,如果用的是GMT则全零,一般都直接写 0000 0000
    • SigFigs:4Byte:时间戳的精度,设置为 全零 即可
    • SnapLen:4Byte:最大的存储长度,如果想把整个包抓下来,设置为 ffff 0000,但一般来说 ff7f 0000就足够了【计算机看到的应该是 0000 ff7f 】
    • LinkType:4Byte:链路类型,常用类型有以下几种,其他的,需要用的时候再查就行了。
      • 0 BSD loopback devices, except for later OpenBSD
      • 1 Ethernet, and Linux loopback devices
      • 6 802.5 Token Ring
      • 7 ARCnet
      • 8 SLIP
      • 9 PPP
      • 10 FDDI
      • 100 LLC/SNAP-encapsulated ATM
      • 101 "raw IP", with no link
      • 102 BSD/OS SLIP
      • 103 BSD/OS PPP
      • 104 Cisco HDLC
      • 105 802.11
      • 108 later OpenBSD loopback devices (with the AF_value in network byte order)
      • 113 special Linux "cooked" capture
      • 114 LocalTalk
  • Packet Header(共 16 Byte) Packet Header可以有多个,每个Packet Header后面会跟着一串Packet Data,Packet Header定义了Packet Data的长度、时间戳等信息。

 小端数据存在内存的小端,表示该数据为小端存放。

②Packet Header:可以有多个,每个Packet Header后面会跟着一串Packet Data,Packet Header定义了Packet Data的长度、时间戳等信息。

报文长度,有可能包有2k,但实际只抓到了一半,即1k,len=2k,caplen=1k。

③Packet Data:...

文件结构图例:

二、pcap文件解析API

1.初始化

char errbuf[PCAP_ERRBUF_SIZE];
函数名称:pcap_t *pcap_open_offline(char *fname, char *ebuf) 
函数功能:打开以前保存捕获数据包的文件,用于读取。 
参数说明:fname参数指定打开的文件名,ebuf表示错误信息的输出。
返回值:文件句柄。函数出错返回NULL,并将错误返回给ebuf。

2.业务处理

我们业务是从pcap文件里边去解析每一个报文
每一个报文包含一个packet header + packet data

需要一个循环来读取每一个报文

typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h,const u_char *bytes);int pcap_loop(pcap_t *p, int cnt,pcap_handler callback, u_char *user);这是一个循环的函数,用来解析pcap文件中的每个报文p : 句柄 ,pcap_open拿到的cnt : 遍历多少个报文,如果值为0或者-1 ,遍历所有报文callback : 回调函数具体回调逻辑可以大概认为如下:while(文件还没有到达最后){遍历一个packet header + packet data;callback(user自定义参数,&packetHeader,&packetData);}user: 自定义回调参数,就是每次调用我们的回调函数的时候会传进来返回值:成功返回0,出错失败返回-1

3 垃圾回收

    void pcap_close(pcap_t *p);p就是pcap_open得到的句柄

报文数量实例:

#include <stdio.h>
#include <pcap/pcap.h>void usage(const char *argv0){fprintf(stderr, "usage: %s <pcap_file>\n", argv0); // stderr会输出到屏幕
}void pcap_callback(u_char *user, const struct pcap_pkthdr* h, const u_char *bytes){static int count = 0;++count;printf("count:%d\n", count);
}int main(int argc, char** argv){if (argc != 2){usage(argv[0]);return -1;}char errbuf[PCAP_ERRBUF_SIZE]={0};pcap_t *handle = pcap_open_offline(argv[1], errbuf);if(!handle){fprintf(stderr, "Error in pcap_open_offline: %s\n", errbuf);return -1;}pcap_loop(handle, 0, pcap_callback, NULL);pcap_close(handle);
}


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

相关文章

pcap文件分析

pcap文件解析 pcap文件解析1、 .pcap文件本质2、wireshark查看pcap文件格式文件头数据包头Packet 3、snaplen参数个人理解&#xff1a;tcpdump官网定义&#xff1a;tcpdump源码&#xff1a; pcap文件解析 学了一点.pcap文件的东西&#xff0c;赶紧记录下 1、 .pcap文件本质 …

pcap包解析

pcap包解析 在接触激光雷达的时候&#xff0c;不可避免的第一步就是看硬件说明书以及调试厂商发的样例数据。一般情况下&#xff0c;厂商在存储硬件的数据包的时候&#xff0c;都是通过存储pcap包实现的&#xff0c;所以如何读取pcap包&#xff0c;并从中解析出真正有用的数据…

PCAP(packet capture)格式

PCAP&#xff08;packet capture&#xff09;格式 文章目录 PCAP&#xff08;packet capture&#xff09;格式定义pcap文件的格式文件头24 Bytes 各字段的含义&#xff1a;常用链路类型 实际pcap文件的文件头Packet Data 综述wireshark添加 lua plugins解析pcap脚本存放位置sud…

Pcap文件详解

Pcap文件详解 一、简介 pcap文件是常用的数据报存储格式&#xff0c;可以理解为就是一种文件格式&#xff0c;只不过里面的数据是按照特定格式存储的&#xff0c;所以我们想要解析里面的数据&#xff0c;也必须按照一定的格式。 普通的记事本打开pcap文件显示的是乱码&#…

Pcap 数据包捕获格式详解

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

MySQL - 多表查询与案例详解

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

MySQL数据库多表查询

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

Oracle多表查询

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

(八)多表查询

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

6、多表查询

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

【MySQL】多表查询方法

目录 多表关系 多表查询之笛卡尔积 多表查询分类 连接查询 内连接 外连接 自连接 子查询 标量子查询 列子查询 行子查询 表子查询 联合查询 多表关系 一对多&#xff08;多对一&#xff09;&#xff1a;员工与部门&#xff0c;一个部门可以对应多个员工一般在多的…

【MySQL】多表查询

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

mysql 多表查询

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

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

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

多表查询(整理)

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

mybatis多表查询

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

多表查询(连接查询)

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

数据库高级——多表查询

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

MySQL多表查询

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

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

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