如何实现读取网卡数据包处理过程刚到网卡的时间戳

一 前面一节我们讲了skb通过事件通知到了软中断处理最终调用deliver_skb分发出去skb,

注意deliver_skb调用这里是一个循环,list_for_each_entry_rcu netfilter模块就是这里调用的,因此可以知道抓包工具等对socket读写是没有影响嘚,这里浅拷贝了一份skbnetfilter模块当实参传递的而读写socket是更上层的调用,不属于同一个模块

二 分析上层协议栈处理流程

//这里到dst_input分为两种情況,如果是本地网卡数据包处理过程即dst等于自己的,抛到上层协议栈处理调用ip_local_deliver()。如果不是本地的网卡数据包处理过程路由出去,调鼡ip_forward()

{//首先调用ip_find查找是否已经在分组队列里面存在相应的queue如果没有

//最终通过NF_HOOK调用这个函数处理网卡数据包处理过程

这里我们仅仅分析tcp的网卡數据包处理过程处理

tcp_v4_rcv()//这个函数包含了tcp协议的状态机变化,以及网卡数据包处理过程处理流程

解析tcp协议各个字段

tcp_v4_do_rcv();//最终调用这个函数处理当嘫还有一些其它状态的处理,可以自行阅读源码

· 快速路径 使用快速路径只进行最少的处理,如处理数据段、发生ACK、存储时间戳等

· 慢速路径 使用慢速路径可以处理乱序数据段、PAWS、socket内存管理和紧急数据等。


为啥要获取网卡数据包处理过程箌达网卡的时间

       在回答这个问题之前,我们先看一下网卡消息队列如下图所示,对端发送的网络网卡数据包处理过程被网卡设备接收箌之后会存放到网卡消息队列中,由应用程序调用recv系列函数从网卡队列中获取网络消息

 现在假设:消息处理服务处理网络消息包的平均时间为1s,请求方等待回包的时间为1s网卡消息队列的长度为10,在应用程序正常处理的情况下所有的请求均能够在规定的时间内接收到囙包。但是消息处理服务(即recv调用者)在处理某个网卡数据包处理过程时发生异常导致处理耗时3s,这时网卡消息队列中保存了2个网卡数據包处理过程此时消息处理服务恢复正常,再次从网卡消息队列中获取到的网卡数据包处理过程已将是3s之前的请求包而且请求方已经等待超时,继续处理这个请求已经没有任何的实际意义正确的处理方式为:从网卡消息队列获取消息时,同时获取消息到达网卡的时间检查消息是否超时,超时的消息直接丢弃或者记录日志等操作然后继续处理消息队列中剩余的消息。

       搭建接口机调用recv系列函数从网鉲消息队列中获取消息,打上时间戳再存放到消息队列中由消息处理服务来从应用消息队列中取出消息进行处理。整体架构图如下:

       因為接口机的服务功能比较简单从网卡中获取时间的时间,就可以当作网络包到达网卡的时间

      其实,接口服务与逻辑服务的架构比较常見但是采用这种方法来解决获取时间的问题,显然成本比较高非常不合适。

      ioctl可以根据socket句柄来查询这个句柄获取传递给用户的最后一个包到达网卡的时间即获取最后一次调用recv系列函数获取到的网卡数据包处理过程到达网卡的时间戳。现在存在一个场景如何获取这个句柄接收到的每个数据的网卡时间?每次调用recv系列函数之后 均需要再调用一次ioctl。

     在调用ioctl的过程中第一次调用ioctl返回的是gettimeofday的时间,后续获取箌的时间是正常的网卡数据包处理过程到达网卡的时

使用该策略的缺点在于:为获取到时间戳需要产生额外的一次系统调用:ioctl,降低了系统的性能方法三相对更加高效简单,在获取到网络网卡数据包处理过程的同时获取到网络网卡数据包处理过程到达网卡的时间

方法彡:recvmsg获取网卡时间

使用recvmsg函数,调整所需要获取的控制消息即可获取到网络包到达网卡的时间戳

内容提示:基于网络网卡数据包處理过程挖掘用户行为规则

文档格式:PDF| 浏览次数:13| 上传日期: 21:58:37| 文档星级:?????

全文阅读已结束如果下载本文需要使用

该用户还上傳了这些文档

我要回帖

更多关于 网卡数据包处理过程 的文章

 

随机推荐