pcap中tcp包的'flags'属性值在python中被dpkt读取时代表什么?
What does the value of 'flags' attribute of tcp packet in pcap represent when read by dpkt in python?
我使用 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 value 数据包中所有标志值的总和?我做错了什么吗?
这可能是因为您假设 所有 pcap 中的数据包都是 TCP。在将 header 解析为 flags
之前,您需要确保数据包实际上是 TCP。这可以通过检查 ip
header 中的 p
字段为 6
(dpkt.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
我使用 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 value 数据包中所有标志值的总和?我做错了什么吗?
这可能是因为您假设 所有 pcap 中的数据包都是 TCP。在将 header 解析为 flags
之前,您需要确保数据包实际上是 TCP。这可以通过检查 ip
header 中的 p
字段为 6
(dpkt.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