Linux内核提供了两个套接字选项,用于检索传入网络数据包的软件时间戳:SO_TIMESTAMP和带有SOF_TIMESTAMPING_RX_SOFTWARE | SOF_TIMESTAMPING_SOFTWARE标志的SO_TIMESTAMPING。文档将它们描述如下:
SO_TIMESTAMP在(不一定是单调的)系统时间内为每个传入数据包生成时间戳。
SO_TIMESTAMPING当数据进入内核时请求rx时间戳。这些时间戳是在设备驱动程序将数据包交给内核接收堆栈之后生成的。
据我所知,它们是不一样的,因为文件上说:
注意,如果SO_TIMESTAMP或SO_TIMESTAMPNS选项与使用SOF_TIMESTAMPING_SOFTWARE的SO_TIMESTAMPING一起启用,则将在recvmsg()调用中生成一个假的软件时间戳,并在缺少真正的软件时间戳时传入ts。
我的问题是,这两种时间戳类型真的不同吗?如果是的话,有什么区别?
我还想知道系统时间在这里意味着什么?这是clock_gettime与CLOCK_REALTIME提供的相同的时间源吗?
发布于 2020-12-22 04:46:12
您的猜测是正确的,它们是不一样的,它们之间的主要区别在于它们的工作方式或它们提供的结果,我发现自己在一些drivers的实现过程中处理了这个问题。
SO_TIMESTAMP:
这在接收路径上启用了数据报的时间戳,如果存在任何目标套接字事先未知--这意味着对所有数据包都是相同的选项,这也会为每个接收到的生成时间戳,其结果是一个结构时间戳。
SO_TIMESTAMPNS:
与
SO_TIMESTAMP相同,但将时间戳作为struct返回。
SO_TIMESTAMPING:
此选项支持多种类型的时间戳请求,因此,该套接字选项接受标记的位图,而不是布尔值。此外,此选项在transmission,、接收或上同时生成时间戳,当然,它们支持不同的时间戳资源。
struct timespec represents a simple calendar time, or an elapsed time, with sub-second resolution (nsec resolution).
struct timeval. struct timeval is an older type for representing a simple calendar time, or an elapsed time, with sub-second resolution. It is almost the same as struct timespec, but provides only microsecond resolution.
系统时间代表了计算机系统对时间流逝的概念。取决于上下文,可能是CPU完成操作所花费的时间,或者是我们通常称为real-time的挂钟时间。在这种情况下,这个阿森威尔不一定相同,它将帮助您理解monotonic和system-time之间的区别。
希望以上内容有助于澄清(这也可能有帮助。)!
https://stackoverflow.com/questions/65363515
复制相似问题