Linux - 网络子系统 - Overall

引用


一. 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数据结构,也要修改数据包内容。
  1. 要同时修改线性区和非线性区: struct sk_buff *skb_copy(struct sk_buff *skb)
  2. 只修改线性区: struct sk_buff *pskb_copy(struct sk_buff *skb)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值