输出数据包的scapy时间戳测量

时间:2017-09-18 09:40:42

标签: python python-2.7 timestamp scapy

有没有办法测量通过scapy发送的传出数据包的时间戳?如何以标准化值显示这些时间戳,例如wireshark中的时间戳。

我可以通过

发送一个简单的数据包流
packet=IP(src="192.168.0.254", dst="192.168.0.2")/TCP(sport=35021, dport=35021)
pkt=sniff(filter="host 192.168.0.254")

当我从另一个终端嗅探时,

pkt=sniff(filter="host 192.168.0.254")
for p in pkt:
    print p[TCP].time

给了我以下时间值

1505733059.335
1505733059.336
1505733059.336
1505733059.336
1505733059.337
1505733059.337
1505733059.338
1505733059.338
1505733059.338
1505733059.339

据我所知,这些是数据包发送时的值,对吧?如何将这些值更改为规范化值,例如wireshark?

1 个答案:

答案 0 :(得分:1)

嗅探打包的time属性实际上表示收到数据包的时间,而不是它发送的时间。实际上,即使 Wireshark 与嗅探数据包关联的时间也是收到的时间,如detailed in the official wiki

没有直接的方法来提取嗅探数据包的发送时间。可以尝试测量网络延迟并基于此推断发送时间,但这种方法的准确性值得怀疑。另一种选择是在发送机器上提取发送时间并以某种方式将其传送到嗅探机器,如果使用可控制的ad hoc协议,则在带内传输,否则两种方法看起来相当不优雅只有在可以操纵发送机器时才可行。

time属性中存储的值等于the time.time() function的返回值,这是自epoch以来的秒数,即时间开始的时间点,是平台依赖。

这些值可以转换为UTC中更常见的时间格式(即年,月,日,小时等),方法是将它们传递给the time.gmtime() function或在当地时间传递给{{3} }。在这两种情况下都返回the time.localtime() function,从中可以作为属性访问日历日期的组件。将返回的struct_time对象传递给struct_time object会将其转换为人类可读的字符串格式,但可以通过the time.asctime() function更好地控制人类可读输出。

Python 3.4.3 (default, Nov 17 2016, 01:08:31) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import time
>>>
>>> timestamp = time.time()
>>> print(timestamp)
1505806452.8678658
>>>
>>> local_time = time.localtime(timestamp)
>>> print(local_time)
time.struct_time(tm_year=2017, tm_mon=9, tm_mday=19, tm_hour=10, tm_min=34, tm_sec=12, tm_wday=1, tm_yday=262, tm_isdst=1)
>>>
>>> human_time = time.asctime(local_time)
>>> print(human_time)
Tue Sep 19 10:34:12 2017
>>> 
>>> my_human_time = time.strftime('%A, %d/%m/%y, %I:%M:%S %p', local_time)
>>> print(my_human_time)
Tuesday, 19/09/17, 10:34:12 AM
>>>