通过对TCP/IP协议的学习,本人写了一个可以实现对PCAP文件中的IPV4下的TCP流提取,以及提取指定的TCP流,鉴于为了学习,没有采用第三方包解析pcap,而是对bytes流进行解析,其核心思想为:若想要提取TCP Content,需在下层的IPV4协议中判断Protocol是否为TCP,然后判断下层的以太网协议的Type是否为IPV4协议(此处的IPV4判断,只针对本人所写项目);对于指定流需要获取Client以及Server的[IP,PORT]。

一、Pcap文件解析

对于一个Pcap文件,其结构为文件头,数据包头,数据包数据,数据包头,数据包数据……,文件头为24字节,如下:Magic:4Byte:标记文件开始,并用来识别文件自己和字节顺序

Major:2Byte: 当前文件主要的版本号

Minor:2Byte: 当前文件次要的版本号

ThisZone:4Byte:当地的标准时间,如果用的是GMT则全零,一般都直接写 0000 0000

SigFigs:4Byte:时间戳的精度

SnapLen:4Byte:最大的存储长度

LinkType:4Byte:链路类型

数据报头为16字节,如下:Timestamp 4Byte:被捕获时间的高位,精度为seconds

Timestamp 4Byte:被捕获时间的低位,精度为microseconds

Caplen 4Byte:当前数据区的长度,即抓取到的数据帧长度,不包括Packet Header本身的长度,单位是 Byte ,由此可以得到下一个数据帧的位置。

Len 4Byte:离线数据长度:网络中实际数据帧的长度,一般不大于caplen,多数情况下和Caplen数值相等。

Packet Data

在数据包头之后,就是数据包的数据了,数据长度就是Caplen个Byte,在此之后是一个新的Packet Header,新的Packet Data,如此循环。

二、以太网协议解析

以太网协议为14Byte,6Byte Destination,6Byte Source,2Byte Type

三、IPV4协议解析

不同的IP协议各有不同,本项目只选用IPV4下的TCP流Version 4bit:对于IPv 4,这总是等于4

IHL 4bit:数据报协议头长度,表示协议头具有32位字长的数量。该字段的最小值为5,它表示长度为5×32位=160位=20字节。作为一个4位字段,最大值为15字(15×32位,或480位=60字节)

DSCP 6bit:差分服务代码点

ECN 2bit:显式拥塞通知

Total Length 2Byte:这个16位字段定义了整个IP数据包大小(以字节为单位),包括报头和数据,最小大小为20字节(没有数据的头),最大为65535字节。

Identification 2Byte:该字段是一个标识字段,主要用于唯一标识单个IP数据报的片段组。

Flags 3bit:用于控制或识别片段

Fragment Offset 13bit:片段偏移字段以8字节块为单位进行测量。它有13位长,并指定特定片段相对于原始未分段ip数据报开头的偏移量。第一个片段的偏移量为零。这允许最大偏移量(2**13-1)×8=65528字节,这将超过包含报头长度(65528+20=65548字节)的最大IP数据包长度65535字节。

Time To Live (TTL) 1Byte:一段8位的存活时间有助于防止数据报在互联网上持久化

Protocol 1Byte:此字段定义IP数据报的数据部分中使用的协议

Header Checksum 2Byte:16位IPV4头校验和字段用于对标头进行错误检查

Source address 4Byte:此字段是数据包发件人的IPV4地址。

Destination address 4Byte:该字段是数据包接收方的IPV4地址

Options:选项字段不常使用。

四、TCP协议解析Source port (16 bits):标识发送端口

Destination port (16 bits):标识接收端口

Sequence number (32 bits):序列号,具有双重作用,如果syn被设置成1,标志这是初始序列号,如果syn被设置成0,表示这是初始序列号,如果syn被设置成0,表示这是当前会话的此段的第一个数据字节的累积序列号

Acknowledgment number (32 bits):如果设置ACK标志,则此字段的值是ACK发送方期望的下一个序列号

Data offset (4 bits):指定以32位为单位的tcp报头的大小。最小标头为5字,最大为15字,从而使其最小为20字节,最大为60字节,允许在标题中设置多达40字节的选项

Reserved (3 bits):供将来使用,并应设置为零

Flags (9 bits) (aka Control bits):包含9个标志位NS (1 bit): ECN-nonce - 隐藏保护

CWR (1 bit): 发送主机设置拥塞窗口减少(Cwr)标志,以表明它收到了设置了ecc标志的tcp段,并在拥塞控制机制中作出了响应

ECE (1 bit): ECN-Echo具有双重角色,这取决于SYN标志的值

URG (1 bit): 指示紧急指针字段是有效的

ACK (1 bit): 指示确认字段是有效的。客户端发送的初始SYN数据包之后的所有数据包都应该设置此标志

PSH (1 bit): 推送功能,请求将缓冲数据推送到接收应用程序

RST (1 bit):重置连接

SYN (1 bit): 同步序列号。只有从每一端发送的第一个数据包应该设置此标志。其他一些标志和字段根据此标志更改含义,有些只有在设置1时才有效,而另一些则在0时才有效

FIN (1 bit): 来自发送方的最后一包Window size (16 bits):接收窗口的大小

Checksum (16 bits):16位校验和字段用于对报头、有效载荷和伪头进行错误检查

Urgent pointer (16 bits):如果设置了URG标志,则此16位字段与表示最后一个紧急数据字节的序列号之间的偏移量

Options (Variable 0–320 bits, divisible by 32):该字段的长度由数据偏移字段决定

五、处理文件

部分核心代码如下:

