码迷,mamicode.com
首页 > 其他好文 > 详细

剖析数据结构sk_buff (一)

时间:2015-06-19 18:51:08      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:

1 sk_buff介绍

sk_buff(socket buffer)结构是linux网络代码中重要的数据结构,它管理和控制接收或发送数据包的信息。

2 sk_buff组成

Packet data:通过网卡收发的报文,包括链路层、网络层、传输层的协议头和携带的应用数据,包括head room,data,tail room三部分。

skb_shared_info 作为packet data的补充,用于存储ip分片,其中sk_buff *frag_list是一系列子skbuff链表,而frag[]是由一组单独的page组成的数据缓冲区。

Data buffer:用于存储packet data的缓冲区,分为以上两部分。

Sk_buff:缓冲区控制结构sk_buff。

整个sk_buff结构图如图1。


技术分享

图1 sk_buff结构图

3 struct sk_buff 结构体

/* struct sk_buff - socket buffer */  

struct sk_buff {

/* These twomembers must be first. */

struct sk_buff         *next;

struct sk_buff         *prev;

 

struct sock             *sk;

structskb_timeval  tstamp; <span style="color:#FF0000;">//记录接收或发送报文的时间戳</span>

structnet_device    *dev; <span style="color:#FF0000;">//通过该设备接收或发送,记录网络接口的信息和完成操作</span>

structnet_device    *input_dev; <span style="color:#FF0000;">//接收数据的网络设备</span>

structnet_device    *curlayer_input_dev;

structnet_device    *l2tp_input_dev;

union {

struct tcphdr   *th;

struct udphdr  *uh;

struct icmphdr *icmph;

struct igmphdr       *igmph;

struct iphdr     *ipiph;

struct ipv6hdr *ipv6h;//?

unsigned char  *raw;

} h; <span style="color:#FF0000;">//传输层报头</span>

union {

struct iphdr     *iph;

struct ipv6hdr *ipv6h;

struct arphdr   *arph;

unsigned char  *raw;

} nh; <span style="color:#FF0000;">//网络层报头</span>

union {

unsigned char        *raw;

} mac; <span style="color:#FF0000;">//链路层报头</span>


...


unsigned int           len, <span style="color:#FF0000;">//len缓冲区中数据部分的长度。</span>

data_len, <span style="color:#FF0000;">// data_len只计算分片中数据的长度</span>

mac_len, <span style="color:#FF0000;">//mac头的长度</span>

csum; <span style="color:#FF0000;">//校验和</span>

__u32            priority;

__u8              local_df:1,

cloned:1, <span style="color:#FF0000;">//表示该结构是另一个sk_buff克隆的</span>

ip_summed:2,

nohdr:1,

nfctinfo:3;

__u8              pkt_type:3,

fclone:2,

ipvs_property:1;

__be16                  protocol;

__u32 flag;/*packet flags*/


...


/* Theseelements must be at the end, see alloc_skb() for details.  */

unsigned int           truesize; <span style="color:#FF0000;">//这是缓冲区的总长度,包括sk_buff结构和数据部分</span>

atomic_t         users;

unsigned char         *head, <span style="color:#FF0000;">//指向缓冲区的头部</span>

*data,<span style="color:#FF0000;">// 指向实际数据的头部</span>

*tail,<span style="color:#FF0000;"> //指向实际数据的尾部</span>

*end;<span style="color:#FF0000;">//指向缓冲区的尾部</span>

};



剖析数据结构sk_buff (一)

标签:

原文地址:http://blog.csdn.net/liuruiqun/article/details/46563245

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!