Linux内核skb处理流程图,用户态到内核态的数据报文处理方法与流程

20535bcf1f751b109491620725f54009.gif

本发明涉及报文处理技术领域,特别涉及一种用户态到内核态的数据报文处理方法。

背景技术:

主机在收发和处理网络报文时,通常采用两种方式:一种是由内核加载网卡驱动,进行报文收发,通过数据拷贝送到用户态进程进行业务处理;另一种是由用户态加载网卡驱动,进行报文收发,对于需要转发到内核处理的主机报文,通过socket创建特殊套接字或通过proc文件系统创建文件实现与内核的数据交互。第一种方式的缺点在于:内核加载网卡驱动进行报文收发,在万兆网卡大流量的冲击下会引发大量中断,消耗一定的CPU性能(特别是X86体系架构),同时Linux操作系统的内核态到用户态的数据拷贝也会造成系统性能的损耗;第二种方式的缺点在于:用户态加载网卡驱动进行报文收发,虽然降低了性能损耗,但是针对一些主机报文业务处理(例如Linux内核的PPPoE、DHCP等)需要感知实际物理网络及网络接口状态,而内核没有网络接口可感知操作,此时就会出现问题,同时还涉及用户态报文PKB与内核SKB格式转换问题。

技术实现要素:

(一)所要解决的技术问题本发明的目的在于提供一种用户态到内核态的数据报文处理方法,以降低网卡驱动加载造成的性能损耗,同时使内核态能够感知实际物理网络及网络接口状态。(二)技术方案为了解决上述技术问题,本发明提出了一种用户态到内核态的数据报文处理方法,所述方法包括以下步骤:S1、通过TUN/TAP驱动的方式在内核态创建虚拟网卡;S2、在用户态进行网卡驱动加载,并将用户态的网络接口信息发送给所述虚拟网卡;S3、所述虚拟网卡根据用户态的网络接口信息创建虚拟接口,所述虚拟接口的数量及状态与用户态的网络接口保持一致;S4、当接收到需要内核态处理的报文时,用户态的网络接口将所述需要内核态处理的报文发送给所述虚拟网卡,所述虚拟网卡将所述需要内核态处理的报文发送给内核态进行处理。可选的,步骤S4之后还包括步骤:S5、内核态将处理后得到的待发送报文发送给所述虚拟网卡,所述虚拟网卡将所述待发送报文发送给用户态的网络接口进行发送。可选的,步骤S3进一步包括:在所述虚拟接口中挂载所述虚拟网卡的报文处理函数。可选的,步骤S4具体包括:当接收到需要内核态处理的报文时,用户态的网络接口将所述需要内核态处理的报文发送给所述虚拟网卡,所述虚拟网卡查找出所述需要内核态处理的报文对应的虚拟接口,并调用该虚拟接口中挂载的所述虚拟网卡的报文处理函数,所述虚拟网卡的报文处理函数将所述需要内核态处理的报文发送给内核态进行处理。可选的,步骤S4之前还包括步骤:S0、在用户态创建报文链表A和报文链表B,其中,报文链表A用于对所述需要内核态处理的报文进行缓存,报文链表B用于对所述待发送报文进行缓存。可选的,步骤S4具体包括:S401、当接收到需要内核态处理的报文时,用户态的网络接口将所述需要内核态处理的报文放入报文链表A;S402、所述虚拟网卡从报文链表A中提取所述需要内核态处理的报文并将其发送给内核态进行处理。可选的,步骤S5具体包括:S501、内核态将处理后得到的待发送报文发送给所述虚拟网卡,所述虚拟网卡将所述待发送报文放入报文链表B;S502、用户态的网络接口从报文链表B中提取所述待发送报文并将其进行发送。可选的,步骤S402中,所述虚拟网卡通过write函数从报文链表A中提取所述需要内核态处理的报文。可选的,步骤S501中,所述虚拟网卡通过read函数将所述待发送报文放入报文链表B。可选的,步骤S1具体包括:调用open函数以设备文件的形式在内核态创建虚拟网卡,并为所述虚拟网卡配置默认IP和路由。(三)有益效果与现有技术相比,本发明的技术方案具有如下优点:本发明的技术方案实现了网卡驱动加载及收发报文在用户态进行,消除了内核态网卡驱动中断及数据拷贝造成的性能损耗;同时,注册维护的一套网络接口和一套虚拟接口,可分别满足用户态、内核态对物理网络及网络接口状态的感知需求,且无需考虑用户态报文PKB与内核态SKB格式转换的问题。附图说明图1是本发明提出的用户态到内核态的数据报文处理方法的基本流程图。图2是本发明一种具体实施方式中虚拟网卡的功能示意图。图3是本发明一种具体实施方式中用户态与内核态的数据交互过程示意图。具体实施方式下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。本发明提出了一种用户态到内核态的数据报文处理方法,如图1所示,所述方法包括以下步骤:S1、通过TUN/TAP驱动的方式在内核态创建虚拟网卡;S2、在用户态进行网卡驱动加载,并将用户态的网络接口信息发送给所述虚拟网卡;S3、所述虚拟网卡根据用户态的网络接口信息创建虚拟接口,所述虚拟接口的数量及状态与用户态的网络接口保持一致;S4、当接收到需要内核态处理的报文时,用户态的网络接口将所述需要内核态处理的报文发送给所述虚拟网卡,所述虚拟网卡将所述需要内核态处理的报文发送给内核态进行处理。步骤S4之后还包括步骤:S5、内核态将处理后得到的待发送报文发送给所述虚拟网卡,所述虚拟网卡将所述待发送报文发送给用户态的网络接口进行发送。优选的,步骤S3进一步包括:在所述虚拟接口中挂载所述虚拟网卡的报文处理函数。优选的,步骤S4具体包括:当接收到需要内核态处理的报文时,用户态的网络接口将所述需要内核态处理的报文发送给所述虚拟网卡,所述虚拟网卡查找出所述需要内核态处理的报文对应的虚拟接口,并调用该虚拟接口中挂载的所述虚拟网卡的报文处理函数,所述虚拟网卡的报文处理函数将所述需要内核态处理的报文发送给内核态进行处理。优选的,步骤S4之前还包括步骤:S0、在用户态创建报文链表A和报文链表B,其中,报文链表A用于对所述需要内核态处理的报文进行缓存,报文链表B用于对所述待发送报文进行缓存。优选的,步骤S4具体包括:S401、当接收到需要内核态处理的报文时,用户态的网络接口将所述需要内核态处理的报文放入报文链表A;S402、所述虚拟网卡从报文链表A中提取所述需要内核态处理的报文并将其发送给内核态进行处理。优选的,步骤S5具体包括:S501、内核态将处理后得到的待发送报文发送给所述虚拟网卡,所述虚拟网卡将所述待发送报文放入报文链表B;S502、用户态的网络接口从报文链表B中提取所述待发送报文并将其进行发送。在本发明的技术方案中,网卡驱动加载及收发报文部署在用户态,由用户态维护独立的网络接口。对于需要内核处理的主机报文,使用设备文件的方式,通过TUN/TAP驱动实现用户态与内核态的数据交互。在内核初始化时配置TUN/TAP虚拟网卡可用,同时注册一套虚拟接口,虚拟接口的个数及状态与用户态网络接口保持一致,且每个虚拟接口中均挂载TUN/TAP虚拟网卡的报文处理函数。如图2所示,这里的虚拟网卡Tun0相当于一个连接用户态和内核态的通道。如图3所示,首先调用open函数以设备文件的形式在内核态创建虚拟网卡Tun0,并为其配置默认IP、route。同时,在用户态创建kernel_to_user_queue和user_to_kernel_queue两个报文链表,两个报文链表与实际物理网卡的收发队列相对应。对于物理网卡收到的需要内核处理的报文,首先将该报文入队user_to_kernel_queue,然后出队通过write函数写入虚拟网卡Tun0,并通过虚拟网卡Tun0将该报文交由内核处理;对于内核处理完成转给用户态的待发送报文,通过read函数从虚拟网卡Tun0读出入队kernel_to_user_queue,然后出队通过物理网卡队列发出。需要说明的是,以上入队、出队操作不一定同时发生,报文链表起缓冲作用,从而能够提高报文处理的效率。综上,本发明公开了一种用户态到内核态的数据报文处理拓扑结构及方法,网卡在用户态接收数据报文,对于需要内核态处理的数据报文,通过虚拟网卡与内核态实现数据交互,同时在内核态创建一套虚拟接口,满足内核态一些业务模块对物理接口状态的感知与操作需求。以上所述仅是本发明的优选实施方式,应当指出,对于本领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和替换,这些改进和替换也应视为本发明的保护范围。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核中,skb是指socket buffer,它是用来在不同层级之间传递数据数据结构。skb内核中的使用非常广泛,它可以包含不同协议层的报文,例如ARP、IP等。[1] 对于skb处理内核使用child结构体变量来指向第二个sk_buff结构体的内存地址。在代码中,可以通过(child + 1)来获取引用计数器的开始地址,进而对skb进行操作。 当需要释放skb时,内核使用kfree_skb()函数进行释放。该函数首先判断skb是否为空,如果为空则直接返回。然后,通过判断引用计数器的值,决定是否继续释放skb。如果引用计数器的值为1,表示只有当前正在使用的引用,那么就可以进行释放。否则,如果引用计数器的值不为1,则返回。释放skb的具体实现是通过调用__kfree_skb()函数来完成的。 在__kfree_skb()函数中,首先调用skb_release_all()函数释放skb的头部状,然后再调用skb_release_data()函数释放skb数据部分。 总结来说,在Linux内核中,skb是用于在不同层级之间传递数据数据结构,对于skb处理包括分配、释放等操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ipv4_linux内核skb处理流程图_](https://download.csdn.net/download/weixin_42666036/25945917)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [linux 内核网络 sk_buff 之申请和释放 Ⅲ](https://blog.csdn.net/wangquan1992/article/details/112603882)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [sk_buff封装和解封装网络数据包的过程详解](https://blog.csdn.net/weixin_33911824/article/details/89867585)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值