如何获取 PCAP 文件中的协议号?
How to get protocol numbers in PCAP file?
部分协议编号为:
6 TCP 传输控制 [RFC793]
...
17 UDP 用户数据报 [RFC768]
由 IANA。
import pyshark
pkts = pyshark.FileCapture('testes.pcap')
我只想打印 PCAP 文件中的所有协议编号,然后保存在文件中。我如何使用 pyshark 获取它?
您看过 pyshark
的文档了吗? README 向您展示了如何从单个数据包中读取数据。根据您的示例,我们可以像这样获得第一个数据包:
>>> pkt = next(pkts)
>>> pkt
<UDP/DNS Packet>
我们可以内省 pkt
以查看可用的字段:
>>> dir(pkt)
['__class__', '__contains__', '__delattr__', '__dict__', '__dir__',
[...]
'get_multiple_layers', 'highest_layer', 'interface_captured', 'ip',
[...]
由于您正在寻找协议信息,ip
似乎很有用(假设您询问的是 ip 协议编号)。让我们看看它包含什么:
>>> dir(pkt.ip)
['DATA_LAYER', '__class__', '__delattr__', '__dict__', '__dir__',
[...]
'addr', 'checksum', 'checksum_status', 'dsfield', 'dsfield_dscp',
'dsfield_ecn', 'dst', 'dst_host', 'field_names', 'flags', 'flags_df',
'flags_mf', 'flags_rb', 'frag_offset', 'get_field',
'get_field_by_showname', 'get_field_value', 'hdr_len', 'host', 'id',
'layer_name', 'len', 'pretty_print', 'proto', 'raw_mode', 'src',
'src_host', 'ttl', 'version']
我猜 proto
就是我们想要的。
>>> pkt.ip.proto
17
确实,17 是 UDP 的 ip 协议号。所以如果你只是想要一个协议号列表,你可以要求(这个输出来自本地数据包跟踪):
>>> [pkt.ip.proto for pkt in pkts if hasattr(pkt, 'ip')]
['17', '17', '17', '17', '6', '6', '6', '6', '6', '6', '6', '6', '6', '17', '17', '6', '6', '17', '17', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '1', '1', '1', '1', '1', '1', '1', '1']
(我们正在使用 hasattr
检查,因为非 IP 数据包没有 ip
属性)
部分协议编号为:
6 TCP 传输控制 [RFC793] ... 17 UDP 用户数据报 [RFC768]
由 IANA。
import pyshark
pkts = pyshark.FileCapture('testes.pcap')
我只想打印 PCAP 文件中的所有协议编号,然后保存在文件中。我如何使用 pyshark 获取它?
您看过 pyshark
的文档了吗? README 向您展示了如何从单个数据包中读取数据。根据您的示例,我们可以像这样获得第一个数据包:
>>> pkt = next(pkts)
>>> pkt
<UDP/DNS Packet>
我们可以内省 pkt
以查看可用的字段:
>>> dir(pkt)
['__class__', '__contains__', '__delattr__', '__dict__', '__dir__',
[...]
'get_multiple_layers', 'highest_layer', 'interface_captured', 'ip',
[...]
由于您正在寻找协议信息,ip
似乎很有用(假设您询问的是 ip 协议编号)。让我们看看它包含什么:
>>> dir(pkt.ip)
['DATA_LAYER', '__class__', '__delattr__', '__dict__', '__dir__',
[...]
'addr', 'checksum', 'checksum_status', 'dsfield', 'dsfield_dscp',
'dsfield_ecn', 'dst', 'dst_host', 'field_names', 'flags', 'flags_df',
'flags_mf', 'flags_rb', 'frag_offset', 'get_field',
'get_field_by_showname', 'get_field_value', 'hdr_len', 'host', 'id',
'layer_name', 'len', 'pretty_print', 'proto', 'raw_mode', 'src',
'src_host', 'ttl', 'version']
我猜 proto
就是我们想要的。
>>> pkt.ip.proto
17
确实,17 是 UDP 的 ip 协议号。所以如果你只是想要一个协议号列表,你可以要求(这个输出来自本地数据包跟踪):
>>> [pkt.ip.proto for pkt in pkts if hasattr(pkt, 'ip')]
['17', '17', '17', '17', '6', '6', '6', '6', '6', '6', '6', '6', '6', '17', '17', '6', '6', '17', '17', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '1', '1', '1', '1', '1', '1', '1', '1']
(我们正在使用 hasattr
检查,因为非 IP 数据包没有 ip
属性)