Как напечатать имя протокола вместо соответствующего номера в pyshark?

import pyshark

pkt = pyshark.FileCapture('mypacket.pcap')

pkt[1].ip.proto 

выход: 17

Я хотел бы напечатать «UDP» вместо «17»


person Pankaj    schedule 16.03.2021    source источник


Ответы (1)


Список номеров протоколов можно найти здесь: https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml

Преобразование

По сути, мы хотим преобразовать номер протокола в имя, используя встроенную библиотеку socket Python, например этот вопрос.

import socket
import pyshark


def proto_name_by_num(proto_num):
    for name,num in vars(socket).items():
        if name.startswith("IPPROTO") and proto_num == num:
            return name[8:]
    return "Protocol not found"

def packet_lvl4_protocol(filepath, packet_num):
    packet_capture = pyshark.FileCapture(filepath)
    pkt = packet_capture[packet_num]
    proto_num = int(pkt.ip.proto)
    proto_name = proto_name_by_num(proto_num)
    return proto_name

layer_name = packet_lvl4_protocol("mypacket.pcap", 1)
print(layer_name)

Это должно дать UDP, при условии, что указанный пакет имеет уровень UDP.

Проверка этого решения

for i in range(257):
    proto_name = proto_name_by_num(i)
    if proto_name != "Protocol not found":
        print(i, num)

С выводом приведенного выше фрагмента кода мы видим, что это номера протоколов, известные socket на момент написания этого ответа:

0 IP
1 ICMP
2 IGMP
3 GGP
4 IPV4
6 TCP
8 EGP
12 PUP
17 UDP
22 IDP
29 TP
36 XTP
41 IPV6
43 ROUTING
44 FRAGMENT
46 RSVP
47 GRE
50 ESP
51 AH
58 ICMPV6
59 NONE
60 DSTOPTS
63 HELLO
77 ND
80 EON
103 PIM
108 IPCOMP
132 SCTP
255 RAW
256 MAX
person Ross Jacobs    schedule 16.03.2021
comment
Это сработало. Спасибо, @Росс Джейкобс - person Pankaj; 16.03.2021
comment
@Pankaj, если это отвечает на ваш вопрос, отметьте его как таковой. - person Ross Jacobs; 16.03.2021