[架构之路-45]:目标系统 - 系统软件 - Linux OS硬件设备驱动-网络驱动程序模型网络数据包的收发流程

Posted 文火冰糖的硅基工坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[架构之路-45]:目标系统 - 系统软件 - Linux OS硬件设备驱动-网络驱动程序模型网络数据包的收发流程相关的知识,希望对你有一定的参考价值。

目录

第1章 网络驱动程序模型概述

1.1 Linux目标系统架构

1.2 Linux网络设备驱动的总体框架

第2章 网络设备驱动架构

2.1 网络设备和网络驱动的注册

2.2  网络设备的标准数据结构

2.3 网络驱动的标准接口

2.4 网络设备的初始化函数

2.5 网络接口的动态配置

2.6 数据缓冲器机制

2.7 数据发送

2.8 数据接收

第3章 Linux内核和应用程序处理网络数据包的流程

3.1 Linux接收包的总体流程

3.2 硬件物理层的接收

3.3 MAC层帧的接收(以太网网卡驱动)- 驱动模块中断处理

3.3 TCP/IP协议栈对数据包的处理 - L3 IP数据包处理

3.4 TCP/IP协议栈对数据包的处理 - L4 TCP/UDP数据包处理

3.5 内核socket接口的进一步处理

3.6 应用程序的进一步处理

第4章 传统Linux内核Socket通信的问题


第1章 网络驱动程序模型概述

1.1 Linux目标系统架构

1.2 Linux网络设备驱动的总体框架

(1)网络设备与网络驱动层的分离

(2)网络驱动核心层与网络设备硬件功能层的分离(驱动程序员主要关注网络设备硬件功能层)

第2章 网络设备驱动架构

2.1 网络设备和网络驱动的注册

2.2  网络设备的标准数据结构

 

2.3 网络驱动的标准接口

2.4 网络设备的初始化函数

2.5 网络接口的动态配置

2.6 数据缓冲器机制

2.7 数据发送

2.8 数据接收

第3章 Linux内核和应用程序处理网络数据包的流程

3.1 Linux接收包的总体流程

3.2 硬件物理层的接收

(1)数据包从外面的网络进入物理网卡。

(2)如果目的地址不是该网卡,且该网卡没有开启混杂模式,该包会被网卡丢弃。(混杂模式:一台机器的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它)

(3)如果目的地址是该网卡或混杂模式开启,网卡硬件将数据包通过DMA的方式写入到指定的驱动环形内存地址,即图中所示的RX ring,该地址由网卡驱动分配并初始化。

3.3 MAC层帧的接收(以太网网卡驱动)- 驱动模块中断处理

(1)中断服务程序处理 :top-half interrupt processing

  • 网卡硬件通过硬件中断(IRQ)通知CPU,告诉它有数据来了。这时CPU会中断正在进行的工作从用户态切换到内核态。
  •  CPU根据中断表,调用已经注册的中断服务函数,这个中断服务函数会调到驱动程序(NIC Driver)中相应的函数 
  • 应答当前中断
  • 调度底半部对Ring buffer中以太网帧进行进一步的处理
  • 中断服务程序执行完成,返回用户空间程序调度。

(2)中断后处理:Bottom-half processing

  • 驱动程序的中断后处理程序为数据申请和分配SK-Buff内存
  • 驱动程序的中断后处理程序把数据从驱动的Ring buffer中拷贝到网络协议栈的SK-Buff中。在拷贝的过程中,去掉MAC层的头。
  • 把sk-buff传递一个Linux网络协议栈(TCP/IP协议栈)

3.3 TCP/IP协议栈对数据包的处理 - L3 IP数据包处理

(1)根据IP地址进行路由,检查数据的目的地址是否是自己或仅仅是中转、路由。

(2)IP层的分片与重组。

(3)如果目的IP地址是自身,则提交给L4 TCP/UDP层进一步的处理

3.4 TCP/IP协议栈对数据包的处理 - L4 TCP/UDP数据包处理

(1)如果是TCP包,则处理TCP的状态机。

(2)根据端口号,把数据包转发到每个Soket各自的接收队列中。

(3)通过signal通知监听在socket上的用户空间的应用程序

3.5 内核socket接口的进一步处理

 

(1)把该数据包的地址标识从特定socket的接收队列中移走。

(2)把内核空间的socket队列中的地址标识的SK-buff中的数据拷贝到用户空间的buffer中,用户空间的buffer地址是由用户空间程序告诉socket接口的。

(3)释放sk-buffer

(4)返回到应用程序

3.6 应用程序的进一步处理

(1)应用程序从socket调用返回

(2)应用程度读取用户空间buffer中的数据

(3)应用程度对用户空间buffer中的数据进一步处理。

第4章 传统Linux内核Socket通信的问题

(1)需要通过中断服务程序处理数据,海量数据的中断会影响内核整体的调度效率。

(2)Linux内核网络通信,需要进行多少数据包的拷贝:网卡-》中断服务程序队列-》内核sk buffer -》用户空间。多少的内存拷贝会导致高速网络数据的实时性受到极大的影响。

(3)要经历多次的内存数据拷贝

  • 物理链路 =》 ring buffer : DMA内存拷贝
  • ring buffer =》sk buf:CPU驱动程序内存拷贝
  • sk buf =》socket队列(指针传递):协议栈
  • socket队列(sk-buf) =》用户空间buff:CPU Socket接口内存拷贝

可以优化成:物理链路 =》 用户空间buffer (一次DMA内存拷贝)

(4)每次的内存拷贝,不仅仅增加数据处理的延时,还占用CPU的计算资源,导致整个CPU的有效的计算能力的下降。 

为此,针对高速数据处理、实时性要求高的业务场景,一种称为FastPath的机制应运而生 ,FastPath能够旁路Linux内核的网络协议栈,直接在应用程序和底层的硬件驱动之间建立专用数据处理通道,并尽量减少内存的拷贝。

DPDK就是这样的一种FastPaht方案。

以上是关于[架构之路-45]:目标系统 - 系统软件 - Linux OS硬件设备驱动-网络驱动程序模型网络数据包的收发流程的主要内容,如果未能解决你的问题,请参考以下文章

[架构之路-56]:目标系统 - 平台软件 - 总体架构概述

[架构之路-28]:目标系统 - 系统软件 - Linux OS内核功能架构图解内核构建内核启动流程

[架构之路-25]:目标系统 - 系统软件 - bootloader uboot内存映射与启动流程

[架构之路-21]:目标系统 - 系统软件 - 计算机系统架构计算机指令系统结构化程序与分层编程。

[架构之路-29]:目标系统 - 系统软件 - Linux OS内核以及内核驱动的调试技术

[架构之路-26]:目标系统 - 系统软件 - bootloader uboot使用方法常用命令