struct--sk_buff

sock->sk_buff

sk_buff结构详解

/usr/src/linux-2.6.19/include/linux/skbuff.h
struct sk_buff {
    struct sk_buff      *next;
    struct sk_buff      *prev;
    struct sock         *sk;         //被哪个sock所拥有
    struct skb_timeval -tstamp;      //数据包到达的时间
    struct net_device   *dev;        //数据包经过的网络设备
    struct net_device   *input_dev; 
- //数据包到达的网络设备
    union {
        struct tcphdr   *th;         //TCP传输层头
        struct udphdr   *uh;         //UDP传输层头
        struct icmphdr 
- *icmph;
        struct igmphdr 
- *igmph;
        struct iphdr    *ipiph;
        struct ipv6hdr 
- *ipv6h;
        unsigned char   *raw;        //原始数据流
    } h;
    union {
        struct iphdr    *iph;        //IP层头
        struct ipv6hdr 
- *ipv6h;
        struct arphdr   *arph;
        unsigned char   *raw;
    } nh;
    union {
        unsigned char   *raw;
    } mac;                           //MAC层即数据链路层头
    struct dst_entry   
- *dst;        //发送到的目的地址描述
    struct sec_path    
- *sp;
    char                cb[48];
    unsigned int        len,
                        data_len,    //数据长度
                        mac_len,     //链路层头的长度
                        csum;        //校验结构
    __u32               priority;    //数据包排队优先级
    __u8                local_df:1,
                        cloned:1,
                        ip_summed:2,
                        nohdr:1,
                        nfctinfo:3;
    __u8                pkt_type:3,
                        fclone:2,
                        ipvs_property:1;
    __be16              protocol;     //ethernet协议的类型
    void                (*destructor)(struct sk_buff *skb);

#ifdef CONFIG_NETFILTER
    struct nf_conntrack      *nfct;
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
    struct sk_buff           *nfct_reasm;
#endif
#ifdef CONFIG_BRIDGE_NETFILTER

    struct nf_bridge_info    *nf_bridge;
#endif
    __u32                    nfmark;
#endif /* CONFIG_NETFILTER */

#ifdef CONFIG_NET_SCHED

    __u16               tc_index;
#ifdef CONFIG_NET_CLS_ACT
    __u16               tc_verd;
#endif
#endif

#ifdef CONFIG_NET_DMA

    dma_cookie_t        dma_cookie;
#endif
#ifdef CONFIG_NETWORK_SECMARK

    __u32               secmark;
#endif
    unsigned int        truesize;
    atomic_t            users;
    unsigned char       *head,      //buffer头指针        
                        *data,      //数据头指针
                        *tail,      //数据尾指针
                        *end;       //结束指针
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
struct sk_buff是Linux内核中定义的网络数据包缓冲区的结构体。它包含了各种用于存储和操作网络数据包的信息和属性。 struct sk_buff的定义位于`include/linux/skbuff.h`头文件中,其结构如下: ```c struct sk_buff { struct sk_buff *next; struct sk_buff *prev; struct sk_buff_head *list; struct sock *sk; struct net_device *dev; struct net_device *real_dev; unsigned char *head; unsigned char *data; unsigned char *tail; unsigned char *end; unsigned int len; unsigned int data_len; unsigned int truesize; unsigned int csum; unsigned int ip_summed; // ... }; ``` 下面是一些常用的struct sk_buff成员变量的解释: - next和prev:用于将多个sk_buff连接成链表,方便管理和处理。 - list:指向所属链表的头部,用于链表操作。 - sk:指向关联的socket结构,用于与网络套接字相关的操作。 - dev:指向接收/发送该数据包的网络设备。 - head、data、tail和end:指针,用于定位数据包的不同部分,如头部、数据、尾部和缓冲区末尾。 - len:数据包的总长度(包括头部和数据)。 - data_len:数据长度,即实际有效数据的长度。 - truesize:sk_buff实际占用的内存大小。 - csum:数据包的校验和。 - ip_summed:用于指示是否进行IP层校验和计算。 除了上述成员变量外,struct sk_buff还包含其他一些用于网络协议处理的字段,如协议类型、标志位等。 通过使用struct sk_buff,Linux内核可以高效地传递、处理和管理网络数据包。它提供了丰富的属性和方法,使得网络协议栈能够对数据包进行灵活的操作和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值