16.1.4 sk_buff结构

16.1.4  sk_buff结构

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

1.结构sk_buff的原型

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

 

struct sk_buff

{

struct sk_buff         *next;

struct sk_buff         *prev;

struct sock           *sk;

ktime_t                 tstamp;

struct net_device       *dev;

union

{

struct  dst_entry    *dst;

struct  rtable       *rtable;

};

struct  sec_path      *sp;

char                 cb[48];

unsigned int          len,

data_len;

__u16               mac_len,

hdr_len;

union

{

__wsum           csum;

struct

{

__u16            csum_start;

__u16            csum_offset;

};

};

__u32                priority;

__u8                   local_df:1,

                 cloned:1,

ip_summed:2,

nohdr:1,

nfctinfo:3;

__u8                 pkt_type:3,

fclone:2,

ipvs_property:1,

peeked:1,

nf_trace:1;

__be16                  protocol;

void                    (*destructor)(struct sk_buff *skb);

struct nf_conntrack     *nfct;

struct sk_buff          *nfct_reasm;

struct nf_bridge_info   *nf_bridge;

int                     iif;

__u16                   queue_mapping;

__u16                   tc_index;

__u16                   tc_verd;

__u8                    ndisc_nodetype:2;

dma_cookie_t            dma_cookie;

__u32                   secmark;

__u32                   mark;

sk_buff_data_t          transport_header;

sk_buff_data_t          network_header;

sk_buff_data_t          mac_header;

sk_buff_data_t          tail;

sk_buff_data_t          end;

unsigned char           *head,

                        *data;

unsigned int            truesize;

atomic_t                users;

};

 

sk_buff主要成员的含义如下:

q      nextsk_buff链表中的下一个缓冲区。

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

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

q      tstamp:报文收到的时间戳。

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

q      transport_header:传输层头部。

q      network_header:网络层头部。

q      mac_header:链接层头部。

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

q      len:有效数据长度。

q      data_len:数据长度。

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

q      hdr_lenskb的可写头部长度。

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

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

q      csum_offset:从csum_start开始的偏移。

q      local_df:允许本地分片。

q      pkt_type:包的类别。

q      priority:包队列的优先级。

q      truesize:报文缓冲区的大小。

q      head:报文缓冲区的头。

q      data:数据的头指针。

q      tail:数据的尾指针。

q      end:报文缓冲区的尾部。

2sk_buff的含义

16.6是结构sk_buff的框图,其中的tailendheaddata是对网络报文部分的       描述。

 

16.6  sk_buff的数据结构

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

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

 

16.7  sk_buff_headsk_buff生成的链表

你可能感兴趣的:(数据结构,网络,struct,header,存储,destructor)