购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.5 数据分片和分段

如图2-7所示,在sk_buff数据结构后紧跟了另一数据结构struct skb_shared_info。在为Socket Buffer分配内存时,我们也会同时为skb_shared_info分配相应大小的内存空间,并顺序地初始化该数据结构。struct skb_shared_info是用于支持IP数据分片(fragmentation)和TCP数据分段(segmentation)的数据结构。

2.5.1 为什么要分割数据包

当一个数据包的长度大于网络适配器硬件能传送的最大传送单元MTU时,需要对数据包进行分割,将其分成更小的数据片,这些数据片存放在由struct skb_shared_info数据结构管理的Socket Buffer组成的单向链表中。管理数据片的struct skb_shared_info数据结构的定义为:

其中各数据域的含义如下。

● Dataref:描述了对主数据包缓冲区的引用计数,例如当每做一次skb_buff克隆时,该计数加1。

● nf_frags:是这个数据包被分割的数据片的计数,描述了一个数据包最终被分成了多少个数据片。这个域是支持IP分片使用的。

● frag_list:如果数据包被分成片段,该域是指向存放分片数据链表起始地址的指针。

● frags:这是一个页表入口数组,每一个入口就是一个TCP的段。

● gso_size、gso_type:这两个域用于说明网络设备是否具有在硬件上实现对TCP分段的能力,是网络设备的功能特点NET_F_TSO(我们在介绍网络设备数据结构时会介绍)描述的。

● gso_size:给出TCP数据包被分段的数量。

目前,有的网卡在硬件上可以完成对TCP层数据的分段(segment),这种功能原来是由CPU来完成的,通过将对大的数据包(如64KB)的分割任务交由网络适配器硬件完成,可以减轻CPU的负载,从而提高网络的速度。这种技术称为TSO(TCP SegmentationOffload),或GSO(Generic Segmentation Offload)。gso_size、gso_type和gso_segs就是用于这类技术的。GSO可以用于各种协议。

2.5.2 设计skb_shared_info数据结构的目的

struct skb_shared_info数据结构紧接在数据包缓冲区之后,由sk_buff的end指针来寻址。使用struct skb_shared_info数据结构有几个目的:支持IP数据分片;支持TCP数据分段;跟踪数据包的引用计数。

当用于IP数据分片时,struct skb_shared_info数据结构中有指针指向包含IP数据片的Socket Buffer的链表。当用于TCP数据分段时,该结构中包含了一个相关的页面数据,其中存放了分段的数据。

frags数组中的每个元素都是一个管理存放TCP数据段的skb_frag_t的结构,frags数组的大小的总和为64KB。

2.5.3 操作skb_shared_info的函数

操作skb_shared_info的函数有如下几种。

● skb_is_nonlinear:查看Socket Buffer的数据包是否被分了片段

● skb_linearize:将分了片的小数据包组装成一个完整的大数据包。

● skb_shinfo:在sk_buff结构中,并没有指针指向struct skb_shared_info数据结构,要访问该数据结构,需要用到宏,skb_sh_info返回sk_buff的end指针。

例如,以下的语句显示了如何对该数据结构中的dataref域做加1操作。 FdqTfTloMEsSn4hD10y91QcOJXDkMycrLVPw3H+QRHo1MmAettU/Gu1l82b4mogf

点击中间区域
呼出菜单
上一章
目录
下一章
×