sk_buff结构分析.doc

sk_buff结构分析.doc

ID:48445386

大小:191.50 KB

页数:6页

时间:2020-01-30

sk_buff结构分析.doc_第1页
sk_buff结构分析.doc_第2页
sk_buff结构分析.doc_第3页
sk_buff结构分析.doc_第4页
sk_buff结构分析.doc_第5页
资源描述:

《sk_buff结构分析.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、sk_buff结构分析sk_buff是Linux网络代码中最重要的结构体之一。它是Linux在其协议栈里传送的结构体,也就是所谓的“包”,在他里面包含了各层协议的头部,比如ethernet,ip,tcp,udp等等。也有相关的操作等。熟悉他是进一步了解Linux网络协议栈的基础。网络选项以及内核结构我们可以看到在此结构体里有很多预处理,他是在需要指定相应功能时才起作用,我们在这里先对通用的作出分析。布局字段:sk_buff是一个复杂的双向链表,在他结构中有next和prev指针,分别指向链表的下一个节点和前一个节点。并且为了某些需求(不知道是哪些目前)需要

2、很快定位到链表头部,所以还有一个指向链表头部的指针list(我在2.6.25内核没有发现这个指针)。sk_buff_head结构是:structsk_buff_head{/*Thesetwomembersmustbefirst.*/structsk_buff*next;structsk_buff*prev;__u32qlen;//代表元素节点数目spinlock_tlock;//加锁,防止对表的并发访问};structsock*sk这个指针指向一个套接字sock数据结构。当数据在本地产生或者本地进程接受时,需要这个指针;里面的数据会有tcp/udp和用户态

3、程序使用。如果是转发此指针为NULLunsignedintlen缓冲区中数据块大小。长度包括:主要缓冲区(head所指)的数据以及一些片断(fragment)的数据。当包在协议栈向上或向下走时,其大小会变,因为有头部的丢弃和添加。unsignedintdata_len片段中数据大小unsignedintmac_lenmac包头大小atomic_tusers引用计数,使用这个sk_buff的使用者的数目,可能有多个函数要使用同一个sk_buff所以防止提前释放掉,设置此计数unsignedinttruesize此缓冲区总大小,包括sk_buff。sk_buf

4、f只不过是个指针的集合,他所指的才是真正的数据区,所以是两部分。(见下图)sk_buff_data_ttail;sk_buff_data_tend;unsignedchar*head,*data;这些指针很重要,他们指向的是真正的数据区,他们的边界。head和end指向的是数据区的开端和尾端(注意和data,tail区别)如下图,data和tail指向的是实际数据的开头和结尾。因为数据区在协议栈走的时候要一层层添加或去掉一些数据(比如报头)所以申请一块大的足够的内存,然后在往里放东西。真实的实际数据可能用不了这么多,所以用data,tail指向真实的,he

5、ad,tail指向边界。刚开始没填充数据时前三个指针指向的是一个地方。void(*destructor)(…….)此函数指针被初始化一个函数,当此缓冲区删除时,完成某些工作。通用字段structtimevalstamp(2.6.25没有,估计是ktime_ttstamp)时间戳,表示何时被接受或有时表示包预定的传输时间structnet_device*dev描述一个网络设备,我会以后分析他。sk_buff_data_ttransport_header;//L4sk_buff_data_tnetwork_header;//L3sk_buff_data_tma

6、c_header;//L2这些指针分别指向报文头部,和2.4版本比较有了变化,不再是联合体,使用更加方便了,Linux给出了很方便的函数直接定位到各层的头部。下图是2.4版本的,只是说明一下。structdst_entrydst路由子系统使用。目前不知道怎么回事呢。据说比较复杂。charcb[40]缓冲控制区,用来存储私有信息的空间。比如tcp用这个空间存储一个结构体tcp_skb_cb,可以用宏TCP_SKB_CB(__skb)定位到他,然后使用里面的变量。ip_summed:2__wsumcsum;校验和unsignedcharpkt_type根据L2

7、层帧的目的地址进行类型划分。unsignedcharcloned表示该结构是另一个sk_buff克隆的。__u32priority;QoS等级__be16protocol;从L2层设备驱动看使用在下一个较高层的协议。功能专用字段Linux是模块化的,你编译时可以带上特定功能,比如netfilter等,相应的字段才会生效。应该是那些预定义控制的。管理函数下面这个图是:(a*)skb_put;(b*)skb_push;(c*)skb_pull(d*)skb_reserve的使用,主要是对skb_buf所指向的数据区的指针移动。(数据预留以及对齐)下图是用skb

8、_reserve函数,把一个14字节的ethernet帧拷贝到缓冲

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

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

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