网络协议栈深入分析(一)--与sk_buff有关的几个重要的数据结构
1、先说一下sk_buff结构体
这个结构体是套接字的缓冲区,详细记录了一个数据包的组成,时间、网络设备、各层的首部及首部长度和数据的首尾指针。
下面是他的定义,挺长
- struct sk_buff {
- /* These two members must be first. */
- struct sk_buff *next;
- struct sk_buff *prev;
- ktime_t tstamp;
- struct sock *sk;
- 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);
- unsigned long _skb_refdst;
- #ifdef CONFIG_XFRM
- struct sec_path *sp;
- #endif
- unsigned int len,
- data_len;
- __u16 mac_len,
- hdr_len;
- union {
- __wsum csum;
- struct {
- __u16 csum_start;
- __u16 csum_offset;
- };
- };
- __u32 priority;
- kmemcheck_bitfield_begin(flags1);
- __u8 local_df:1,
- cloned:1,
- ip_summed:2,
- nohdr:1,
- nfctinfo:3;
- __u8 pkt_type:3,
- fclone:2,
- ipvs_property:1,
- peeked:1,
- nf_trace:1;
- kmemcheck_bitfield_end(flags1);
- __be16 protocol;
- void (*destructor)(struct sk_buff *skb);
- #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
- struct nf_conntrack *nfct;
- #endif
- #ifdef NET_SKBUFF_NF_DEFRAG_NEEDED
- struct sk_buff *nfct_reasm;
- #endif
- #ifdef CONFIG_BRIDGE_NETFILTER
- struct nf_bridge_info *nf_bridge;
- #endif
- int skb_iif;
- #ifdef CONFIG_NET_SCHED
- __u16 tc_index; /* traffic control index */
- #ifdef CONFIG_NET_CLS_ACT
- __u16 tc_verd; /* traffic control verdict */
- #endif
- #endif
- __u32 rxhash;
- __u16 queue_mapping;
- kmemcheck_bitfield_begin(flags2);
- #ifdef CONFIG_IPV6_NDISC_NODETYPE
- __u8 ndisc_nodetype:2;
- #endif
- __u8 ooo_okay:1;
- __u8 l4_rxhash:1;
- kmemcheck_bitfield_end(flags2);
- /* 0/13 bit hole */
- #ifdef CONFIG_NET_DMA
- dma_cookie_t dma_cookie;
- #endif
- #ifdef CONFIG_NETWORK_SECMARK
- __u32 secmark;
- #endif
- union {
- __u32 mark;
- __u32 dropcount;
- };
- __u16 vlan_tci;
- sk_buff_data_t transport_header;
- sk_buff_data_t network_header;
- sk_buff_data_t mac_header;
- /* These elements must be at the end, see alloc_skb() for details. */
- sk_buff_data_t tail;
- sk_buff_data_t end;
- unsigned char *head,
- *data;
- unsigned int truesize;
- atomic_t users;
- };
可以看到新版本内核中发生了很多变化,其中数据包的首部在早期版本是以union的形式定义的,例如mac_header的定义方式如下:
- union{
- struct ethhdr *ethernet;
- unsigned char *raw;
- }mac;
这里是以指针的形式给出的
- #ifdef NET_SKBUFF_DATA_USES_OFFSET
- typedef unsigned int sk_buff_data_t;
- #else
- typedef unsigned char *sk_buff_data_t;
- #endif
这里主要说明下后面几个后面的四个属性的含义head、data、tail、end
head是缓冲区的头指针,data是数据的起始地址,tail是数据的结束地址,end是缓冲区的结束地址。
char cb[48] __aligned(8);中的48个字节是控制字段,配合各层协议工作,为每层存储必要的控制信息。
2、sk_buff_head结构体
- struct sk_buff_head {
- /* These two members must be first. */
- struct sk_buff *next;
- struct sk_buff *prev;
- __u32 qlen;
- spinlock_t lock;
- };
这个结构体比较简单,前面两个指针是用于和sk_buff结构串成双向链表,用于管理sk_buff双链表,qlen属性表示该链表中sk_buff的数目,lock是自旋锁。
3、skb_shared_info结构体
- struct skb_shared_info {
- unsigned short nr_frags;
- unsigned short gso_size;//尺寸
- /* Warning: this field is not always filled in (UFO)! */
- unsigned short gso_segs;//顺序
- unsigned short gso_type;
- __be32 ip6_frag_id;
- __u8 tx_flags;
- struct sk_buff *frag_list;//分片的sk_buff列表
- struct skb_shared_hwtstamps hwtstamps;//硬件时间戳
- /*
- * Warning : all fields before dataref are cleared in __alloc_skb()
- */
- atomic_t dataref;//使用计数
- /* Intermediate layers must ensure that destructor_arg
- * remains valid until skb destructor */
- void * destructor_arg;
- /* must be last field, see pskb_expand_head() */
- skb_frag_t frags[MAX_SKB_FRAGS];
- };
该类型用来管理数据包分片信息,通过宏可以表示与skb的关系
- #define skb_shinfo(SKB) ((struct skb_shared_info *)(skb_end_pointer(SKB)))
- #ifdef NET_SKBUFF_DATA_USES_OFFSET
- static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
- {
- return skb->head + skb->end;
- }
- #else
- static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
- {
- return skb->end;
- }
- #endif
可以看到如果用户没有自己使用偏移量,就是skb的end属性指针,也就是该信息存储在缓冲区之后。
下篇将看有关sk_buff的操作函数的实现。
网络协议栈深入分析(一)--与sk_buff有关的几个重要的数据结构相关推荐
- Linux内核--网络协议栈深入分析(一)--与sk_buff有关的几个重要的数据结构
本文分析基于Linux Kernel 3.2.1 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7971463 更多请查看专栏htt ...
- Linux内核--网络协议栈深入分析(二)--sk_buff的操作函数
本文分析基于Linux Kernel 3.2.1 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7972647 更多请查看网络栈分析 ...
- 网络协议栈深入分析(二)--sk_buff的操作函数
1.alloc_skb()函数 该函数的作用是在上层协议要发送数据包的时候或网络设备准备接收数据包的时候会调用alloc_skb()函数分配sk_buff结构体,需要释放时调用kfree_skb()函 ...
- 网络协议栈深入分析(三)--BSD socket和传输层sock
Linux内核中协议族有INET协议族,UNIX协议族等,我们还是以INET协议族为例. 下面是内核中的协议族声明: [cpp] view plaincopy /* Supported address ...
- 网络协议栈深入分析(四)--套接字内核初始化和创建过程
1.系统初始化过程中会调用sock_init函数进行套接字的初始化,主要是进行缓存的初始化 [cpp] view plaincopy static int __init sock_init(void) ...
- 网络协议栈深入分析(五)--套接字的绑定、监听、连接和断开
1.套接字的绑定 创建完套接字服务器端会在应用层使用bind函数进行套接字的绑定,这时会产生系统调用,sys_bind内核函数进行套接字. 系统调用函数的具体实现 [cpp] view plainco ...
- 深入浅出Linux内核网络协议栈|结构sk_buff|Iptables|Netfilter丨内核源码丨驱动开发丨内核开发丨C/C++Linux服务器开发
深入浅出Linux内核网络协议栈 视频讲解如下,点击观看: 深入浅出Linux内核网络协议栈|结构sk C/C++Linux服务器开发高级架构师知识点精彩内容包括:C/C++,Linux,Nginx, ...
- linux 内核网络协议栈
Linux网络协议栈之数据包处理过程 1前言 本来是想翻译<The journey of a packet through the linux 2.4 network stack>这篇文 ...
- linux内核网络协议栈--linux bridge(十九)
1 . 前言 本文是参考附录上的资料整理而成,以帮助读者更好的理解kernel中brdige 模块代码. 2. 网桥的原理 2.1 桥接的概念 简单来说,桥接就是把一台机器上的若干个网络接口" ...
最新文章
- WinRM设置信任主机
- # cat /proc/umap/vi
- 自动驾驶中常用的四类机器学习算法
- 大一计算机课程ppt作业,大学生计算机基础作业PPT.ppt
- 搭建spring MVC项目
- Linux的段错误调试方法
- 小爱音箱mini系统故障怎么办_Win7系统连接小爱音箱mini的方法【图文】
- 【光波电子学】MATLAB仿真厄米特-高阶高斯光束以及绘制其光强分布图
- 大学计算机案例教程旧照片修复,「教你一招」使用自动软件修复老照片
- Amy Cuddy: Your body language shapes who you are
- 学生用计算机隐藏功能,学生计算器怎么去掉d
- 【软考-中级】系统集成项目管理工程师-【2信息系统集成和服务管理】
- 2018版 主流SDR设备横向比较
- 服务器图片显示小方块,高手帮忙了!!验证码跟着敲好之后 服务器打开一个小方块里面空的!在线等!!!...
- 手游测试员需要做什么?
- 操作系统实验报告(二)银行家算法
- 利用tldr工具再也不怕记不住Linux命令
- popupwindow 不抢夺焦点_不知道家里颜色怎么配?一起去翻画册吧!
- IPD-产品需求管理过程(2)
- cors实现请求跨域
热门文章
- linux根据进程的运行路径,停止进程
- 解决java无法切分字符串,.split()无效
- matplotlib在图像上方添加文字、标签
- pycharm 修改默认的注释风格(reStructuredText风格、Google风格、Numpy风格)
- 解决gensim报错AttributeError: type object ‘Word2Vec‘ has no attribute ‘load_word2vec_format‘
- Java中introduce方法_Java基础—继承
- 十六、在屏幕上显示时间
- shiro源码篇 - 疑问解答与系列总结,你值得拥有
- 使用cocopods安装Alamofire后各种报错
- HTML5为输入框添加语音输入功能