';旗帜';pcap中tcp数据包的属性表示何时被python中的dpkt读取?

';旗帜';pcap中tcp数据包的属性表示何时被python中的dpkt读取?,python,tcp,tcp-ip,tcpdump,dpkt,Python,Tcp,Tcp Ip,Tcpdump,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_a

我使用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,但没有ACK+SYN


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

这可能是因为您假设pcap中的所有数据包都是TCP。在解析数据包头的
标志之前,需要确保数据包实际上是TCP。这可以通过检查
ip
标题中的
p
字段是否为
6
dpkt.ip.ip_PROTO_TCP
):

我刚刚在可用的
http.pcap
文件中尝试了这一点,结果如下:

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

对它的
16 | 2
,即
18
。您可以共享您正在使用的pcap文件吗?或者你能把pcap的结果发布在@KiranBandla上吗对不起,我不能分享pcap文件,但是你的回答解决了我的问题。谢谢
Packet #0 : 10 = 0x2
Found TCP SYN & ACK in Packet #1
Packet #1 : 10010 = 0x12
Packet #2 : 10000 = 0x10
Packet #3 : 11000 = 0x18