红联Linux门户
Linux帮助

深入理解Linux网络技术内幕--读书笔记-----关键数据结构

发布时间:2011-11-21 10:56:36来源:红联作者:sky001
一. sk_buff
  Linux网络协议栈中主要的缓存类型。定义在include/linux/skbuff.h中,它是一个双向链表的数据结构。它的字段和函数主要分为四大类:
  1. 布局字段:与整个sk_buff链表结构相关的字段
2. 通用信息字段:
3. 特性相关字段:
4. 管理功能函数:
二. sk_buff布局字段
为了很快地找到sk_buff链表中的表头,每个链表中都有一个这样的字段:
struct sk_buff_head *list;
这个域是指向sk_buff链表头的指针。
struct sk_buff_head {
/* These two members must be first. */
struct sk_buff *next;
struct sk_buff *prev;
  __u32 qlen;
  spinlock_t lock;
};
  其中qlen为链表长度,lock是与链表管理相关的字段
整个链表的结构如下:

其他字段如下:
  struct sock *sk; L4需要的字段,存储与之相关的socket信息,在其他层该字段为NULL
  unsigned int len; buffer中数据的长度,包括head->next指向的主长度和分片长度
  unsigned int data_len; 不同于上,该字段只指分片数据的长度
  unsigned int mac_len; mac头部长度
  atomic_t users; 引用计数,防止在有其他程序引用该buffer时被释放
  unsigned int truesize; 表示buffer的所有长度,包括sk_buff结构自身的长度
unsigned char *head; unsigned char *end; unsigned char *data; unsigned char *tail; 这四个指针功能如下

void (*destructor)(...) 当buff被释放时,函数指针可以进行某些工作
三. 通用信息字段
  struct timeval stamp; 报文接收的时间
  struct net_device *dev; 根据接收到了包或者是要发送包,该指针指向的设备所扮演的角色不同
  struct net_device *input_dev; 包是从哪个设备接收的
  struct net_device *real_dev; 对于虚拟设备这个字段才是有意义的
  union {...} h; union {...} nh; union {...} mac h是L4的头部,nh是L3的头部,mac是L2的头部。在包向上或者向下传递过程中,这些域会被依次有序地设置

  struct dst_entry dst; 路由相关的字段
  char cb[40]; 存放每层私有的控制数据
unsigned int csum; unsigned char ip_summed 检验和相关状态的字段
unsigned char cloned; 是否是从别的buffer复制过来的
unsigned char pkt_type; 报文类型,详见include/linux/if_packet.h

四. 特性相关字段
如果希望为Linux内核配置额外支持防火墙或者QoS的功能,那么就需要在配置文件中配置相关信息,以便在编译阶段把特性相关的字段引入到sk_buff中
文章评论

共有 12 条评论

  1. zhangpeijun 于 2012-10-29 13:49:13发表:

    目前还是菜鸟的我,完全看不懂。

  2. viforce 于 2012-07-26 20:22:55发表:

    (o):tx0:w(5(

  3. 一页空纸 于 2011-11-27 16:08:35发表:

    牛人呀!榜样。。。

  4. chly64 于 2011-11-23 21:28:16发表:

    谢谢楼主

  5. chly64 于 2011-11-23 21:28:14发表:

    谢谢楼主

  6. chly64 于 2011-11-23 21:28:10发表:

    谢谢楼主

  7. chly64 于 2011-11-23 21:28:08发表:

    谢谢楼主

  8. chly64 于 2011-11-23 21:28:06发表:

    谢谢楼主

  9. chly64 于 2011-11-23 21:28:05发表:

    谢谢楼主

  10. chly64 于 2011-11-23 21:05:40发表:

    谢谢

  11. badgc 于 2011-11-21 11:18:16发表:

    强人啊

  12. sky001 于 2011-11-21 10:57:14发表:

    学习交流群:146762986