对于传入的TCP段,我想测量TCP段可用于内核(来自NIC的驱动程序)的时刻与同一段通过用户级应用程序可用的时刻之间的时间间隔socket api(在通过TCP堆栈之后)。
为了简化问题,我通过TCP发送不频繁的数据包并且网络相当稳定,因此您可以假设TCP段与我发送的逻辑应用程序级数据包/消息之间存在1对1的映射。
内核级别时间戳:
为了在段到达时获得第一个内核级时间戳,我使用了netfilter的NF_INET_PRE_ROUTING挂钩,并从skbuff读取时间戳,这部分似乎工作正常。
用户级时间戳:
然而,当从插座读取消息(相应的缓冲区)时,我很难获得精确的时刻测量。问题是用户级应用程序调用{{1}}的时间与缓冲区可用的时间不严格相关。例如,如果系统处于负载状态,则应用程序的连续读取调用之间的间隔将增加。因此,当我读取缓冲区并对其进行时间戳(在应用程序级别)时,此时间将不对应于该缓冲区实际准备好被读取的时间。
因此,有没有办法可以获得TCP堆栈处理段时的精确时间戳?也许我可以使用其他一些内核挂钩?
谢谢!