[计算机网络/网络抓包/以太网] `.pcap` 数据报文存储格式

news/2025/2/26 21:50:46/文章来源:https://www.cnblogs.com/johnnyzen/p/18739746

序:一份以太网报文

概述:.pcap 数据报文存储格式

简介

  • .pcap文件:一种常用的数据报文存储格式,主要用于网络数据包的捕获和存储。

pcap文件格式由PCAP库提供,支持将网络上的所有数据包保存到文件中,并可以从文件中读取数据包。
pcap文件通常由文件头和数据包头组成,每个数据包头后面跟着一个数据包。

阅读软件

普通的记事本打开pcap文件显示的是乱码;
使用安装了HEX-Editor插件的Notepad++打开,能够以16进制数据的格式显示pacp文件;
或使用sublime打开以会以十六进制的格式显示pacp文件。

.pcap文件的格式

如图所示,pcap文件的总体结构就是文件头-数据包头1-数据包1-数据包头2-数据包2的形式。

Pcap Header(文件头)

  • 文件头:每个pcap文件只有一个文件头(1个字节可由2个十六进制数值表示),占 24 Byte。文件头的格式如下:
  • Magic(4B) : 标记文件开始,并用来识别文件和字节顺序。
    值可以为0xa1b2c3d4或者0xd4c3b2a1
    如果是0xa1b2c3d4表示是大端模式,按照原来的顺序一个字节一个字节的读
    如果是0xd4c3b2a1表示小端模式,下面的字节都要交换顺序。
    现在的电脑大部分是小端模式。
    注意:网络字节序一般是大端存储,主机x86字节序一般是小端存储,比如我们经过网络发送0x12345678这个整形,在80X86平台中,它是以小端法存放的,在发送前需要使用系统提供的htonl将其转换成大端法存放。
  • Version Major(2B):当前文件的主要版本号,一般为0x0200。
  • Version Minor(2B):当前文件的次要版本号,一般为0x0400。
  • Thiszone(4B):当地的标准时间,如果用的是GMT则全0,一般全0。
  • SigFigs(4B):时间戳的精度,一般为全0。
  • SnapLen(4B):最大的存储长度,一般为65535。

该值设置所抓获的数据包的最大长度,如果所有数据包都要抓获,将该值设置为65535(0xFFFF); 例如:想获取数据包的前64字节,可将该值设置为64。

  • LinkType(4B):数据链路类型。

Packet Header(数据包头)

  • 数据包头:每个数据包头占16字节,包含以下信息:
  • Timestamp:8字节,记录数据包收发的时间。
  • Caplen:4字节,抓取到的数据帧长度。
  • Len:4字节,实际的数据帧长度。
  • 每一个pcap文件的数据包头可以有多个,每个数据包头后面都跟着真正的数据包。

  • 数据包头则依次为:时间戳(秒)、时间戳(微妙)、抓包长度和实际长度,依次各占4个字节。以下是Packet Header的4个字段含义:

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

Packet Data(数据包)

  • Packet是链路层的数据帧,长度就是Packet Header中定义的Caplen值

所以,每个Packet Header(数据包头)后面都跟着Caplen长度的Packet Data。
也就是说pcap文件并没有规定捕获的数据帧之间有什么间隔字符串。
Packet数据帧部分的格式就是标准的网络协议格式。

综合案例

  • 红色部分Pcap Header(文件头)
  • Pcap Header 的 Magic:d4 c3 b2 a1,表示是小端模式,后面的字节从后往前读 a1b2c3d4 小端模式
  • Pcap Header 的 Major:02 00,计算机读的应该是00 02。最大存储长度SnapLen:ff ff 00 00 ,同理计算机读的应该是00 00 ff ff,所以是2的16次方减一,是65535个字节。LinkType:01 00 00 00 ,实际是00 00 00 01,是以太网类型
  • 蓝色部分Packet Header(数据包头)
  • 蓝色部分的Packet Header就不一一说了,重点关注Caplen:3c 00 00 00,计算机读的是00 00 00 3c,转换成十进制就是60,所以后面的60个字节都是一个数据帧。
  • 之后就又是一个Pcap Header,如此循环。

  • 后边Packet Data(数据包)

pcap文件的应用场景和使用工具

  • pcap文件常用于网络数据包的捕获和分析。
  • 使用工具如Wireshark可以打开和解析pcap文件,显示解析后的各层协议及内容。

Wireshark不仅支持pcap文件的读取,还可以生成该格式的文件。
此外,使用WinHexSublime Text等工具可以以十六进制格式查看pcap文件的内容,但就需要专业的知识来解析这些数据。

补充:以太网帧(Ethernet)、IP包、TCP、UDP的长度范围

以太网帧

  • MAC地址则是48位的(6个字节),通常表示为12个16进制数,每2个16进制数之间用冒号隔开,如08:00:20:0A:8C:6D就是一个MAC地址。

