pcap文件格式

LeCun
• 阅读 2040

pcap是什么

pcap是一种数据流格式,wireshark软件可以直接把网络数据流变成这种格式。
在Linux里,pcap可以说是一种通用的数据流格式,很多开源的项目都需要用到这种格式的文件。
ROHC的库里,测试脚本的入口参数之一就是一个pcap格式的数据流文件。
如果清楚了pcap的格式,就可以自己去生成数据流文件,从而去使用ROHC的库。

pcap格式

pcap文件格式
上图是pcap的格式结构图,分成两大部分:

  • Global Header (共 24 Byte)
    整个数据流文件,只会有一个 Global Header,它定义了本文件的读取规则最大储存长度限制等内容;
    pcap文件格式
    • 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的长度、时间戳等信息。
    pcap文件格式
    • Timestamp:被捕获时间的高位,单位是seconds
    • Timestamp:被捕获时间的低位,单位是microseconds
    • Caplen:当前数据区的长度,即抓取到的数据帧长度,不包括Packet Header本身的长度,单位是 Byte ,由此可以得到下一个数据帧的位置。
    • Len:离线数据长度:网络中实际数据帧的长度,一般不大于caplen,多数情况下和Caplen数值相等。
  • Packet Data(共 Caplen Byte)
    在包头之后,就是数据包的数据了,数据长度就是Caplen个Byte,在这之后就是一个新的Packet Header,定义一个新的Packet Data属性,再接一个新的Packet Data,如此循环。

举个栗子

d4c3 b2a1 0200 0400 0000 0000 0000 0000
ff7f 0000 0100 0000 

e5da c850 fbdc 0800 2a00 0000 2a00 0000 
ffff ffff ffff 0000 0000 0000 0800 4500 
001c 0001 0000 4032 7cad 7f00 0001 7f00 
0001 0102 0304 0000 0001 

eada c850 6d02 0100 2a00 0000 2a00 0000 
ffff ffff ffff 0000 0000 0000 0800 4500 
001c 0002 0000 4032 7cac 7f00 0001 7f00 
0001 0102 0304 0000 0002 

eeda c850 9824 0800 2a00 0000 2a00 0000 
ffff ffff ffff 0000 0000 0000 0800 4500 
001c 0003 0000 4032 7cab 7f00 0001 7f00 
0001 0102 0304 0000 0003 

f3da c850 250c 0100 2a00 0000 2a00 0000 
ffff ffff ffff 0000 0000 0000 0800 4500 
001c 0004 0000 4032 7caa 7f00 0001 7f00 
0001 0102 0304 0000 0004

2bdc c850 7952 0500 2a00 0000 2a00 0000
ffff ffff ffff 0000 0000 0000 0800 4500
001c 2710 0000 4032 559e 7f00 0001 7f00
0001 0102 0304 0000 2710 

上面是在ROHC库的测试文件里找出来的其中一个数据流文件,本来这些数据都是粘在一起的,我整理了一下让它变得更容易看一些。
例如第一段,

d4c3 b2a1 0200 0400 0000 0000 0000 0000
ff7f 0000 0100 0000 

就是Global Header,可以一一对应到上面所说的各个属性。

例如第二段,

e5da c850 fbdc 0800 2a00 0000 2a00 0000 
ffff ffff ffff 0000 0000 0000 0800 4500 
001c 0001 0000 4032 7cad 7f00 0001 7f00 
0001 0102 0304 0000 0001 

e5da c850 就是时间戳的高位
fbdc 0800 就是时间戳的低位
2a00 0000 就是数据包的大小,十六进制,转换成十进制,就是42 Byte
2a00 0000 就是抓到的包的大小
ffff ffff ffff 0000 0000 0000 0800 4500
001c 0001 0000 4032 7cad 7f00 0001 7f00
0001 0102 0304 0000 0001 就是数据包,长度一共是 42 Byte
然后就开始下一个数据包。

本文转自 https://blog.csdn.net/u013793399/article/details/51474831,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
vue+element 表格formatter数据格式化并且插入html标签
前言   vue中element框架,其中表格组件,我既要行内数据格式化,又要插入html标签一贯思维,二者不可兼得也一、element表格数据格式化  !(https://oscimg.oschina.net/oscnet/3c43a1cb3cbdeb5b5ad58acb45a42612b00.p
Karen110 Karen110
2年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Django之Django模板
1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:
Wesley13 Wesley13
2年前
4cast
4castpackageloadcsv.KumarAwanish发布:2020122117:43:04.501348作者:KumarAwanish作者邮箱:awanish00@gmail.com首页:
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
2年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
LeCun
LeCun
Lv1
他乡逢七夕,旅馆益羁愁。
文章
3
粉丝
0
获赞
1