使用dpkt实现微秒级分辨率

2 投票
2 回答
1444 浏览
提问于 2025-04-18 02:52

我正在尝试创建一个Python脚本,用来解析一个pcap文件,并测量网络流量的突发性,精确到毫秒以下。问题是,dpkt提供的时间戳似乎不够精确。以下是我的脚本:

f=file(sys.argv[1],"rb")
pcap=dpkt.pcap.Reader(f)


for ts, buf in pcap:
  eth=dpkt.ethernet.Ethernet(buf)
  size = len(eth)
  print "packet size %s" % size
  print "timestamp %s" % ts

运行后得到的结果是:

数据包大小 199
时间戳 1397589057.04
数据包大小 119
时间戳 1397589057.04
数据包大小 66
时间戳 1397589057.04
数据包大小 247
时间戳 1397589057.04

这些数据包的实际时间戳应该是类似于 .043549 的格式,这样才能精确到微秒。请问有没有人知道怎么获取完整的时间戳?

2 个回答

2

我不知道这是否能完全帮助你,但我注意到了同样的问题。根据我的需求,我更喜欢整数值,而不是浮点数转换。当然,要做到这一点,你需要源代码:

这个问题的来源是在pcap.py文件的第151行,这个文件在dpkt(版本1.8)目录下:

yield (hdr.tv_sec + (hdr.tv_usec / 1000000.0), buf)

你可以把它改成下面的样子,这样就能确保返回原始的秒数和微秒的整数值:

yield ((hdr.tv_sec, hdr.tv_usec), buf)

这个元组的格式是我喜欢的样子,可以进行修改。

3

我假设你正在做类似这样的事情:

for ts, buf in pcap:
    print ts

然后你发现时间戳显示为 1408173480.93,而不是 1408173480.936543。这是因为在Python中,打印函数会把浮点数限制为两位小数。

举个例子:

>>> x = 1258494066.119061
>>> x
1258494066.119061
>>> print x
1258494066.12

如果你真的需要打印出完整的数值,可以使用格式化:

>>> "{0:.6f}".format(x)
'1258494066.119061'

撰写回答