上文介绍了netfilter机制下,如何重造并发送一个skb,涉及到内核协议栈编程,而不是我们平时所说的用户层socket网络编程。
我们先来介绍下上面skb重构程序涉及到的几个函数:
首先,有必要说下,也是后面每段程序中都有说道的,就是开发源码树版本是3.13的,这个版本的skb_buff和我们常见的2.4、2.6有很大的不同。
一、主要看一下四个字段:
//typedef unsigned int sk_buff_data_t;
sk_buff_data_t tail;
sk_buff_data_t end;
unsigned char *head,
*data;
其表示含义如下图所示《深入理解linux网络技术内幕》
head和end指向缓冲区的头部和尾部,而data和tail指向实际数据的头部和尾部,每一层会在head和data之间填充协议头,或者在tail和end之间添加新的协议数据。
所以根据上面的分析,head和data之间是协议头和有效负载,比如传输层、网络层、以太网帧头。
重点:sk_buff 中的数据部分包含协议层头部和有效负载!
下面就是sk_buff中各个头部的长度字段:
//局部
__u16 transport_header;
__u16 network_header;
__u16 mac_header;
//sk_buff取消了在该数据结构内放置联合体union字段,
//所以编程的时候不能直接调用sk_buff中的联合体成员定位到对应的传输层头部、网络层头部等。
//但是却提供给我们更为便捷的方式:
//举网络层为例
static inline struct iphdr *ip_hdr(