介绍
sk_buff是Linux网络子系统中最核心的数据结构之一,主要用于在网络协议栈中表示和管理网络数据包。它在整个网络数据包的生命周期中扮演着关键角色,从数据包的接收、处理到发送的整个过程中都会用到sk_buff。
作用
- 数据包表示:统一表示各种类型的网络数据包。
- 协议栈传输:在网络协议栈的各层之间传递数据。
- 缓冲管理:管理网络数据的缓冲区。
- 数据操作:提供了一系列操作函数,方便对数据包进行各种处理。
- 内存优化:通过智能的内存管理,提高网络处理的效率。
sk_buff保存的主要数据项
-
协议相关信息:
- struct net_device *dev:与该数据包关联的网络设备。
- __u16 protocol:数据包的协议类型(如IPv4、IPv6等)。
- __u16 transport_header:传输层头部的偏移量。
- __u16 network_header:网络层头部的偏移量。
- __u16 mac_header:链路层头部的偏移量。
-
数据指针:
- unsigned char *head:数据缓冲区的起始地址。
- unsigned char *data:实际数据的起始位置。
- unsigned char *tail:实际数据的结束位置。
- unsigned char *end:数据缓冲区的结束地址。
-
长度信息:
- unsigned int len:数据包的实际长度。
- unsigned int data_len:非线性区域(如分片)的数据长度。
- __u16 mac_len:MAC头的长度。
-
时间戳:
- ktime_t tstamp:数据包的时间戳。
-
队列管理:
- struct sk_buff *next, *prev:用于将多个sk_buff链接成链表。
-
克隆和引用计数:
- atomic_t users:引用计数,用于跟踪有多少地方在使用该sk_buff。
-
校验和信息:
- __wsum csum:校验和相关信息。
-
网络命名空间:
- struct net *sk_net:关联的网络命名空间。
-
安全相关:
- __u32 secmark:安全标记。
-
优先级和流控:
- __u32 priority:数据包的优先级。
- __u8 local_df:不分片标志。
-
socket相关:
- struct sock *sk:关联的socket结构。
-
GSO(Generic Segmentation Offload)相关:
- unsigned int gso_size:GSO分段大小。
- __u16 gso_type:GSO类型。
特点
-
灵活的内存管理:
sk_buff使用了一种称为"headroom"和"tailroom"的技术。这允许在数据的前后预留一些空间,便于在不同协议层之间传递时添加或删除头部信息。 -
零拷贝技术:
通过巧妙的指针操作,sk_buff可以在不同协议层之间传递数据时避免不必要的数据拷贝,提高效率。 -
克隆和共享:
sk_buff支持克隆操作,允许多个sk_buff共享同一块数据区域,同时通过引用计数确保内存安全。 -
分片和重组:
sk_buff提供了支持IP分片和重组的相关字段和操作。 -
网络命名空间支持:
通过关联特定的网络命名空间,sk_buff支持网络虚拟化。