Wolai 目录
巨人肩膀:
(一)总览
(二)Linux 收发网络数据的流程
2.1 硬件接收数据流程
顺序 | 涉及部件 | 解释 |
---|---|---|
1 | 外部网络 | 如家庭里的路由器 |
2 | NIC | Network Interface Controller 网卡硬件本身 |
3 | DMA | Direct Memory Access 直接内存访问,从硬件的内存复制到主机的内存 |
4 | RMA,CPU | 主机的内存和计算资源 |
2.2 软件接收数据流程
顺序 | 涉及部件 | 解释 |
---|---|---|
1 | 网卡 | 接收读取外面的数据 |
2 | Ring Buffer 队列 | Linux内存 、 FIFO队列,不存包数据,指向存数据的位置 |
3 | Socket Buffer 区域 | Linux内存、实际存储包数据的地方(数据链路层→传输层) |
4 | 上层协议栈 | 用户层 |
5 | 用户空间 | 软件实际处理的地方 |
2.3 接收数据包的大致流程
-
CPU 在主内存接收环
RX Ring
中分配packet buffers
并建立描述符
-
CPU 告诉 NIC 有一个新的
描述符
(写入到寄存器中) -
DMA从主内存中取
描述符
-
网络包
到达NIC中 -
DMA将接收到的
网络包
写到主内存中的RX Ring
-
NIC发起硬件中断到CPU中
-
CPU上半部分中断处理硬件中断(例如复制数据包)
-
CPU 下半部分软中断
-
CPU 经过调度,
SoftIRQ
→Poll
→Protocool
2.4 软件发送数据流程
顺序 | 涉及部件 | 解释 |
---|---|---|
1 | User Space | 生成数据的地方 |
2 | Queueing Discipline | 队列规则,为了网络流量控制 |
3 | Ring Buffer | Linux内存,FIFO队列,指向存数据的位置 |
4 | Socket Buffer | Linux内存,实际存储数据的地方 |
2.5 sk_buff解析
-
全称:
socket Buffer
-
定义:
include/linux/skbuff.h
-
特点:逐层解析