1字节为8位,1字节可以用2个16进制数表示

  • 以太网地址头部:目的地址(6字节)、源地址(6字节)、以太网类型(2字节)

  • 目前以太网帧有5种,交换机之间BPDU(桥协议数据单元)数据包使用的是IEEE802.3/LLC帧,其格式如下:

以太网MAC帧格式在Linux中,以太网帧头部的结构体如下:/ 10Mb/s ethernet header /
struct ether_header
{u_int8_t  ether_dhost[ETH_ALEN]; / destination eth addr /u_int8_t  ether_shost[ETH_ALEN]; / source ether addr /u_int16_t ether_type;          / packet type ID field /
} __attribute__ ((__packed__));其中的ETH_ALEN为6,因为地址为6个字节,共48位——这个地址就是常说的物理地址,或MAC地址。它的第3个成员ether_type是以太帧类型,有如下这些:/ Ethernet protocol ID's /
#define ETHERTYPE_PUP  0x0200          / Xerox PUP /
#define ETHERTYPE_SPRITE 0x0500  / Sprite /
#define ETHERTYPE_IP  0x0800  / IP /
#define ETHERTYPE_ARP  0x0806  / Address resolution /
#define ETHERTYPE_REVARP 0x8035  / Reverse ARP /
#define ETHERTYPE_AT  0x809B  / AppleTalk protocol /
#define ETHERTYPE_AARP  0x80F3  / AppleTalk ARP /
#define ETHERTYPE_VLAN  0x8100  / IEEE 802.1Q VLAN tagging /
#define ETHERTYPE_IPX  0x8137  / IPX /
#define ETHERTYPE_IPV6  0x86dd  / IP protocol version 6 /
#define ETHERTYPE_LOOPBACK 0x9000  / used to test interfaces /

注:如果帧长小于64字节,则要求“填充”,以使这个帧的长度达到64字节

  • 但是我们观察到这个以太网帧只有60字节,why?

  • 据RFC894的说明,以太网封装IP数据包的最大长度是1500字节(所以,数据链路层的最大传输单元(Maximum Transmission Unit,MTU)是1500字节),也就是说以太网最大帧长应该是以太网首部加上1500,再加上7字节的前导同步码和1字节的帧开始定界符,具体就是:7字节前导同步吗+1字节帧开始定界符+6字节的目的MAC+6字节的源MAC+2字节的帧类型+1500+4字节的FCS。

  • 按照上述,最大帧应该是1526字节,但是实际上我们抓包得到的最大帧是1514字节,为什么不是1526字节呢?原因是当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交“设备驱动程序”做进一步处理。这时我们的抓包软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据,只留下了目的地址,源地址,类型字段,其最大值是6+6+2+1500=1514。

  • 以太网规定,以太网帧数据域部分最小为46字节,也就是以太网帧最小是6+6+2+46+4=64。除去4个字节的FCS,因此,抓包时就是60字节。当数据字段的长度小于46字节时,MAC子层就会在数据字段的后面填充以满足数据帧长不小于64字节。由于填充数据是由MAC子层负责,也就是设备驱动程序。不同的抓包程序和设备驱动程序所处的优先层次可能不同,抓包程序的优先级可能比设备驱动程序更高,也就是说,我们的抓包程序可能在设备驱动程序还没有填充不到64字节帧的时候,已经捕获了数据。因此不同的抓包工具抓到的数据帧的大小可能不同。(比如,wireshark抓到的可能没有填充数据段,而sniffer抓到的就有填充数据段)

IP数据包

  • IP头大小最小为20字节。

所以,网络层的MTU=数据链路层的MTU1500-20=1480字节。

  • 由于IP协议提供为上层协议分割和重组报文的功能,在IP头中,用2个字节来描述报文的长度,2个字节所能表达的最大数字就是65535。所以,IP数据包的最大长度就是64K字节(65535)。

TCP(传输层)

  • TCP头部选项是一个可变长的信息,这部分最多包含40字节,因为TCP头部最长60字节,(其中还包含前面20字节的固定部分)。

  • 依靠IP协议提供的报文分割和重组机制,TCP包头中就没有“包长度”字段,而完全依靠IP层去处理分帧。这就是为什么TCP常常被称作一种“流协议”的原因,开发者在使用TCP服务的时候,不必去关心数据包的大小,只需讲SOCKET看作一条数据流的入口,往里面放数据就是了,TCP协议本身会进行拥塞/流量控制。

  • 选项和填充,n4字节,常见的可选字段是最长报文大小 MSS(Maximum Segment Size) 。每个连接方通常都在通信的第一个报文段(为建立连接而设置 SYN 标志的那个段)中指明这个选项,它指明本端所能接收的最大长度的报文段。选项长度不一定是 32 位字的整数倍,所以要加填充位,使得报头长度成为整字数。

  • MTU和MSS值的关系:MTU=MSS+IP Header+TCPHeader
    通信双方最终的MSS值=较小MTU-IP Header-TCP Header

