目录

文章目录

  • 目录
  • sk_buff(SKB,Socket Buffer)
    • 收包
    • 发包

sk_buff(SKB,Socket Buffer)

Linux 内核中,用 sk_buff 来描述一个数据缓存空间。所谓分配缓存空间,就是建立一定数量的 sk_buff 实例。

sk_buff 是 Linux 内核网络协议栈实现中最重要的 Struct(结构体),定义在 include/linux/skbuff.h 文件中,它是数据报文在 Kernel 中的代码表现形式。

sk_buff 的结构它保存数据报文的结构为一个双向链表,如下所示:

收包

当 NIC 接收到数据帧时,DMA 会自动将数据写入 RAM 并通知 CPU 处理,CPU 通过中断或轮询的方式发现有数据帧接收进来后,再将数据帧保存到 sk_buff 缓冲区中,并通过 Socket 接口读出来。流程图如下所示:

  1. NIC Controller 接收到数据后,DMA 搜索 Rx BD Table,取出空闲的 BD,并将数据自动保存到该 BD 的缓存中,修改 BD 为就绪态,并同时触发中断(该步骤可选)。
  2. CPU 可以通过中断或者轮询的方式检查接收 BD Table 的状态,无论采用哪种方式,它们都需要实现以下步骤。
    1. 从接收 BD Table 中取出一个空闲的 BD。
    2. 如果当前 BD 为就绪态,检查当前 BD 的数据状态,更新数据接收统计。
    3. 从 BD 中取出数据保存在 sk_buff 的缓冲区中。
    4. 更新 BD 的状态为空闲态。
    5. 移动接收 BD 表的指针指向下一个 BD。
  3. 用户调用 read 之类的读函数,从 sk_buff 缓冲区中读出数据,同时释放该缓冲区。

发包

User Space Application 可以通过 System Call API 访问 BSD Socket 层,传递给 BSD Socket 层的 Data Message 首先会保存在 sk_buff 缓冲区中。

