目录

​第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目标系统架构

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

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

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

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

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

第2章 网络设备驱动架构

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

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

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

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

 

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

2.3 网络驱动的标准接口

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

2.4 网络设备的初始化函数

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

2.5 网络接口的动态配置

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

2.6 数据缓冲器机制

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

2.7 数据发送

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

2.8 数据接收

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

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

3.1 Linux接收包的总体流程

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

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

3.2 硬件物理层的接收

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

(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方案。