linux 2.6版的内核,网络数据从网线到应用程序需经过3次copy,分别是:
1. 网线上的电信号经过网卡驱DMA到网卡的环形FIFO里;
2. 从网卡的接收环形FIFO里copy到TCP/IP协议栈的sk_buff里;
3. 应用程序的socket调用recv()函数从协议栈的buffer里copy到用户进程的buffer里。
sk_buff的重要数据结构
/* These elements must be at the end, see alloc_skb() for details.*/
unsigned inttruesize;
atomic_tusers;
unsigned char*head, /* 整个网络数据包的头部 */
*data, /* 相对于本层的有效数据头部,要么还有协议头,要么还要协议尾 */
*tail, /* 相对于本层的有效数据尾部 */
*end;
/* 整个网络数据包的尾部 */
}
head, data, tail, end这四个指针用得相当精巧,对于协议栈的组包和解包极为方便!
【linux 网卡zero copy 学习总结】
推荐阅读
- 人工智能|干货!人体姿态估计与运动预测
- Python专栏|数据分析的常规流程
- 读书笔记|《白话大数据和机器学习》学习笔记1
- 网络|一文彻底搞懂前端监控
- html5|各行业工资单出炉 IT类连续多年霸占“榜首”位置
- 人工智能|【机器学习】深度盘点(详细介绍 Python 中的 7 种交叉验证方法!)
- 网络|简单聊聊压缩网络
- 数据库|效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)...
- r语言|手把手(R语言文本挖掘和词云可视化实践)
- 腾讯|SaaS的收入模型有哪些(终于有人讲明白了)