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

Kas*_*mad 2 python timestamp scapy python-2.7

有没有办法测量通过 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")
Run Code Online (Sandbox Code Playgroud)

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

pkt=sniff(filter="host 192.168.0.254")
for p in pkt:
    print p[TCP].time
Run Code Online (Sandbox Code Playgroud)

给我以下时间值

1505733059.335
1505733059.336
1505733059.336
1505733059.336
1505733059.337
1505733059.337
1505733059.338
1505733059.338
1505733059.338
1505733059.339
Run Code Online (Sandbox Code Playgroud)

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

Yoe*_*oel 5

time嗅探打包的属性实际上表示接收包的时间,而不是发送的时间。事实上,即使Wireshark与嗅探数据包相关联的时间也是它被接收的时间,如官方 wiki 中所述

没有直接的方法可以提取发送嗅探数据包的时间。可以尝试测量网络延迟并据此推断发送时间,但这种方法的准确性值得怀疑。另一种选择是在发送机器上提取发送时间并以某种方式将其传输到嗅探机,如果正在使用可控的 ad hoc 协议,则在带内或在带外,但这两种方法似乎都不太优雅,并且是只有在发送机器可以被操纵的情况下才可行。


存储在所述值time属性等同于返回值time.time()函数,这是以秒计的时间,因为历元,即,其中的时间开始并且是依赖于平台的点。

这些值可以通过它们传递给被转换成UTC一种比较常见的时间格式(即年,月,日,小时等)time.gmtime()功能通过它们传递给或在本地时间time.localtime()函数。在这两种情况下,都会返回一个struct_time对象,从中可以访问日历日期的组件作为属性。返回上传递struct_time对象time.asctime()函数将其转换为人类可读串格式,但更好地控制的人可读输出的通过是可能time.strftime()功能

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
>>> 
Run Code Online (Sandbox Code Playgroud)