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结构图如图。
图 sk_buff结构图
3 struct sk_buff 结构体
<span style="font-family:Times New Roman;">/* struct sk_buff - socket buffer */
struct sk_buff {
/* These two members must be first. */
struct sk_buff *next;
struct sk_buff *prev;
struct sock *sk;
struct skb_timeval tstamp; // 记录接收或发送报文的时间戳
struct net_device *dev; //通过该设备接收或发送,记录网络接口的信息和完成操作
struct net_device *input_dev; //接收数据的网络设备
struct net_device *curlayer_input_dev;
struct net_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; //传输层报头
union {
struct iphdr *iph;
struct ipv6hdr *ipv6h;
struct arphdr *arph;
unsigned char *raw;
} nh; //网络层报头
union {
unsigned char *raw;
} mac; //链路层报头
.
.
.
unsigned int len, //len缓冲区中数据部分的长度。
data_len, // data_len只计算分片中数据的长度
mac_len, //mac头的长度
csum; //校验和
__u32 priority;
__u8 local_df:1,
cloned:1, //表示该结构是另一个sk_buff克隆的
ip_summed:2,
nohdr:1,
nfctinfo:3;
__u8 pkt_type:3,
fclone:2,
ipvs_property:1;
__be16 protocol;
__u32 flag; /*packet flags*/
.
.
.
/* These elements must be at the end, see alloc_skb() for details. */
unsigned int truesize; //这是缓冲区的总长度,包括sk_buff结构和数据部分
atomic_t users;
unsigned char *head, //指向缓冲区的头部
*data,// 指向实际数据的头部
*tail, //指向实际数据的尾部
*end;//指向缓冲区的尾部
};
</span>
4 sk_buff成员变量