sk_buff简单总结

介绍

sk_buff是Linux网络子系统中最核心的数据结构之一,主要用于在网络协议栈中表示和管理网络数据包。它在整个网络数据包的生命周期中扮演着关键角色,从数据包的接收、处理到发送的整个过程中都会用到sk_buff。

作用

  1. 数据包表示:统一表示各种类型的网络数据包。
  2. 协议栈传输:在网络协议栈的各层之间传递数据。
  3. 缓冲管理:管理网络数据的缓冲区。
  4. 数据操作:提供了一系列操作函数,方便对数据包进行各种处理。
  5. 内存优化:通过智能的内存管理,提高网络处理的效率。

sk_buff保存的主要数据项

  1. 协议相关信息:

    • struct net_device *dev:与该数据包关联的网络设备。
    • __u16 protocol:数据包的协议类型(如IPv4、IPv6等)。
    • __u16 transport_header:传输层头部的偏移量。
    • __u16 network_header:网络层头部的偏移量。
    • __u16 mac_header:链路层头部的偏移量。
  2. 数据指针:

    • unsigned char *head:数据缓冲区的起始地址。
    • unsigned char *data:实际数据的起始位置。
    • unsigned char *tail:实际数据的结束位置。
    • unsigned char *end:数据缓冲区的结束地址。
  3. 长度信息:

    • unsigned int len:数据包的实际长度。
    • unsigned int data_len:非线性区域(如分片)的数据长度。
    • __u16 mac_len:MAC头的长度。
  4. 时间戳:

    • ktime_t tstamp:数据包的时间戳。
  5. 队列管理:

    • struct sk_buff *next, *prev:用于将多个sk_buff链接成链表。
  6. 克隆和引用计数:

    • atomic_t users:引用计数,用于跟踪有多少地方在使用该sk_buff。
  7. 校验和信息:

    • __wsum csum:校验和相关信息。
  8. 网络命名空间:

    • struct net *sk_net:关联的网络命名空间。
  9. 安全相关:

    • __u32 secmark:安全标记。
  10. 优先级和流控:

    • __u32 priority:数据包的优先级。
    • __u8 local_df:不分片标志。
  11. socket相关:

    • struct sock *sk:关联的socket结构。
  12. GSO(Generic Segmentation Offload)相关:

    • unsigned int gso_size:GSO分段大小。
    • __u16 gso_type:GSO类型。

特点

  1. 灵活的内存管理:
    sk_buff使用了一种称为"headroom"和"tailroom"的技术。这允许在数据的前后预留一些空间,便于在不同协议层之间传递时添加或删除头部信息。

  2. 零拷贝技术:
    通过巧妙的指针操作,sk_buff可以在不同协议层之间传递数据时避免不必要的数据拷贝,提高效率。

  3. 克隆和共享:
    sk_buff支持克隆操作,允许多个sk_buff共享同一块数据区域,同时通过引用计数确保内存安全。

  4. 分片和重组:
    sk_buff提供了支持IP分片和重组的相关字段和操作。

  5. 网络命名空间支持:
    通过关联特定的网络命名空间,sk_buff支持网络虚拟化。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值