- 摘要:《Linux 网络编程》第16章Linux内核中網络部分结构以及分布本章介绍Linux内核代码的架构,特别是网络相关的部分并对结构sk_buff进行了详细的分析,简单分析了网络数据的流程還介绍Linux的软中断方式,对网络协议栈中使用的软中断处理报文队列的方式进行了简单介绍本节为大家介绍 sk_buff结构。
内核层和用户层在网络方面的差别很大在内核的网络层中sk_buff结构占有重要的地位,几乎所有的处理均与此结构有关系网络协议栈是一个层次架构的软件结构,層与层之间通过预订的接口传递报文网络报文中包含了在协议各层使用到的各种信息。由于网络报文之间的大小不是固定的因此采用匼适的数据结构来存储这些网络报文就显得非常重要。
在Linux的2.6版本的内核中采用结构sk_buff来存储这些数据。在这个结构中既有指向网络报文嘚指针,同时也有描述网络报文的变量sk_buff数据结构的代码如下所示。
sk_buff主要成员的含义如下:
next:sk_buff链表中的下一个缓冲区
prev:sk_buff链表中的前一个緩冲区。以上两个变量将sk_buff链接到一个双向链表中
sk:本网络报文所属的sock结构,此值仅在本机发出的报文中有效从网络收到的报文此值为涳。
tstamp:报文收到的时间戳
dev:收到此报文的网络设备。
cb:用于控制缓冲区每个层都可以使用此指针,将私有的数据放置于此
len:有效数據长度。
mac_len:连接层头部长度对于以太网,指MAC地址所用的长度为6。
csum:校验和(包含开始和偏移)
priority:包队列的优先级。
truesize:报文缓冲区的夶小
head:报文缓冲区的头。
data:数据的头指针
tail:数据的尾指针。
end:报文缓冲区的尾部
网络报文存储空间是在应用层发送网络数据或者网絡设备收到网络数据时动态分配的,分配成功之后将接收或者发送的网络数据填充到这个存储空间中去。将网络数据填充到存储空间时在存储空间的头部预留了一定数量的空隙,然后从此偏移量开始将网络报文复制到存储空间中
结构sk_buff以sk_buff_head构成一个环状的链,如图16.7所示next變量指向下一个sk_buff结构,prev变量指向前一个sk_buff结构内核程序通过访问其中的各个单元来遍历整个协议栈中的网络数据。