Chinaunix首页 | 论坛 | 博客
  • 博客访问: 443666
  • 博文数量: 70
  • 博客积分: 3170
  • 博客等级: 中校
  • 技术积分: 756
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-06 16:47
文章分类

全部博文(70)

文章存档

2011年(22)

2010年(33)

2009年(5)

2008年(10)

分类: LINUX

2010-05-20 10:17:27

16.1.4 sk_buff结构

 2009-12-11 09:42  宋敬彬/孙海滨  清华大学出版社  
  • 摘要:《Linux 网络编程》第16章Linux内核中网络部分结构以及分布,本章介绍Linux内核代码的架构,特别是网络相关的部分,并对结构sk_buff进行了详细 的分析,简单分析了网络数据的流程。还介绍Linux的软中断方式,对网络协议栈中使用的软中断处理报文队列的方式进行了简单介绍。本节为大家介绍 sk_buff结构。
  • 标签:    

16.1.4  sk_buff结构

内核层和用户层在网络方面的差别很大,在内核的网络层中sk_buff结构占有重要的地位,几乎所有的处理均与此结构有关系。网络协议栈是一个层次 架构的软件结构,层与层之间通过预订的接口传递报文。网络报文中包含了在协议各层使用到的各种信息。由于网络报文之间的大小不是固定的,因此采用合适的数 据结构来存储这些网络报文就显得非常重要。

1.结构sk_buff的原型

在Linux的2.6版本的内核中,采用结构sk_buff来存储这些数据。在这个结构中,既有指向网络报文的指针,同时也有描述网络报文的变量。sk_buff数据结构的代码如下所示。

  1. struct sk_buff   
  2. {  
  3. struct sk_buff         *next;  
  4. struct sk_buff         *prev;  
  5. struct sock           *sk;  
  6. ktime_t                 tstamp;  
  7. struct net_device       *dev;  
  8. union   
  9. {  
  10. struct  dst_entry    *dst;  
  11. struct  rtable       *rtable;  
  12. };  
  13. struct  sec_path      *sp;  
  14. char                 cb[48];  
  15. unsigned int          len,  
  16. data_len;  
  17. __u16               mac_len,  
  18. hdr_len;  
  19. union   
  20. {  
  21. __wsum           csum;  
  22. struct  
  23. {  
  24. __u16            csum_start;  
  25. __u16            csum_offset;  
  26. };  
  27. };  
  28. __u32                   priority;  
  29. __u8                     local_df:1,  
  30.                  cloned:1,  
  31. ip_summed:2,  
  32. nohdr:1,  
  33. nfctinfo:3;  
  34. __u8                    pkt_type:3,  
  35. fclone:2,  
  36. ipvs_property:1,  
  37. peeked:1,  
  38. nf_trace:1;  
  39. __be16                  protocol;  
  40. void                    (*destructor)(struct sk_buff *skb);  
  41. struct nf_conntrack     *nfct;  
  42. struct sk_buff          *nfct_reasm;  
  43. struct nf_bridge_info   *nf_bridge;  
  44. int                     iif;  
  45. __u16                   queue_mapping;  
  46. __u16                   tc_index;  
  47. __u16                   tc_verd;  
  48. __u8                    ndisc_nodetype:2;  
  49. dma_cookie_t            dma_cookie;  
  50. __u32                   secmark;  
  51. __u32                   mark;  
  52. sk_buff_data_t          transport_header;  
  53. sk_buff_data_t          network_header;  
  54. sk_buff_data_t          mac_header;  
  55. sk_buff_data_t          tail;  
  56. sk_buff_data_t          end;  
  57. unsigned char           *head,  
  58.                         *data;  
  59. unsigned int            truesize;  
  60. atomic_t                users;  
  61. }; 

sk_buff主要成员的含义如下:

next:sk_buff链表中的下一个缓冲区。

prev:sk_buff链表中的前一个缓冲区。以上两个变量将sk_buff链接到一个双向链表中。

sk:本网络报文所属的sock结构,此值仅在本机发出的报文中有效,从网络收到的报文此值为空。

tstamp:报文收到的时间戳。

dev:收到此报文的网络设备。

transport_header:传输层头部。

network_header:网络层头部。

mac_header:链接层头部。

cb:用于控制缓冲区。每个层都可以使用此指针,将私有的数据放置于此。

len:有效数据长度。

data_len:数据长度。

mac_len:连接层头部长度,对于以太网,指MAC地址所用的长度,为6。

hdr_len:skb的可写头部长度。

csum:校验和(包含开始和偏移)。

csum_start:当开始计算校验和时从skb->head的偏移。

csum_offset:从csum_start开始的偏移。

local_df:允许本地分片。

pkt_type:包的类别。

priority:包队列的优先级。

truesize:报文缓冲区的大小。

head:报文缓冲区的头。

data:数据的头指针。

tail:数据的尾指针。

end:报文缓冲区的尾部。

2.sk_buff的含义

图16.6是结构sk_buff的框图,其中的tail、end、head和data是对网络报文部分的描述。

 
(点击查看大图)图16.6  sk_buff的数据结构

网络报文存储空间是在应用层发送网络数据或者网络设备收到网络数据时动态分配的,分配成功之后,将接收或者发送的网络数据填充到这个存储空间中去。将网络数据填充到存储空间时,在存储空间的头部预留了一定数量的空隙,然后从此偏移量开始将网络报文复制到存储空间中。

结构sk_buff以sk_buff_head构成一个环状的链,如图16.7所示,next变量指向下一个sk_buff结构,prev变量指向前一个sk_buff结构。内核程序通过访问其中的各个单元来遍历整个协议栈中的网络数据。

 
图16.7  sk_buff_head与sk_buff生成的链表
阅读(1167) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~