SKB 结构详解

本文详细探讨了Socket Buffer(SKB)的内部结构及其在数据包解析中的关键作用。通过对SKB的内存管理、数据组织及操作接口的分析,揭示了其在Linux网络堆栈中的重要地位。
摘要由CSDN通过智能技术生成

     SKB(socket buffer)是Linux网络代码中最根本的数据结构,收发数据包都是通过skb。

struct  sk_buff {
        /* These two members must be first. */
        struct sk_buff          *next;
        struct sk_buff          *prev;
          //首要的这两个字段是为了实现链表操作,最近的版本没有了struct sk_buff_head *list;是否意味着packet都在同一个队列上??
      
            ktime_t                 tstamp;
          //记录时间戳,计算这个字段代价很大,所以必要的时候才设置;

        struct sock             *sk;
          //记录这个SKB关联的套接字,当在某一个套接字上收发一个packet时,与之相关的内存会得到分配
          //( socket packet buffer memory accounting??)

        struct net_device       *dev;
          //具体的网络设备;

        /* This is the control buffer. It is free to use for every
         * layer. Please put your private variables there. If you
         * want to keep them across layers you have to do a skb_clone()
         * first. This is owned by whoever has the skb queued ATM.
         */
        char                    cb[48] __aligned(8);
          //SKB控制块,该透明存储区用来存每个packet的私有信息,如TCP可以用来放序列号和帧的重传状态;

        unsigned long           _skb_refdst;
#ifdef CONFIG_XFRM
        struct  sec_path        *sp;
#endif
        unsigned int            len,
                                data_len;
          //SKB是由一个线性缓冲区和可选的页缓存构成,len是packet的总长度,data_len是页缓存中字节长度;
          //所以线性缓存中数据长度: skb->len - skb->data_len ,有函数 skb_headlen(skb)实现;

        __u16                   mac_len,
  • 6
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值