Python 使用Scapy获取TCP标志

Python 使用Scapy获取TCP标志,python,tcp,packet,packet-capture,scapy,Python,Tcp,Packet,Packet Capture,Scapy,我正在解析一个PCAP文件,需要提取TCP标志(SYN、ACK、PSH、URG等)。 我正在使用数据包['TCP'].flags值一次获取所有标志 pkts = PcapReader(infile) for p in pkts: F = bin(p['TCP'].flags) print F, bin(F), p.summary() # manual flags extraction from F 有没有一种方法可以在不从数据包['TCP']手动

我正在解析一个PCAP文件,需要提取TCP标志(SYN、ACK、PSH、URG等)。 我正在使用
数据包['TCP'].flags
值一次获取所有标志

pkts = PcapReader(infile)
for p in pkts:
        F = bin(p['TCP'].flags)
        print F, bin(F), p.summary()
        # manual flags extraction from F

有没有一种方法可以在不从
数据包['TCP']手动提取的情况下获取单个TCP标志。标志
值?

通常,处理标志的常用方法是使用位图和位运算符。如果您的
数据包
类没有特定的方法来测试标志,那么您可以做的最好的事情是:

FIN = 0x01
SYN = 0x02
RST = 0x04
PSH = 0x08
ACK = 0x10
URG = 0x20
ECE = 0x40
CWR = 0x80
然后像这样测试它们:

F = p['TCP'].flags    # this should give you an integer
if F & FIN:
    # FIN flag activated
if F & SYN:
    # SYN flag activated
# rest of the flags here
遗憾的是,python没有一个
switch
语句来使这一点更加优雅,但这并不重要

希望这有帮助

您可以使用
Packet.sprintf()
方法:

>>> p = IP()/TCP(flags=18)
>>> p.sprintf('%TCP.flags%')
'SA'
如果您想要“长”名称,请使用
dict
而不是长
If
elif
。。。表达式(
dict
通常在Python中使用,当您在其他语言中使用
开关时):


记录在案的另一个选项在提出这个问题时并不存在。它与当前的Scapy开发版本配合使用(包括此更改的第一个版本将是2.4.0;2.4.0rc*也包括它)

现在可以对标志值使用
str()

>>> p = IP()/TCP(flags=18)
>>> p[TCP].flags
<Flag 18 (SA)>
>>> str(p[TCP].flags)
'SA'
>p=IP()/TCP(标志=18)
>>>p[TCP].标志
>>>str(p[TCP].flags)
“萨”
这同样有效

if packet[TCP].flags.F:
    print('FIN received')

定义更聪明的方式?你是如何手动完成的?你是说上面的方法有效吗?代码有什么问题?好的,python是如何工作的?它可能使用了
\uu getattr\uu
语义
if packet[TCP].flags.F:
    print('FIN received')