Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — SKB
目录
文章目录
- 目录
- 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 接口读出来。流程图如下所示:
- NIC Controller 接收到数据后,DMA 搜索 Rx BD Table,取出空闲的 BD,并将数据自动保存到该 BD 的缓存中,修改 BD 为就绪态,并同时触发中断(该步骤可选)。
- CPU 可以通过中断或者轮询的方式检查接收 BD Table 的状态,无论采用哪种方式,它们都需要实现以下步骤。
- 从接收 BD Table 中取出一个空闲的 BD。
- 如果当前 BD 为就绪态,检查当前 BD 的数据状态,更新数据接收统计。
- 从 BD 中取出数据保存在 sk_buff 的缓冲区中。
- 更新 BD 的状态为空闲态。
- 移动接收 BD 表的指针指向下一个 BD。
- 用户调用 read 之类的读函数,从 sk_buff 缓冲区中读出数据,同时释放该缓冲区。
发包
User Space Application 可以通过 System Call API 访问 BSD Socket 层,传递给 BSD Socket 层的 Data Message 首先会保存在 sk_buff 缓冲区中。
当数据被储存到了 sk_buff 缓存区中,NIC Controller 的发送函数 hard_start_xmit 也随之被调用,流程图如下所示:
- 首先创建一个 Socket,然后调用 write() 之类的写函数通过 Socket 访问 NIC Controller,同时将数据保存在 sk_buff 缓冲区。
- Socket 调用发送函数 hard_start_xmit()。hard_start_xmit() 在初始化过程中会被挂接成类似于 xx_tx() 的某个具体的发送函数,xx_tx() 主要实现如下步骤:
- 从 Tx BD 表中取出一个空闲的 BD。
- 根据 sk_buff 中保存的数据修改 BD 的属性,一个是数据长度,另一个是数据报文缓存指针。值得注意的是,数据报文缓存指针对应的必须是物理地址,这是因为 DMA 在获取 BD 中对应的数据时只能识别物理地址。
- 修改该 BD 的状态为就绪态,DMA 模块将自动发送处于就绪态 BD 中所对应的数据。
- 移动发送 BD 表的指针指向下一个 BD。
- DMA 开始将处于就绪态 BD 缓存内的数据发送至网络,当发送完成后自动恢复该 BD 为空闲态。
Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — SKB相关推荐
- Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — Buffer descriptor table
目录 文章目录 目录 DMA 与 Buffer descriptor DMA 与 Buffer descriptor NIC Controller 会在 RAM 中建立并为例两个环形队列,称为 BD ...
- Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller
目录 文章目录 目录 输入输出系统 设备控制器 设备控制器的作用 设备适配器的接口类型 设备适配器的基本功能 设备控制器的组成 外设的编址方式 外设数据传输控制方式 程序直接控制方式 程序中断控制方式 ...
- Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — NAPI
目录 文章目录 目录 NAPI 中断方式与轮询方式 NAPI 值得注意的是,传统收包方式是每个报文都会触发中断,如果中断太频繁,CPU 就总是处理中断,其他任务无法得到调度,于是 NAPI(New A ...
- 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 ...
- Linux Kernel TCP/IP Stack — L1 Layer — 多队列网卡
目录 文章目录 目录 多队列网卡 Intel 82575 的多队列硬件实现 Intel 82575 的多队列软件驱动实现 多队列网卡识别 多队列网卡 多队列网卡,是一种用来解决网络 I/O QoS 问 ...
- Linux Kernel TCP/IP Stack — L1 Layer — tcpdump 抓包
目录 文章目录 目录 tcpdump CLI 关键字 常用指令选项 常规操作示例 查看哪些接口可用于捕获 过滤主机 过滤端口 过滤网络(网段) 过滤协议 复杂的逻辑表达式过滤条件 检查数据包内容 输出 ...
- Linux Kernel TCP/IP Stack — L1 Layer — Network Interface
目录 文章目录 目录 Linux 的网络设备接口 Linux 的虚拟网络设备接口 Linux 的网络设备接口 Network Interface(网络接口)通常是一个硬件设备,也可能是纯软件实现的,例 ...
- Linux Kernel TCP/IP Stack — L1 Layer — Physical NIC
目录 文章目录 目录 网卡与网卡适配器 网卡的组成 网卡的工作原理 基于 DMA 的 NIC I/O 模型 网卡与网卡适配器 我们知道计算机的输入输出系统由外部硬件设备(e.g. 网卡)及其与主机之间 ...
- Linux Kernel TCP/IP Stack — L1 Layer
目录 文章目录 目录 Hardware Driver Layer Hardware Driver Layer 提供以下功能: 网络设备管理. 支持各种网卡驱动实现. RPS.RFS.XPS.GRO.G ...
最新文章
- python无法打开excle_无法打开Excel fi
- python 为什么没有重载_python是否支持重载
- android 动画 返回,Android TranslateAnimation在动画后重置
- SGU 160.Magic Multiplying Machine
- python期末考试重点_如何应付大学的python考试而不至于挂科?
- 建立任务程序直接执行网页(.net)
- 元组的相关操作,定义,查找,修改
- jmstudio 摄像头获取不到_什么是全景摄像头?
- 如何判断 DataRow 中是否存在某列????
- Window下本地redis的安装、配置以及java版试用
- reset.css下载
- adsl密码查看器,宽带密码查看器,无广告,绿色版
- 【HUST】公选抢课|用Auto.js模拟蹲课过程
- c语言输出菱形for循环_使用c语言输出菱形
- eyoucms如何搬家?易优cms搬家教程
- 基于深度学习的RGBD深度图补全算法文章鉴赏
- matlab中三角函数sin、cos、tan以弧度为单位
- 【Kubernetes】K8s集群operator模式安装minio
- IAR环境 HandFault定位
- HBase建表的基本命令
热门文章
- Xamarin.Forms中为WebView指定数据来源Source
- Xamarin iOS编写第一个应用程序创建工程
- ARP协议全面实战手册——Wireshark的安装第一更
- mfc edit 超出行数时出现滚动条_千金难买“老鸭头”,是A股唯一可以获利200%的战法,一旦出现,不要犹豫满仓干,后市必定爆涨...
- 从python开始学编程vamei_从python开始学编程-vamei(1)
- 一种通过scout ESI和CNN解码EEG运动想象四分类任务的新方法
- 虚幻UE4中如何采集360度全景图片和VR视频
- java 静态类 安全_Java静态static工具类线程安全问题研究
- 韦布望远镜现在到哪儿了:距离地球60万公里,NASA还说可以用10年
- 今晚19:30直播 | 这些国家为何今年扎堆去火星?航天专家庞之浩揭秘