通过对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流
四、TCP协议解析
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,里面不仅有完整项目代码,还有单元测试,欢迎下载,一起学习交流。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章