pcap包解析

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

pcap包解析

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

1.pcap包结构

一个Pcap文件包括“Pcap报头”,“数据区”两个部分,其中数据区又分成多个数据包,每个包有报头和数据两个部分,总体结构可见下图(注意所有字节都是连续的):
在这里插入图片描述

1.1 pcap报头

“Pcap报头”大小为24个字节,具体结构如下图:
在这里插入图片描述

各个字段含义:

Magic(4B): 标记文件开始,并用来识别文件和字节顺序。值可以为0xa1b2c3d4或者0xd4c3b2a1,如果是0xa1b2c3d4表示是大端模式,按照原来的顺序一个字节一个字节的读,如果是0xd4c3b2a1表示小端模式,下面的字节都要交换顺序。现在的电脑大部分是小端模式。

Major(2B): 当前文件的主要版本号,一般为0x0200

Minor(2B): 当前文件的次要版本号,一般为0x0400

ThisZone(4B): 当地的标准事件,如果用的是GMT则全零,一般全零

SigFigs(4B): 时间戳的精度,一般为全零

SnapLen(4B): 最大的存储长度,设置所抓获的数据包的最大长度,如果所有数据包都要抓获,将值设置为65535

LinkType(4B): 链路类型。解析数据包首先要判断它的LinkType,所以这个值很重要。一般的值为1,即以太网。

常用的LinkType(链路类型):

类型描述
0BSD loopback devices, except for later OpenBSD
1Ethernet, and Linux loopback devices
6802.5 Token Ring
7ARCnet
8SLIP
9PPP
10FDDI
100LLC/SNAP-encapsulated ATM
101“raw IP”, with no link
102BSD/OS SLIP
103BSD/OS PPP
104Cisco HDLC
105802.11
108later OpenBSD loopback devices (with the AF_value in network byte order)
113special Linux “cooked” capture
114LocalTalk

1.2 数据报头

数据报头可以有多个,每个数据报头16字节,后面都跟着真正的数据包。如下图所示:

以下是各个字段含义:

Timestamp(4B): 时间戳高位,精确到seconds,这是Unix时间戳。捕获数据包的时间一般是根据这个值
Timestamp(4B): 时间戳低位,能够精确到microseconds
Caplen(4B): 当前数据区的长度,即抓取到的数据帧长度,由此可以得到下一个数据帧的位置。
Len(4B): 离线数据长度,网路中实际数据帧的长度,一般不大于Caplen,多数情况下和Caplen值一样

这一步中,一定要根据Caplen决定接下来要读的数据长度,至于为什么要这么做,后面解释。

1.3 数据

这里就是抓取到的一个网络包,对于激光雷达一般为以太帧,当然,如果你是分析其他网络包,视具体情况而定。这里以以太帧为例,雷达发送的数据在以太帧的数据部分(ipv4报文)中的数据中,这里有点绕,让我们慢慢解析。

1.3.1Ethernet帧:

解析pcap包,获取到一个数据块时,这个数据块就是以太帧,一般结构如下:

1.目标地址(destination address,DA):6 字节

2.源地址(source address,SA):6 字节

3.类型(type)字段:用于辨别上层协议,2 字节(0x08 0x00 为IPv4)

4.数据(data):64 到1500 字节

1.3.2 ipv4报文

以太帧结构中的type决定数据部分存储什么样的报文,我实际使用时为ipv4,所以数据部分为ipv4报文,所以解析以太帧中的数据部分就是解析ipv4报文,ipv4报文头结构如下:

在这里插入图片描述
更加详细的解释可以参考

  • 这里有一点需要注意,选项部分有多长,得去查资料,我懒得找,就需要自己解析看看,一般雷达发送的数据存在ipv4报的数据部分,也就是除去报头后剩余的字节,会有一个开始标志,这个开始标志在说明书中一定有说明,这样就可以确定选项部分有多长,然后正确获取雷达发送的数据,然后就可以根据说明书进行一步步解析。

2.软件解析pcap

这里用的软件是Wireshark,一个蓝色鱼鳍图标,下载完成后可以直接打开pcap文件,辅助你解析pcap包数据块。下面是打开一个pcap文件后的结果(数据部分为防止泄密,打码了):
在这里插入图片描述

软件中已经解析了pcap文件中的每个数据块,最上方显示了所有数据块的大致信息,中间显示了某个数据块的详细信息,下方显示了某个数据块的原始数据。

  • 以太帧头

  • ipv4报头
    在这里插入图片描述

  • UDP报头

在这里插入图片描述

  • ipv4数据部分(雷达数据(黄色部分))

在这里插入图片描述

3.代码解析(linux)

#include <math.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
int main(int argc, char const *argv[]) {/* code */FILE *pcap_file;if ((pcap_file = fopen("path/to/pcap file", "rb")) == NULL) {cout << "cannot open file!\n";}char buffer[24];// read pcap headfread(buffer, 24, 1, pcap_file);//read 3000 ethernet packagefor (int p = 0; p < 3000; p++) {// read package headchar package_head[16];fread(package_head, 16, 1, pcap_file);//read package data lengthint package_data_length =(int)(unsigned char)package_head[8] +((int)(unsigned char)package_head[9]) * pow(16.0, 2.0) +((int)(unsigned char)package_head[10]) * pow(16.0, 4.0) +((int)(unsigned char)package_head[11]) * pow(16.0, 6.0);char package_data[package_data_length];fread(package_data, package_data_length, 1, pcap_file);//deal package to analysis pointReadEthernetPackage(package_data);}fclose(pcap_file);return 0;
}

4.问题

  1. 为什么要读package head中的长度,以此决定后面的数据长度?

    这是个坑,一定要读,因为有时候雷达厂商发给你的pcap包里面可能包含一些奇奇怪怪的东西,我被坑过。


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

相关文章

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子…

MySQL----多表查询

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

SQL语句多表查询

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