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