使用dpkt实现微秒级分辨率
我正在尝试创建一个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'