PCAP文件:一个pcap文件由文件头(pacp header)和 多个 (packet header && packet data) 组成,其中 (packet header && packet data) 的数量 就是pcap文件中包含的packet数量。

本列子是通过https接口请求api获取二进制数据流 接口响应数据如下

具体实现代码DEMO如下:

// DownloadDataPackets 下载数据包
func DownloadDataPackets(ctx context.Context, baseURI, user, pass, filter, beginTime, endTime, certPath string) (filaname string, err error) {var params = map[string]interface{}{//请求接口需要的数据}// 请求接口判断是否有数据,如果有数据再进行后面数据下载请求var respData []bytereq_times := 0for {req_times += 1respData, err = DownloadDataPacketsRal(baseURI, params)if err != nil {return "", err}if dataPacketsIsExist(respData) {break}time.Sleep(time.Duration(1) * time.Second)if req_times > 60 {return "", nil}}fileName := "./packets.pcap"// 创建文件file, err := os.Create(fileName)if err != nil {return "", err}defer file.Close()write := bufio.NewWriter(file)// 1.写pacap headerwritePcapHeader(write)// 循环判断是否存在句柄for {// 下载句柄handle 4Bhandle := binary.BigEndian.Uint32(respData[4:8])// moreData 是否还有数据 1BmoreData := respData[8:9][0]// 如果存在数据 就继续通过后handle请求获取下一页数据params["handle"] = handle//处理当前请求的数据包内容packetAllDataWritePcap(write, respData)if moreData <= 0 || handle <= 0 {break}respData, err = DownloadDataPacketsRal(baseURI, params)if err != nil {return "", err}}return fileName, nil
}// packetAllDataWritePcap 获取数据包数据 并写入pcap文件中
func packetAllDataWritePcap(w *bufio.Writer, respData []byte) {// 响应数据包头部固定长度inteHeaderLen := 9// 响应数据长度dataLen := len(respData)var size intsize += dataLen// 循环判断,并根据数据包下载片段重新定义inteHeaderLen,与响应长度进行比较for inteHeaderLen < dataLen {realData := respData[inteHeaderLen:]// 2.写packet header// 响应信息中实际的数据包内容 写入实际数据包内容,该数据长度是capLencapLen := writePacketHeader(w, realData)// 3.写packet body// 数据长度就是capLen个Byte,在此之后是一个新的Packet Header,新的Packet Data,如此循环writePacketData(w, realData[17:capLen+17])w.Flush()inteHeaderLen = inteHeaderLen + 17 + int(capLen)}
}// writePcapHeader 写pacap头文件
func writePcapHeader(w *bufio.Writer) {/*pcap文件头:24字节(固定)Magic(4Byte):标记文件开始,并用来识别文件自己和字节顺序Major(2Byte): 当前文件主要的版本号Minor(2Byte): 当前文件次要的版本号ThisZone(4Byte):当地的标准时间,如果用的是GMT则全零,一般都直接写 0000 0000SigFigs(4Byte):时间戳的精度SnapLen(4Byte):最大的存储长度LinkType(4Byte):链路类型*/fileHeader := []byte("\xD4\xC3\xB2\xA1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x01\x00\x00\x00")w.Write(fileHeader)
}// writePacketHeader 写packet头文件
func writePacketHeader(w *bufio.Writer, realData []byte) uint32 {/*存在多个packet headerTimestamp(4Byte):被捕获时间的高位,精度为secondsTimestamp(4Byte):被捕获时间的低位,精度为microsecondsCaplen(4Byte):当前数据区的长度,即抓取到的数据帧长度,不包括Packet Header本身的长度,单位是 Byte ,由此可以得到下一个数据帧的位置。Len(4Byte):离线数据长度:网络中实际数据帧的长度,一般不大于caplen,多数情况下和Caplen数值相等。*/var packatHeaderData []byte// timeNanosecond 时间戳8个字节(q)- 大端序timeNanosecond := binary.BigEndian.Uint64(realData[1:9])// pktLen 数据包长度是4字节(I) - 大端序pktLen := binary.BigEndian.Uint32(realData[9:23])// capLen 捕获长度是4字节(I),网络序 - 大端序capLen := binary.BigEndian.Uint32(realData[13:17])// 数据包头的秒时间戳timeSec := int(timeNanosecond / 1000000000)timeMsec := int64((int(timeNanosecond) - timeSec*1000000000) / 1000)// 获取高位时间戳timeMsec32 := make([]byte, 4)binary.LittleEndian.PutUint32(timeMsec32, uint32(timeMsec))packatHeaderData = append(packatHeaderData, timeMsec32...)packatHeaderData = append(packatHeaderData, timeMsec32...)// 数据包长度,表示所抓获的数据包保存在pcap文件中的实际长度capLen32 := make([]byte, 4)binary.LittleEndian.PutUint32(capLen32, uint32(capLen))packatHeaderData = append(packatHeaderData, capLen32...)// 数据包实际长度,所抓获的数据包的真实长度,如果文件中保存不是完整的数据包,则这个值可能要比前面的数据包长度值大pktLen32 := make([]byte, 4)binary.LittleEndian.PutUint32(pktLen32, uint32(pktLen))packatHeaderData = append(packatHeaderData, pktLen32...)w.Write(packatHeaderData)return capLen
}// writePacketData 写packet文本信息
func writePacketData(w *bufio.Writer, packData []byte) {// 写packet dataw.Write(packData)
}// dataPacketsIsExist 查询数据包是否有数据
func dataPacketsIsExist(respData []byte) bool {if len(respData) == 0 {return false}if len(respData) == 9 && respData[8] != 1 {return false}return true
}

Go 处理PCAP文件相关推荐

  1. C语言解析pcap文件得到HTTP信息实例(原创,附源码)

    原文:http://xiexiaohui.com.host2.ugocn.com/index.php/archives/34 转载请注明出处.来自 hello xiexh (xiexiaohui092 ...

  2. 使用WinPcap和libpcap类库读写pcap文件(002)PCAP文件格式

    本文基本翻译自https://wiki.wireshark.org/Development/LibpcapFileFormat,主要分析pcap文件的格式. 其中一些字段可能和现在的WinPcap类库 ...

  3. 使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置

    最近的项目要求写一个读写pcap文件的小程序,用来修改pcap中的部分信息,实现pcap的定制. 所以必须学会使用wireshark并能有利用WinPcap库和libpcap库进行开发. 虽然本文记录 ...

  4. python dpkt 解析 pcap 文件

    dpkt Tutorial #2: Parsing a PCAP File 原文链接:https://jon.oberheide.org/blog/2008/10/15/dpkt-tutorial-2 ...

  5. pcap文件生成metadata——使用tshark解析tcpdump的pcap包

    pcap文件生成metadata #!/usr/bin/env python # -*- coding: utf-8 -*-import os import time, datetime import ...

  6. 数据包过滤 系统 linux,Ubuntu16.04安装libpcap开发库对pcap文件中的数据包进行过滤...

    Ubuntu16.04下安装了Wireshark的话,应该是已经安装了libpcap0.8的包,如下图: 使用sudo apt-get install libpcap-dev安装开发包,安装后系统显示 ...

  7. pcap文件提取后的dataframe,切分前向流与后向流

    使用pandas,提取pcap文件得到的dataframe后,切分为前向流与后向流 import pandas as pddef split_forward_backward_flow(datafra ...

  8. c语言编程题报文解析,C语言解析pcap文件得到HTTP信息实例

    程序功能为解析由Wireshark生成的pcap文件. 实现步骤: 1)用Wireshark软件抓包得到test.pcap文件 2)程序:分析pcap文件头 -> 分析pcap_pkt头 -&g ...

  9. python分析pcap文件_利用Python库Scapy解析pcap文件的方法

    每次写博客都是源于纳闷,python解析pcap这么常用的例子网上竟然没有,全是一堆命令行执行的python,能用吗?玩呢? pip安装scapy,然后解析pcap: import scapy fro ...

  10. python读取pcap获得端口_Python处理网络数据包示例(pcapy读pcap文件)

    Python处理网络数据包示例(pcapy读pcap文件) 最近在围观python,找了个pcapy处理pcap数据的代码 非常非常久以前的东西了,应该是在项目组做的半成品吧.今天重装机器,不经意翻出 ...

