Что означает значение атрибута 'flags' пакета tcp в pcap при чтении dpkt в python?

Я использовал пакет python dpkt для анализа файла 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.

Я заметил, что значение tcp.flags в syn_plus_ack равно 18, dpkt.tcp.TH_SYN равно 2, а dpkt.tcp.TH_ACK равно 16. Является ли значение tcp.flags суммой значений всех флагов в пакете? Есть ли что-то, что я делаю не так?

1 ответ

Решение

Вероятно, это происходит потому, что вы предполагаете, что все пакеты в pcap являются TCP. Вы должны убедиться, что пакет является действительным TCP, прежде чем анализировать его заголовки для flags, Это можно сделать, проверив p поле в ip заголовок будет 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 файл доступен здесь и вот результат:

Packet #0 : 10 = 0x2
Found TCP SYN & ACK in Packet #1
Packet #1 : 10010 = 0x12
Packet #2 : 10000 = 0x10
Packet #3 : 11000 = 0x18
Другие вопросы по тегам