标签:
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> };
标签:
原文地址:http://blog.csdn.net/liuruiqun/article/details/46563245