此部分是对pcap(bytes)文件读入,将每一个数据包数据作为一帧,判断为IPV4-TCP数据后,将TCP里面的[src, dst,src_port,dst_port, seq, ack, flags, content]一帧帧提取,存储在tcp_stream,此处即为提取pcap文件中所有的TCP流

此处是对于上面传入的tcp_stream,提取出我们想要指定的Tcpstream,如果flags_ack,flages_push为1时,即有Client或Server进行http请求,若此包被确认接收,则进行存储(避免重传,丢包的情况),判断flags_fin为1时,结束循环,返回指定的Tcp流。

六、完整代码

TCP学习:https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure

IPV4学习:https://en.wikipedia.org/wiki/IPv4#Packet_structure

完整代码:https://github.com/sunpudding/python,里面不仅有完整项目代码,还有单元测试,欢迎下载,一起学习交流。

python分析pcap文件_Python-对Pcap文件进行处理,获相关推荐

  1. python分析数据包_Python解析pcap数据包

    Post Views: 29,789 零.前言 历时数月,终于结束了考研初试,Blog也很长时间没有更新了,期间还是有些小伙伴来Blog看文章很是感动.以后一定会坚持更新,尽量给大家推送一些干货.这次 ...

  2. python不同数据的读入_python读写不同编码txt文件_python读写txt文件

    python读写不同编码txt文件_python读写txt文件 以后整理规范 [python] view plaincopy import os import codecs filenames=os. ...

  3. excel数据导入python后不对齐_Python处理Excel文件的实用姿势

    真正的勇士,敢于直面银行卡上的余额,敢于正视磅秤上的数字. 表格数据是最常见的数据类型,Excel是日常办公中最常接触的文件. 上一章提过Python可以通过openpyxl模块处理Excel文件. ...

  4. python json文件_python读写json文件的简单实现

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...

  5. python生成表格文件_python 读取excel文件生成sql文件实例详解

    python 读取excel文件生成sql文件实例详解 学了python这么久,总算是在工作中用到一次.这次是为了从excel文件中读取数据然后写入到数据库中.这个逻辑用java来写的话就太重了,所以 ...

  6. python本地读csv文件_python读写csv文件方法详细总结

    python提供了大量的库,可以非常方便的进行各种操作,现在把python中实现读写csv文件的方法使用程序的方式呈现出来. 在编写python程序的时候需要csv模块或者pandas模块,其中csv ...

  7. python中怎么打开文件_python如何打开文件

    python中的文件对象: 文件对象不仅可以用来访问普通的磁盘文件, 而且也可以访问任何其它类型抽象层面上的"文 件". 一旦设置了合适的"钩子", 你就可以访 ...

  8. python调用接口上传文件_python上传文件接口

    文件的参数组装: ('文件名',"open打开的文件(rb模式打开)",'文件的类型说明') 关于不同的请求参数类型,使用requests的处理: 1.文件上传(Content-T ...

  9. python合并csv文件_PYTHON合并CSV文件的实践

    最近尝试使用PYTHON处理CSV数据,由于CSV文件有好几个,需要提前拼接,然后再处理,因此遇到了PYTHON对文件进行合并的问题.此次尝试了两种方法:一是调用CMD命令处理:二是使用PYTHON写 ...

  10. python读xml文件生成头文件_Python根据指定文件生成XML的方法

    因项目需要根据指定格式的文件生成XML标注文件,可以方便使用LabelImg打开进行编辑和查看.其原始文件默认使用逗号进行分隔,如下所示: 第1个值:原始图片中切图小文件,以AIpng_x,其中x代表 ...

最新文章

  1. c语言实现字符串中提取数字,遇到非字符串则换行
  2. 实验三 ShellShock 攻击实验
  3. 将现有Git存储库推送到SVN
  4. bzoj2746: [HEOI2012]旅行问题
  5. Java黑皮书课后题第7章:7.26(完全相同的数组)如果两个数组list1和list2的对应元素都相等,认为完全相同。编写一个测试程序,提示用户输入两个整数列表,然后显示这两个列表是否完全相同
  6. SAP Cloud for Customer的后台作业
  7. 计算机图形学考试题及答案_计算机图形学考试题及答案
  8. 学生管理系统分层开发
  9. 图论:有源汇有上下界最小流
  10. 解决OverflowError: int too large to convert to float的办法
  11. 盘点!物流移动机器人的几种定位技术
  12. AUTOCAD——Excel表格导入CAD、CAD合并两兄弟
  13. 比制定目标更重要的是管理资源
  14. Android隐藏状态栏实现沉浸式体验
  15. javascript中mouseover和mouseout事件详解
  16. 国内与国外CRM系统相比有哪些优劣势?
  17. 走近棒球运动·韩国职业棒球联盟·MLB棒球创造营
  18. PS制作复古彩色画人像照片、创意分割照片
  19. 总结了这67个pandas函数,完美解决数据处理,拿来即用!
  20. Java综合性实验 - 学生成绩分析程序

热门文章

  1. 2020-08-05流量计怎么选你学会了么?
  2. 19-Spring Security资源服务器配置详解
  3. 用ImDisk在Windows 10中创建内存虚拟盘
  4. sipp工具的使用--简单的呼叫测试
  5. 论文查重:利用Python查找两个Word文件的相同内容
  6. 关于软件开发的那些事(三):聊聊软件项目管理及成本核算
  7. 你需要启用steam社区界面功能以进行购买_钱包,危!Jump现在可以查看Steam游戏折扣了!更多功能进来看!(内有福利)...
  8. MySQL 中的 repeate() 函数
  9. Python 之字典(dict)根据 value 获取 key
  10. 【IDEA类注释模板和方法注释模板】