【问题标题】:How to get protocol numbers in PCAP file?如何获取 PCAP 文件中的协议号?
【发布时间】:2017-03-08 01:39:07
【问题描述】:

一些协议编号是:

6 TCP 传输控制 [RFC793] ... 17 UDP 用户数据报 [RFC768]

由 IANA 提供。

import pyshark

pkts = pyshark.FileCapture('testes.pcap')

我只想打印 PCAP 文件中的所有协议编号,然后保存在文件中。如何使用 pyshark 获取它?

【问题讨论】:

    标签: python python-2.7 python-3.x pyshark


    【解决方案1】:

    您查看过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 属性)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 2021-11-26
      • 2011-01-15
      • 1970-01-01
      • 2012-04-30
      • 2014-11-13
      • 1970-01-01
      相关资源
      最近更新 更多