pcap文件格式

news/2024/12/22 15:35:13/

在通过使用wireshark工具抓取主机不同网段的数据包时,把抓到的数据包保存起来会发现生成的文件是.pcap文件,此篇博客主要介绍pcap文件的格式,并利用C语言的结构体知识来初窥探数据包数据。

pcap文件格式

pcap文件数据结构如下图所示,每个pcap文件都是由Global Header、Packet Header、Packet Data三部分组成,文件的初始位置为Global Header,接着都是成对出现的Packet Header和Packet Data

文件头+ 数据包头+数据 +数据包头+数据 +数据包头+数据 +数据包头+数据+.........

数据包格式
结构名称字节数作用
文件头 Global Header )24整个数据流文件,只会有一个 Global Header,它定义了本文件的读取规则最大储存长度限制等内容; 
数据包头( Packet Header )16Packet Header可以有多个,每个Packet Header后面会跟着一串Packet Data,Packet Header定义了Packet Data的长度、时间戳等信息。 

1、Global Header 结构

Global Header长度为24字节,下面的代码就是wireshark官网所给出的pcap文件的Global Header的数据结构定义,我们按照一个一个进行分析。

typedef struct pcap_hdr_s {guint32 magic_number;   /* magic number */guint16 version_major;  /* major version number */guint16 version_minor;  /* minor version number */gint32  thiszone;       /* GMT to local correction */guint32 sigfigs;        /* accuracy of timestamps */guint32 snaplen;        /* max length of captured packets, in octets */guint32 network;        /* data link type */
} pcap_hdr_t;
  • magic_number:翻译过来是魔数,表示用于检测文件格式本身和字节顺序。32bit,4字节
  • version_major,version_minor:此文件格式的主次版本号。各自16bit,2字节
  • thiszone:表示在格林威治标准时间(UTC)和下列包头时间戳的本地时区之间以秒为单位改正时间。举个例子,例如:如果时间戳是GMT (UTC),那么这个值就是0。如果时间戳是在中欧时间(阿姆斯特丹,柏林,…),即格林尼治标准时间+ 1点,这个区域必须是-3600。实际上,时间戳总是用GMT表示的,所以这个区域总是0。32bit,4字节
     
  • sigfigs:从理论上讲,时间戳捕捉的准确性,一般情况下都是置0
  • snaplen:捕获的“快照长度”(通常为65535或更多,但可能受到用户的限制)
  • network:链路层报头类型,在包的开头指定报头的类型,这可以是各种类型的,如802.11,802.11与各种无线电信息,PPP,令牌环,FDDI等。

官方给的太过于高级,可能不方便我们使用,所以我自己重命名了几个数据类型,定义了一个类似的结构体来标识Global Header,附有相应的注释:

typedef unsigned char u_int8;
typedef unsigned short u_int16;
typedef unsigned int u_int32;
typedef unsigned long long u_int64;
//pacp文件头结构体
struct pcap_file_header
{u_int32 magic;				//识别文件和字节顺序:小端/大端模式u_int16 version_major;		//主版本号u_int16 version_minor;		//次版本号u_int32 thiszone;			//当地的标准时间u_int32 sigfigs;			//时间戳精度u_int32 snaplen;			//最大的存储长度u_int32 linktype;			//链路类型
};

2、Packet Header

数据包头有三个属性,每个属性占固定大小,所以可以使用一个结构体表示 。下面结构体wireshark官网查找出:

typedef struct pcaprec_hdr_s {guint32 ts_sec;         /* timestamp seconds */guint32 ts_usec;        /* timestamp microseconds */guint32 incl_len;       /* number of octets of packet saved in file */guint32 orig_len;       /* actual length of packet */
} pcaprec_hdr_t;
  • ts_sec:捕获此包的日期和时间。该值以秒为单位,自1970年1月1日00:00:00 GMT;这也称为UN*X time_t。32bit,4字节
  • ts_usec:在常规pcap文件中,捕获此包的微秒数,作为ts_sec的偏移量,也就是在不足一秒的时间的微秒值,32bit,4字节
  • incl_len:实际捕获并保存在文件中的数据包数据的字节数。这个值不应该大于orig_len或全局头文件的snaplen值。32bit,4字节
  • orig_len:数据包被捕获时在网络上出现的长度。如果incl_len和orig_len不同,则实际保存的包大小受到snaplen的限制。32bit,4字节

