一个pcap文件由文件头(Pacp header)和 m 个 packet header 和 packet data 组成,其中 m 是该pcap文件中包含的packet数量。
上图为pcap文件的解析示意图,其中:
pcap header
- Magic(4Byte):标记文件开始,并用来识别文件自己和字节顺序
- Major(2Byte): 当前文件主要的版本号
- Minor(2Byte): 当前文件次要的版本号
- ThisZone(4Byte):当地的标准时间,如果用的是GMT则全零,一般都直接写 0000 0000
- SigFigs(4Byte):时间戳的精度
- SnapLen(4Byte):最大的存储长度
- LinkType(4Byte):链路类型
packet header
- Timestamp(4Byte):被捕获时间的高位,精度为seconds
- Timestamp(4Byte):被捕获时间的低位,精度为microseconds
- Caplen(4Byte):当前数据区的长度,即抓取到的数据帧长度,不包括Packet Header本身的长度,单位是 Byte ,由此可以得到下一个数据帧的位置。
- Len(4Byte):离线数据长度:网络中实际数据帧的长度,一般不大于caplen,多数情况下和Caplen数值相等。
packet data
在 packet header 之后,就是 packet data 了,数据长度就是Caplen个Byte,在此之后是一个新的Packet Header,新的Packet Data,如此循环。
网络协议解析详见:链接
下面,我们按走pcap文件内容实现一个代码。该代码
输入为pcap文件地址
输出为每个packet的列表,和每个packet时间戳的列表。
可选为固定每个packet读取的最大长度,以及是否将每个packet的mac和ip地址指令。
def ProcessPcap(file_path, max_len, ignore_ip=False, ignore_mac=False, save_dir=None):
'''
传入pcap文件, 每个packet截取max_len个字节
:param file_path: pcap文件地址
:param max_len: 每个packet选取的最大长度(最好大于34,保证ignore能运行)
:param ignore_ip: True时将每个packet的源和目的ip置零
:param ignore_mac: True时将每个packet的源和目的mac置零
:param save_dir: 有值时,将数据保存的文件夹地址,保存为h5文件
:return:
NewPackets: n行 max_len 列的 np.float
NP_Time: (n,.) 的 np.float
'''
# file_path = r'E:\DataBase\Pycharm\HJW_classification_traffic\DDoS_classification\Data\SAT-03-11-2018_03.pcap' # 测试用
print('开始处理文件 {}'.format(os.path.basename(file_path)))
star