引用
- 理解 Linux 网络栈(1):Linux 网络协议栈简单总结
- Checksum in Linux Kernel
- Linux 网络栈剖析
- [转][译]Linux 网络栈监控和调优:发送数据(2017)
- [译] Linux 网络栈监控和调优:接收数据(2016)
- [翻译]Linux网络栈之队列
- linux内核网络协议栈阅读分析注释
- 监控与调试Linux网络栈的建议
- linux 网络栈 全面
- linux tcp中的几个队列
- Linux Tune Network Stack (Buffers Size) To Increase Networking Performance
- Linux TCP队列相关参数的总结
- Linux TCP Performance Tuning
- 25 张图,一万字,拆解 Linux 网络包发送过程
- 图解Linux网络包接收过程
- Linux Kernel TCP/IP Stack|Linux网络硬核系列
- TCP/IP协议栈在Linux内核中的运行时序分析
- linux-network-performance-parameters
一. linux内核协议栈大图
二. 各协议层Flow
2.1 userspace
2.2 Socket
2.3 传输层
2.4 网络层
2.5 NIC driver
- None NAPI
- NAPI
三. skb
3.1 struct sk_buff
Link: struct sk_buff
3.2 struct skb_shared_info
3.3 数据的几种组织方式Frags[]/Frag_list
3.4 skb常用的操作API
function | 描述 |
skb_reserve(struct sk_buff *skb, int len) | 在skb的头和尾预留指定长度的空间 |
skb_put(struct sk_buff *skb, int len) | 在skb的尾部预留指定长度的空间 |
skb_push(struct sk_buff *skb, int len) | 在skb的头部预留指定长度的空间 |
skb_pull(struct sk_buff *skb, int len) | 从skb的头部移走指定长度的数据 |
skb_trim(struct sk_buff *skb, int len) | 从skb的尾部移走指定长度的数据 |
3.5 操作队列的API
skb_queue_head_init | 初始化sk_buff的等待队列,为空队列。 |
skb_dequeue | 从list队列的头部读取一个skb |
skb_dequeue_tail | 从list队列的尾部读取一个skb |
skb_queue_purge | 清空list队列;依次读取并释放。 |
skb_queue_head | 将一个新的skb放入list头部 |
skb_queue_tail | 将一个新的skb放入list尾部 |
skb_unlink | 从指定的list中去掉一个skb |
skb_append | 将skb放入list指定的某个成员后 |
skb_insert | 将skb插入list指定的成员前 |
skb_drop_list | 释放一个list中所有的skb |
skb_queue_walk | 遍历list的每个成员 |
skb_drop_fraglist | 释放分片数据缓冲区和队列 |
3.6 skb的克隆和复制
- 克隆:多个user只操作sk_buff数据结构,不需要对数据包本身做修改。
- 复制:多个user对同一个socket buffer的操作,即要修改sk_buff数据结构,也要修改数据包内容。
- 要同时修改线性区和非线性区: struct sk_buff *skb_copy(struct sk_buff *skb)
- 只修改线性区: struct sk_buff *pskb_copy(struct sk_buff *skb)