为了方便我们通过C语言来解析.pcap文件,我重新定义了两个结构体 time_val 和 pcap_pkthdr:

//时间戳
struct time_val
{u_int32 tv_sec;					//时间戳高位,精确到secondsu_int32 tv_usec;				//时间戳地位,精确到microseconds
};//pcap数据包头结构体
struct pcap_pkthdr
{struct time_val ts;			//捕获时间u_int32 caplen;				//数据帧/区的长度u_int32 len;				//离线数据长度
};

3、Packet Data

packet data就是我们打开wireshrak能够也能直观看到的数据报文,数据的数据格式也会不同。有着许许多多的报文,例如:tcp,udp,dhcp,imtp等等,这里就不一一做介绍了。


http://www.ppmy.cn/news/69872.html

相关文章

Cordova webapp实战开发:(5)如何写一个Andorid下自动更新的插件?

在 《Cordova webapp实战开发:(4)Android环境搭建》中我们搭建好了开发环境,也给大家布置了调用插件的预习作业,做得如何了呢?今天我们来学一下如何自己从头建立一个Andorid下的cordova插件。 本次练习你能…

智能的本质人工智能与机器人领域的64个大问题阅读笔记(三)

目录 机器智能提高到人类的水平或者人类智能下降到机器的水平,都可以到达图灵点。 或许图灵测试是一个自我实现的预言:我们(声称)在打造“聪明”机器的同时,我们也在把人变笨。 不长脑的机器和不思考的人没什么两样&…

Kubernetes架构与组件详解

Kubernetes架构与组件详解 一、Kubernetes 简介1 什么是 Kubernetes2 Kubernetes 的优势3 Kubernetes 的应用场景 二、Kubernetes 架构1 Kubernetes 架构概述2 Kubernetes 架构组件介绍2.1 控制面板组件2.2 API Server2.3 etcd2.4 kubelet2.5 kube-proxy2.6 CNI 插件2.7 容器运…

API常用类

Java API概述 API(Application Programming Interface) 应用程序编程接口 是对Java预先定义的类或接口功能和函数功能的说明文档,目的是提供给开发人员进行使用帮助说明 基本数据类型封装类 基本数据类型包装类byte ByteshortShortcharCharacterint Integerl…

在外Windows公网远程连接MongoDB数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 转载自远程内网穿透的文章:公网远…

OPPO关停哲库业务,工程师造芯何去何从?

5月12日(上周五),新浪科技从OPPO处了解到,OPPO将终止ZEKU业务。3000多人团队突然原地解散,网上唏嘘声一片! ZEKU最初成立于2019年,是OPPO的全资子公司,欧加集团百分之百注资成立。总…

Elasticsearch:结合两全其美:Elasticsearch 与 BM25 和 HNSW 的混合搜索

就搜索算法而言,没有万能的解决方案。 不同的算法在不同的场景下效果更好,有时需要算法的组合才能达到最好的效果。 在 Elasticsearch 中,一种流行的组合搜索算法的方法是使用混合搜索,将用于文本搜索的 BM25 算法与用于最近邻搜索…

分布式消息队列RocketMQ概念详解

目录 1.MQ概述 1.1 RocketMQ简介 1.2 MQ用途 1.3 常见MQ产品 2.RocketMQ 基本概念 2.1 消息 2.2 主题 2.3 标签 2.4 队列 2.5 Producer 2.6 Consumer 2.7 NameServer 2.8 Broker 2.9 RocketMQ 工作流程 1.MQ概述 1.1 RocketMQ简介 RocketMQ 是阿里开源的分布式消…