分类: LINUX
2010-05-20 10:17:27
16.1.4 sk_buff结构
内核层和用户层在网络方面的差别很大,在内核的网络层中sk_buff结构占有重要的地位,几乎所有的处理均与此结构有关系。网络协议栈是一个层次 架构的软件结构,层与层之间通过预订的接口传递报文。网络报文中包含了在协议各层使用到的各种信息。由于网络报文之间的大小不是固定的,因此采用合适的数 据结构来存储这些网络报文就显得非常重要。
1.结构sk_buff的原型
在Linux的2.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主要成员的含义如下:
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生成的链表 |