Java 解析Pcap文件(1)
@author:Jingdai
@date:2021.03.11
由于毕业实验是关于TLS流量分析的,所以最近学习了一下Pcap文件的解析,现记录一下。
Pcap文件结构
如果所示,Pcap文件由一个Global Header后面接着若干组Packet Header 和 Packet Data 组成。
先看一下 Global Header 的结构,它由 24B 组成,字段按照Pcap文件的顺序列出。
- magic,占4B,如果它的值是0xa1b2c3d4,代表 Pcap 文件是大端模式存储的;如果它的值是 0xd4c3b2a1,代表 Pcap 文件是小端模式存储的。这里注意这里的大端小端仅仅是指 Pcap 文件的 Global Header 和 Packet Header,而无关Packet Data 里的内容。Packet Data里面就是利用抓包工具如wireshark捕获的数据包,他们都是符合网络字节序的,而网络字节序就是大端模式。如果对大端模式和小端模式不熟悉的童靴可以先去看一下,在回来学习,因为不知道这个解析包一定会有问题。
- major,占2B,文件的主版本号,一般为0x0200。
- minor,占2B,文件的次要版本号,一般为0x0400。
- thisZone,占4B,当地标准时间,如果是GMT则全为0。
- sigFigs,占4B,时间戳精度,一般全0。
- snapLen,占4B,最长存储长度。
- linkType,占4B,链路类型,以太网则为1,一般为1。
下面看一下 Packet Header 的结构,它由 16 B组成。字段按文件顺序列出。
- timestamp,占4B,时间戳高位,精确到seconds,这是Unix时间戳。捕获数据包的时间一般是根据这个值。
- timestamp,占4B,时间戳低位,能够精确到microseconds。
- capLen,占4B,当前数据区的长度,即抓取到的数据帧长度,由此可以得到下一个数据帧的位置。
- len,占4B,离线数据长度,网路中实际数据帧的长度,一般不大于capLen,多数情况下和capLen值一样。如果文件中保存不是完整的数据包,那么这个值可能要比前面的数据包长度的值大。
Pcap 文件解析
看完上面Pcap文件结构,可以据此将 Pcap 中一个个的 Packet Data 解析出来。先看 Global Header,要用到的就是 magic 和 linkType 字段(如果其他字段要用到稍微改一点就行)。据此构建出 Global Header 类,代码如下。
package com.jingdai.pcapanalyzer.entity.format;
/**
* GlobalHeader 文件头结构
*/
public class GlobalHeader {
public static final int LINK_TYPE_ETHERNET = 1;
private int magic;
private int linkType;
public int getMagic() {
return magic;
}
public void setMagic(int magic) {
this.magic = magic;
}
public int getLinkType() {
return linkType;
}
public void setLinkType(int linkType)