UDP(传输层)

  • UDP包的首部要占用8字节,因为UDP提供无连接服务,它的数据包包头,是固定长度的8字节,不存在可选字段,可以减少很多传输开销,所以它无需使用首部字段长,因为它的首部就是固定的。

+UDP则与TCP不同,UDP包头内有总长度字段,同样为两个字节,因此UDP数据包的总长度被限制为65535,这样恰好可以放进一个IP包内,使得 UDP/IP协议栈的实现非常简单和高效。

所以UDP包的最大值是:IP数据包的最大长度65535-IP头的大小20-UDP头的大小=65507字节。最小值是0。

这个值也就是你在调用getsockopt()时指定SO_MAX_MSG_SIZE所得到返回值,任何使用SOCK_DGRAM属性的socket,一次send的 数据都不能超过这个值,否则必然得到一个错误。

X 参考文献

  • pacp文件详解 - 博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890380.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#/.NET/.NET Core技术前沿周刊 | 第 27 期(2025年2.17-2.23)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等…

Jenkins详解教程

1.介绍2.Jenkins CI/CD 流程3.部署Jenkins查看初始密码4 使用Jenkins

Redis概述安装与基本数据类型

Redis概述安装与基本数据类型 1. 什么是NoSQL NoSQL( Not Only SQL ),意即不仅仅是SQL, 泛指非关系型的数据库。Nosql这个技术门类,早期就有人提出,发展至2009年趋势越发高涨。 2. NoSQL的广泛应用 随着大数据的兴起,数据量的暴增,数据类型的丰富,传统的关系数据库在应付动…

Hello! I am Zhan Yijue,nice to meet you

这个作业属于哪个课程 23软件工程这个作业要求在哪里 【作业1】自我介绍+软工5问这个作业的目标 学习使用 Markdown, 熟练掌握 GitHub 及 Git 的使用方法, 建立个人博客个人介绍 ❤️ 兴趣爱好听歌 🎧 书法📝 看书,尤其是科幻小说 📊 二次元爱好者 🎩📖 学习经历广东…

Hugging Face 发布 Python WebRTC 库:构建实时音视频应用;微软 Magma:多模态跨数字物理世界丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

1Panel 专业版评测:全面超越宝塔的运维面板新标杆

一、 UX体验与移动端适配:更直观的跨平台交互 1Panel 专业版在用户体验上实现了对宝塔的全面超越。其界面采用现代化设计语言,以黑金主题 为代表的可定制化主题系统支持一键切换,视觉风格更符合技术审美,同时保持功能模块的清晰布局。相较于宝塔复杂的多级菜单,1Panel 的 …

基于抖音agent平台Cozi打造Agent智能体

AI Agent 一、AI Agent(智能体)与开发平台 【1】AI Agent的概念 AI Agent直接翻译更准确,AI代理人。AI Agent是指可以自主执行任务或目标的系统,它可以是一个软件,也可以是一个智能机器,这些系统通过感知环境并在此基础上做出决策。AI Agent可以集成多种技术,包括AI大模…

纯离线部署本地知识库LLM大模型

纯离线部署本地知识库LLM大模型 一、下载离线大模型下载的网址:https://hf-mirror.com/deepseek qwen 相关的模型,只建议使用1.5B的,GGUF后缀的模型 推荐下载llama相关模型,同样是GGUF后缀的,自己笔记本电脑推荐下载8B的 二、下载大模型管理平台 LM Studio下载网址:https…

mailto链接

本文主要内容转载自Haorooms!好用的mailto网站话不多说直接上正菜! 大佬dawsbot提供的工具mailto.vercel.app前言 今天看到老外写的一篇关于mailto: HTML e-mail 的文章,感觉很新奇,以前从来没有这么用过,用email的时候,最多用过mailto,但是其中穿链接参数,还是第一次看…

二次开发(第一周作业)

(1) 来源 C++ 大作业 超市收银系统 - shugen - 博客园 该文章介绍了一个软件的实现过程,并提供了相关代码。通过对该软件的分析对其进行了改进和二次开发。 (2) 运行环境+运行结果的截图(伸缩代码附上) 操作系统:Windows 11 开发工具:Dev-c++ 编程语言:C++ 运行结果截…

iconfont本地引入

本地引入iconfont的好处 Butterfly主题自带的Font Awesome图标库免费版里有好多图标没有,而阿里巴巴的开源图标iconfont里的图标非常丰富,所以可以同时引入一下iconfont图标作为Font Awesome图标库的补充。 考虑到在线引入的icon图标大小都是16x16的,而Font Awesome图标一般…