pcap中tcp包的'flags'属性值在python中由dpkt读取时表示什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pcap中tcp包的'flags'属性值在python中由dpkt读取时表示什么?相关的知识,希望对你有一定的参考价值。

我使用dpkt python包来解析pcap文件,并执行以下操作来获取tcp数据包:

f = open(fname)
pcap = dpkt.pcap.Reader(f)
tcps = []
for ts, buff in pcap_in:
    eth = dpkt.ethernet.Ethernet(buff)
    ip = eth.data
    tcp = ip.data

现在我想看看哪些都有SYN和ACK标志。我尝试将具有这两个标志的那些标记放在列表中,如下所示:

syn_plus_ack = []
for tcp in tcps:
    if ((tcp.flags & dpkt.tcp.TH_SYN) and (tcp.flags & dpkt.tcp.TH_ACK)):
        syn_plus_ack.append(tcp)

我不确定这是否正在做我想要它做的事情,因为我在一个示例pcap文件上尝试了它,并且有太多的数据包具有大量的SYN但没有A​​CK + SYN。

我注意到syn_plus_ack中tcp.flags的值是18,dpkt.tcp.TH_SYN是2,dpkt.tcp.TH_ACK是16. tcp.flags值是数据包中所有标志值的总和吗?有什么我做错了吗?

答案

这可能是因为您假设pcap中的所有数据包都是TCP。在解析flags的标头之前,您需要确保数据包是非TCP的。这可以通过检查p标题中的ip字段为6dpkt.ip.IP_PROTO_TCP)来完成:

import dpkt

def parse_pcap(filepath):
    f = open(filepath)
    pcap = dpkt.pcap.Reader(f)
    for num, (ts, buff) in  enumerate(pcap):
        eth = dpkt.ethernet.Ethernet(buff)
        if eth.type != dpkt.ethernet.ETH_TYPE_IP:
            # We are only interested in IP packets
            continue
        ip = eth.data
        if ip.p != dpkt.ip.IP_PROTO_TCP:
            # We are only interested in TCP
            continue
        tcp = ip.data
        if ((tcp.flags & dpkt.tcp.TH_SYN) and (tcp.flags & dpkt.tcp.TH_ACK)):
            # TCP SYN and ACK
            print('Found TCP SYN & ACK in Packet #%d'%num)
        print('Packet #{1:d} : {0:b} = 0x{0:x}'.format(tcp.flags, num))

我刚刚在http.pcap文件中使用here尝试了这个,结果如下:

Packet #0 : 10 = 0x2
Found TCP SYN & ACK in Packet #1
Packet #1 : 10010 = 0x12
Packet #2 : 10000 = 0x10
Packet #3 : 11000 = 0x18

以上是关于pcap中tcp包的'flags'属性值在python中由dpkt读取时表示什么?的主要内容,如果未能解决你的问题,请参考以下文章

我需要能够使用 Pcap.Net 填充 tcp 数据包的以太网层

BMZ-MISC-pcap

使用 libpcap,有没有办法从离线 pcap 文件中确定捕获的数据包的文件偏移量?

使用 Scapy 获取 TCP 标志

隐藏在人群中的Flag,你能找到吗?

是否有可能在TCP 3路握手中获取SYN / ACK数据包的TCP序列号?