python/dpkt: узнать, является ли пакет пакетом tcp или пакетом udp,

У меня есть скрипты Python, которые захватывают пакеты в сети Ethernet с помощью dpkt, но как мне отличить, какие пакеты для tcp, а какие для udp.

В конце концов я хотел бы иметь список пакетов для каждого соединения tcp, которое было установлено в течение интервала времени.

мой код:

import dpkt
import pcapy
cap=pcap.open_live('eth0',100000,1,0)
(header,payload)=cap.next()
while header:
    eth=dpkt.ethernet.Ethernet(str(payload))
    ip=eth.data
    tcp=ip.data 
    # i need to know whether it is a tcp or  a udp packet here!!!
    (header,payload)=cap.next()

person ConfusedAboutCPP    schedule 13.01.2012    source источник
comment
Я нашел ответ, так что я мог бы опубликовать его здесь для других. Следующий код выполняет эту работу: ip=eth.data if (ip.__dict).has_key('tcp'): #тогда это tcp-пакет...   -  person ConfusedAboutCPP    schedule 13.01.2012


Ответы (2)


Заголовок IP содержит поле протокола. dpkt должен позволить вам получить это значение, и с его помощью вы сможете угадать, что находится поверх IP. Вот список допустимых номеров протоколов http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml. UDP равен 17, а TCP равен 6.

Изменить: я проверил эту проблему и, как я уже упоминал, dpkg предоставляет свойства p для доступа к полю протокола IP. Так что можете еще раз перепроверить. Но он также автоматически анализирует пакет и устанавливает свойство data для экземпляра класса, который представляет верхний протокол, такой как UDP или TCP. Таким образом, вы можете проверить тип свойства data и распознать этот протокол.

from dpkt.ip import IP, IP_PROTO_UDP
from dpkt.udp import UDP
ip = IP('E\x00\x00"\x00\x00\x00\x00@\x11r\xc0\x01\x02\x03\x04\x01\x02\x03\x04\x00o\x00\xde\x00\x0e\xbf5foobar')
#if ip.p == IP_PROTO_UDP:  # checking for protocol field in ip header
if type(ip.data) == UDP :  # checking of type of data that was recognized by dpkg
    udp = ip.data
    print udp.sport
else:
    print "Not UDP"
person Zuljin    schedule 13.01.2012

Сценарий Python, который перехватывает пакеты на адаптере Ethernet eth0 с помощью dpkt и различает TCP< /strong> и UDP пакеты IP.

import dpkt
import pcapy

cap=pcapy.open_live('eth0',100000,1,0)
(header,payload)=cap.next()

while header:
    eth=dpkt.ethernet.Ethernet(str(payload))

    # Check whether IP packets: to consider only IP packets 
    if eth.type!=dpkt.ethernet.ETH_TYPE_IP:
            continue
            # Skip if it is not an IP packet
    ip=eth.data
    if ip.p==dpkt.ip.IP_PROTO_TCP: # Check for TCP packets
           TCP=ip.data 
           # ADD TCP packets Analysis code here
    elif ip.p==dpkt.ip.IP_PROTO_UDP: # Check for UDP packets
           UDP=ip.data 
           # UDP packets Analysis code here

    (header,payload)=cap.next()
person Irengbam Tilokchan Singh    schedule 05.04.2012