最新文章

  1. 第十八章 33用重载输出运算符函数实现字符串的输出
  2. VTK:IO之ReadOBJ
  3. 12- APP接口测试以及接口文档的分析
  4. 数据库连接池的实现及原理
  5. erp物料报废 oracle_ERP核心业务流程和Oracle-ERP业务和数据对象分析
  6. ***教程十:数据库注入(上)
  7. ZOJ The Sum of Unitary Totient(min_25 筛)
  8. Eclipse集成lombok插件 解决@Data标签get/set方法找不到异常
  9. 通过CSS来垂直居中文本
  10. Rsync 服务安全加固
  11. datacount+php,dataCount.php
  12. 深入解读Linux内存管理系列(总览)
  13. 如何监测土壤pH值和水分含量
  14. 2010-2019年中国城市统计年鉴分享
  15. 视频监控安防平台-国标35114(GB35114)A级检测
  16. 定义一个list对象数组 java_javascript定义一个list
  17. usb转232串口线驱动android,prolific usb转串口驱动下载
  18. 卡巴斯基v6.0激活码
  19. 常用塑料的种类以及用途:
  20. 小猿圈解读Go语言的前景

热门文章

  1. 3dmax森林树木植物插件 Forest Pack Pro 6.3.1
  2. 微信小程序图片上传一直loading中,上传没反应
  3. cAdvisor资源监控工具入门
  4. java poi 合并单元格 边框显示不全
  5. php区块链开发游戏,php程序员如何开发区块链、以太坊、智能合约的教程
  6. python环境下,PIP卸载、重装、升级
  7. spring bean作用域之间有什么区别
  8. Packer Terraform 让 ESS 更灵活
  9. 适合数码家电行业用的进销存,一个软件顶一百个人工不是梦
  10. FPGA-VGA驱动