sk_buff 剖析 (一)

sk_buff是Linux网络代码中的关键数据结构,用于管理网络数据包。它包含packet data、skb_shared_info和数据缓冲区等组成部分,以及一系列用于处理和控制数据的成员变量,如数据长度、MAC头长度、引用计数等。sk_buff结构在协议栈中被用来存储和传递数据,同时支持诸如IP分片、流量控制和QoS等功能。
摘要由CSDN通过智能技术生成

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成员变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值