当数据被储存到了 sk_buff 缓存区中,NIC Controller 的发送函数 hard_start_xmit 也随之被调用,流程图如下所示:

  1. 首先创建一个 Socket,然后调用 write() 之类的写函数通过 Socket 访问 NIC Controller,同时将数据保存在 sk_buff 缓冲区。
  2. Socket 调用发送函数 hard_start_xmit()。hard_start_xmit() 在初始化过程中会被挂接成类似于 xx_tx() 的某个具体的发送函数,xx_tx() 主要实现如下步骤:
    1. 从 Tx BD 表中取出一个空闲的 BD。
    2. 根据 sk_buff 中保存的数据修改 BD 的属性,一个是数据长度,另一个是数据报文缓存指针。值得注意的是,数据报文缓存指针对应的必须是物理地址,这是因为 DMA 在获取 BD 中对应的数据时只能识别物理地址。
    3. 修改该 BD 的状态为就绪态,DMA 模块将自动发送处于就绪态 BD 中所对应的数据。
    4. 移动发送 BD 表的指针指向下一个 BD。
  3. DMA 开始将处于就绪态 BD 缓存内的数据发送至网络,当发送完成后自动恢复该 BD 为空闲态。

Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — SKB相关推荐

  1. Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — Buffer descriptor table

    目录 文章目录 目录 DMA 与 Buffer descriptor DMA 与 Buffer descriptor NIC Controller 会在 RAM 中建立并为例两个环形队列,称为 BD ...

  2. Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller

    目录 文章目录 目录 输入输出系统 设备控制器 设备控制器的作用 设备适配器的接口类型 设备适配器的基本功能 设备控制器的组成 外设的编址方式 外设数据传输控制方式 程序直接控制方式 程序中断控制方式 ...

  3. Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — NAPI

    目录 文章目录 目录 NAPI 中断方式与轮询方式 NAPI 值得注意的是,传统收包方式是每个报文都会触发中断,如果中断太频繁,CPU 就总是处理中断,其他任务无法得到调度,于是 NAPI(New A ...

  4. Linux Kernel TCP/IP Stack — L1 Layer — NIC bonding

    目录 文章目录 目录 NIC bonding mode=0(balance-rr,RR 负载均衡策略) mode=1(active-backup,主备策略) mode=2(balance-xor,XO ...

  5. Linux Kernel TCP/IP Stack — L1 Layer — 多队列网卡

    目录 文章目录 目录 多队列网卡 Intel 82575 的多队列硬件实现 Intel 82575 的多队列软件驱动实现 多队列网卡识别 多队列网卡 多队列网卡,是一种用来解决网络 I/O QoS 问 ...

  6. Linux Kernel TCP/IP Stack — L1 Layer — tcpdump 抓包

    目录 文章目录 目录 tcpdump CLI 关键字 常用指令选项 常规操作示例 查看哪些接口可用于捕获 过滤主机 过滤端口 过滤网络(网段) 过滤协议 复杂的逻辑表达式过滤条件 检查数据包内容 输出 ...

  7. Linux Kernel TCP/IP Stack — L1 Layer — Network Interface

    目录 文章目录 目录 Linux 的网络设备接口 Linux 的虚拟网络设备接口 Linux 的网络设备接口 Network Interface(网络接口)通常是一个硬件设备,也可能是纯软件实现的,例 ...

  8. Linux Kernel TCP/IP Stack — L1 Layer — Physical NIC

    目录 文章目录 目录 网卡与网卡适配器 网卡的组成 网卡的工作原理 基于 DMA 的 NIC I/O 模型 网卡与网卡适配器 我们知道计算机的输入输出系统由外部硬件设备(e.g. 网卡)及其与主机之间 ...

  9. Linux Kernel TCP/IP Stack — L1 Layer

    目录 文章目录 目录 Hardware Driver Layer Hardware Driver Layer 提供以下功能: 网络设备管理. 支持各种网卡驱动实现. RPS.RFS.XPS.GRO.G ...

最新文章

  1. python无法打开excle_无法打开Excel fi
  2. python 为什么没有重载_python是否支持重载
  3. android 动画 返回,Android TranslateAnimation在动画后重置
  4. SGU 160.Magic Multiplying Machine
  5. python期末考试重点_如何应付大学的python考试而不至于挂科?
  6. 建立任务程序直接执行网页(.net)
  7. 元组的相关操作,定义,查找,修改
  8. jmstudio 摄像头获取不到_什么是全景摄像头?
  9. 如何判断 DataRow 中是否存在某列????
  10. Window下本地redis的安装、配置以及java版试用
  11. reset.css下载
  12. adsl密码查看器,宽带密码查看器,无广告,绿色版
  13. 【HUST】公选抢课|用Auto.js模拟蹲课过程
  14. c语言输出菱形for循环_使用c语言输出菱形
  15. eyoucms如何搬家?易优cms搬家教程
  16. 基于深度学习的RGBD深度图补全算法文章鉴赏
  17. matlab中三角函数sin、cos、tan以弧度为单位
  18. 【Kubernetes】K8s集群operator模式安装minio
  19. IAR环境 HandFault定位
  20. HBase建表的基本命令

热门文章

  1. Xamarin.Forms中为WebView指定数据来源Source
  2. Xamarin iOS编写第一个应用程序创建工程
  3. ARP协议全面实战手册——Wireshark的安装第一更
  4. mfc edit 超出行数时出现滚动条_千金难买“老鸭头”,是A股唯一可以获利200%的战法,一旦出现,不要犹豫满仓干,后市必定爆涨...
  5. 从python开始学编程vamei_从python开始学编程-vamei(1)
  6. 一种通过scout ESI和CNN解码EEG运动想象四分类任务的新方法
  7. 虚幻UE4中如何采集360度全景图片和VR视频
  8. java 静态类 安全_Java静态static工具类线程安全问题研究
  9. 韦布望远镜现在到哪儿了:距离地球60万公里,NASA还说可以用10年
  10. 今晚19:30直播 | 这些国家为何今年扎堆去火星?航天专家庞之浩揭秘