Parsing BGP MRT格式解析

Parsing BGP MRT格式解析,parsing,trace,packet-capture,bgp,Parsing,Trace,Packet Capture,Bgp,我正在尝试解析下载的BGP跟踪。据说,BGP数据包跟踪存储在带有前缀更新的文件中,这些MRT格式的文件可以被用户读取 我下载了一个文件并遵循(或): 然而,我得到了这个错误: Traceback (most recent call last): File "bgp-stats.py", line 8, in <module> for mrt_h, bgp_h, bgp_m in dump: File "/usr/local/lib/python2.7/dist-pac

我正在尝试解析下载的BGP跟踪。据说,BGP数据包跟踪存储在带有前缀更新的文件中,这些MRT格式的文件可以被用户读取

我下载了一个文件并遵循(或):

然而,我得到了这个错误:

Traceback (most recent call last):
  File "bgp-stats.py", line 8, in <module>
    for mrt_h, bgp_h, bgp_m in dump:
  File "/usr/local/lib/python2.7/dist-packages/pybgpdump.py", line 61, in next
    bgp_m = dpkt.bgp.BGP(bgp_h.data)
  File "/usr/local/lib/python2.7/dist-packages/dpkt/dpkt.py", line 89, in __init__
    self.unpack(args[0])
  File "/usr/local/lib/python2.7/dist-packages/dpkt/bgp.py", line 152, in unpack
    self.data = self.update = self.Update(self.data)
  File "/usr/local/lib/python2.7/dist-packages/dpkt/dpkt.py", line 89, in __init__
    self.unpack(args[0])
  File "/usr/local/lib/python2.7/dist-packages/dpkt/bgp.py", line 247, in unpack
    attr = self.Attribute(self.data)
  File "/usr/local/lib/python2.7/dist-packages/dpkt/dpkt.py", line 89, in __init__
    self.unpack(args[0])
  File "/usr/local/lib/python2.7/dist-packages/dpkt/bgp.py", line 326, in unpack
    self.data = self.as_path = self.ASPath(self.data)
  File "/usr/local/lib/python2.7/dist-packages/dpkt/dpkt.py", line 89, in __init__
    self.unpack(args[0])
  File "/usr/local/lib/python2.7/dist-packages/dpkt/bgp.py", line 376, in unpack
    seg = self.ASPathSegment(self.data)
  File "/usr/local/lib/python2.7/dist-packages/dpkt/dpkt.py", line 94, in __init__
    (self.__class__.__name__, args[0]))
dpkt.dpkt.UnpackError: invalid ASPathSegment: '\x1d\xf6\x00\x00\x1d\xf6\x00\x00\x1d\xf6\x00\x00F\xe0'
这里发生了什么?所有的跟踪文件都不可读,我不知道如何从我找到的文件中解析这些文件


非常感谢

这是dpkt库中的一个错误。官方存储库中有一个,但它来自2015年。 问题在于,BGP更新解析器将AS路径中的AS编号视为2个八位字节/字节的AS编号,即使它们被编码为4个八位字节/字节的AS编号。因此,当它到达一个4字节的开头时,编码为长度为2的路径

\x00\x00\xab\xcd   \x00\x00\x12\x34
它将尝试读取两个2字节作为数字,然后停止。因此,它不是读取
439814660
,而是读取
043981
,并错误地解释剩余字节

目前还没有快速解决方案,因为这个问题相当棘手。为了了解AS路径是如何编码的,必须查看BGP Open消息中协商的功能。不确定其他解析器如何处理此问题


您可以在回购协议中删除该问题,或者尝试其他类似的库。

谢谢@Sarch!很高兴知道这是一个众所周知的问题。我尝试了
bgpdump
来解析,它给了我合理的结果。
(999, 'BGP messages in the MRT dump')
\x00\x00\xab\xcd   \x00\x00\x12\x34