SK_BUFF学习笔记

SK_BUFF学习笔记

ID:40569911

大小:124.50 KB

页数:16页

时间:2019-08-04

SK_BUFF学习笔记_第1页
SK_BUFF学习笔记_第2页
SK_BUFF学习笔记_第3页
SK_BUFF学习笔记_第4页
SK_BUFF学习笔记_第5页
资源描述:

《SK_BUFF学习笔记》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、在这几天的工作中总是或多或少的接触到了sk_buff结构体。后来我觉得这样时不时地学点sk_buff结构还不如干脆花段时间来研究下这个重要的结构体。所以我就学习了《深入理解linux网络技术内幕》有关sk_buff结构的介绍,这系列博文本来是我根据《深入理解linux网络技术内幕》学习整理而来的,可以算作是笔记吧。后来在看sk_buff克隆和拷贝时,又看了下《linux内核源码剖析:TCP/IP实现》。现在这博文是经过修改的,所以也加进了在《llinux内核源码剖析:TCP/IP实现》学习到的内容。大

2、家也可以看看原文对sk_buff结构体的一些讲解,原文分别在第二章关键数据结构:套接字缓冲区:sk_buff结构和第三章:套接字缓存。如果没有电子书的,可以私信我留下邮箱地址。    我要先感谢下这两本书的作者以及译者,《深入理解linux网络技术内幕》是linux网络中的一本经典之作,对于学习linux网络来说是非常有用的,这是本全面宏观的介绍linux网络的书;《linux内核源码剖析:TCP/IP实现》我开始看的是电子书,这本书吸引我的地方是讲解的非常详细,而且是非常简洁,尤其是对各个知识点的讲

3、解非常透彻。    下面开始正式的讲解sk_buff结构内容,至于sk_buff结构体的重要性以及历史背景之类的我就不过多废话了。sk_buff结构体:    第一、内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体,而是通过增加协议头和移动指针来操作的。如果是从L4传输到L2,则是通过往sk_buff结构体中增加该层协议头来操作;如果是从L4到L2,则是通过移动sk_buff结构体中的data指针来实现,不会删除各层协议头。这样做是为了提高CPU的工作效率。    第二、sk

4、_buff结构体中有很多条件编译,比如:    #ifdefCONFIG_BRIDGE_NETFILTER   structnf_bridge_info*nf_bridge;    #endif    因为sk_buff结构体是linux网络代码中最重要的数据结构,是整个网络传输载体。所以sk_buff结构体里面有很多关于其他功能的成员字段,比如:防火墙,子路由系统,多播等。这些字段并不是一定有的,只有在满足特点条件才有的。所以可以在需要的时候再去关心这些成员字段,现在我们只来讲解下一般的成员字段。 

5、   第三、下面就直接来看sk_buff结构体了。为了好理解结构中的一些成员字段,先把后面要讲的内容提前说下。sk_buff结构体关联多个其他结构体,第一是数据区:由sk_buff中head和end指向的数据块,用来存储sk_buff结构的数据也即是存储数据包的内容和各层协议头。第二是分片结构:用来表示IP分片的一个结构体,实则上是和sk_buff结构的数据区相连的,即是end指针的下一个字节开始就是分片结构。也正是此原因,所以分片结构和sk_buff数据区内存分配及销毁时都是一起的。第三个是分片结构

6、指向的数据区,即是IP分片内容。下面开始看sk_buff结构体:structsk_buff{ /*Thesetwomembersmustbefirst.*/ structsk_buff*next;//因为sk_buff结构体是双链表,所以有前驱后继。这是个指向后面的sk_buff结构体指针 structsk_buff*prev;//这是指向前一个sk_buff结构体指针 //老版本(2.6以前)应该还有个字段:sk_buff_head*list//即每个sk_buff结构都有个指针指向头节点 stru

7、ctsock*sk;//指向拥有此缓冲的套接字sock结构体,即:宿主传输控制模块 ktime_ttstamp;//时间戳,表示这个skb的接收到的时间,一般是在包从驱动中往二层发送的接口函数中设置 structnet_device*dev;//表示一个网络设备,当skb为输出/输入时,dev表示要输出/输入到的设备 unsignedlong_skb_dst;//主要用于路由子系统,保存路由有关的东西 charcb[48];//保存每层的控制信息,每一层的私有信息 unsignedintlen,//表

8、示数据区的长度(tail-data)与分片结构体数据区的长度之和。其实这个len中数据区长度是个有效长度, //因为不删除协议头,所以只计算有效协议头和包内容。如:当在L3时,不会计算L2的协议头长度。 data_len;//只表示分片结构体数据区的长度,所以len=(tail-data)+data_len; __u16mac_len,//mac报头的长度 hdr_len;//用于clone时,表示clone的skb的头长度 //接下来是校验相关域,这里

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。