我正在开发一个应用程序,该应用程序需要涉及各种事件的精确时间戳的复杂测试。
举例来说,假设我们有两个主机:h1 和 h2。
现在,如果我在 h1 上运行 tcpdump,我会得到一个关联的时间戳。h2 也是如此。
现在,假设 h1 向 h2 发送一个 ICMP 数据包。据我所知,该数据包在离开 h1 时应记录在 h1 的 tcpdump 上,在 h2 收到该数据包时应记录在 h2 的 tcpdump 上。
现在我正在使用 VirtualBox 将主机模拟为 Ubuntu 机器。
我有两个问题:
一、我对 tcpdump 的假设正确吗?
其次,我能否绝对确定两个虚拟机的中心时间相同。我知道这在物理网络中是不可能的。但是,由于虚拟机共享一个公共系统,我想知道这是否也成立。如果不是,还有其他方法可以在测试时确保同步吗?
[结束语]:对于那些可能好奇的人来说,VirtualBox 配置了 NTP,如果您有类似的任务,那么设置 NTP 可以从您的待办事项列表中删除。
答案1
您的假设tcpdump
是正确的。tcpdump
捕获会抓取原始数据包。
因此,处理转储时您可以访问的时间戳值是数据包中的时间戳值(由发送系统)。
如果你是日志记录接收方的数据包能包括两个时间戳(来自数据包的发送方时间戳和来自本地时钟的接收方时间戳)。
早在 1981 年,他们就在 RFC 781 中详细讨论了这个问题。
关于时间同步,答案是总是网络时间协议 (NTP)。
虚拟机可以同步虚拟硬件时钟主机的时间观念与操作系统的时间观念相一致,但操作系统可能不会过分检查硬件时钟。现代操作系统(至少是 unix/linux)保留与硬件时钟半独立的操作系统时间,并偶尔将其写回。
NTP 规范了系统对于“现在几点”的认识,并考虑到了硬件时钟/计时子系统的自然漂移。使用 NTP 同步虚拟机时钟是确保它们在现实世界中尽可能地时间一致的最佳方式。
虚拟机不应该用于任何时间紧迫的事情* -- 虚拟机的计时能力确实很差。即使是最好的商用虚拟机管理程序也会根据系统工作量和其他因素而增加或减少时间。VirtualBox 是工作站级虚拟化,更容易出现此类问题。
我见过没有 NTP 或其他计时助手的 VirtualBox VM 在我的工作站上每小时最多会减少一分钟。这绝对超出了我可接受的准确度范围。
答案2
我同意 voretaq7 的所有观点,除了一点,不要使用 ntp!请使用 sntp。Ntp 是一种很好的协议,但它不适合虚拟机。Ntp 假设时钟是可测量和可预测的,并利用这一假设通过测量时钟的不准确性来使其更准确。这会产生一个强大、准确、容错的时间测量。但是,它会在时钟既不具备上述属性的虚拟机上中断,从而混淆 vm 客户机上的 ntp 服务器(请记住 ntp 是一种对等协议)。对于大多数 Windows 客户机来说,这不是问题,因为它们使用 sntp 并将其称为 ntp,但对于 Linux 客户机来说,这是一个问题,因为它们通常有一个可用的 ntp 服务器(如果未包含标准)。这也不是 ntpdate 的问题。不过,我建议在主机上运行完整的 ntp 服务器,因为它有一个可测量且可预测的硬件时钟。