分类: LINUX
2011-09-03 16:33:37
众所周知,网络数据包得传输是受到链路的MTU的限制的。传统的TCP/IP协议中,IP层会根据PMTU(Path MTU)对数据包进行分片,并投递到链路上,最终发到目的地。目的地收到分片后,再组合成一个完整的数据包。本文章介绍了linux中分片的所有技术。
1 IP分片
IP头部的定义见表1。分片的技术就是利用了IP头部中的认证,标志,和段偏移量这3个字段来完成的。属于同一个包的所有分片,认证字段必须是相同的。段偏移量则记录了该分片在原始包中的位置。这些字段在重组的时候也是必要要用到的。至于如何分片的不再讨论范围。
表1. IP头部定义
0 | 4 | 8 | 12 | 16 | 19 | 24 | 31 |
版本 | 首部长度 | 服务类型 | 长度 | ||||
认证 | 标志 | 段偏移量 | |||||
TTL | 协议 | 校验和 | |||||
源IP地址 | |||||||
目的IP地址 | |||||||
选项 ... |
图1给出了IP分片后的效果:
图1:IP分片后的效果图
2 网卡分片
高速网卡设备(千兆网卡以上)不仅可以自动的计算数据包的校验和,而且可以根据不同的协议自动的对数据包进行分片。由于MTU的限制,原先只能通过IP协议对大的数据包进行分片,现在网卡设备硬件本身就可以分片,并自动计算出校验和。同时,在接收处理方面,也有一些智能的功能,比如可以硬件确认数据包的校验和是否正确,可以接收大的数据包。
通过ethtool命令,可以看到网卡所支持的特性,例如:
在发送处理方面,提供了tcp-segmentation-offload(TSO),udp-fragmentation-offload(UFO,generic-segmentation-offload(GSO)这3个特性。
UFO是专门针对UDP协议的,使用了这个特性,用户层就可以发送大的数据包(最大长度是64K),而不需要由IP协议来分片。 UFO与TSO,GSO没有任何的联系,但是却需要tx-checksumming,scatter-gather这两个特性的支持。遗憾的是,现在还没有看到有网卡支持UFO。所以,默认情况下,改功能的状态是off。当前UFO被应用在虚拟设备(比如虚拟的bridge设备,bond设备)上。
TSO是专门针对TCP协议,DCCP协议的,与UFO一样,使用了这个特性,用户层就可以发送大的数据包。TSO的启用不需要GSO的支持,但是却需要tx-checksumming,scatter-gather这两个特性的支持。
GSO是针对所有协议而设计的。但是,与UFO,TSO不同的是,分片的动作不是硬件来完成的,而是以软件的方式来完成的。从用户层的角度看,用户仍然是可以发送大数据包。GSO与TSO,UFO没有任何的联系,同样需要tx-checksumming,scatter-gather这两个特性的支持。
当前的网卡更多的是针对TCP协议进行功能强化,当前的网卡只支持TSO,而不支持UFO。这3个特性中只有TSO是纯硬件的功能。
这个分片和IP分片相比有如下的优势:
1) 硬件分片,速度更快;
2) 每个分片后的包是一个单独的TCP包,即每个分片包都包含TCP头部。
且IP头部不包含任何的与分片相关的值。避免了分片包的丢失,而导致所有的分片
包被重传。
3) 对于接收端而言,则省去了重组分片的工作。减轻了接收端的工作负荷。
3 Offload软分片
UFO现在更多的是在虚拟化技术中被广泛使用。虚拟技术中使用最多的是网桥设备。而网桥设备默认是开启UFO的。虚拟设备中不会依赖真实设备的offload特性,自己也是可以提供offload功能的,效果类似于网卡的分片。区别是这个是由内核以软件的方式来完成的,与IP协议的分片没有任何关系。为了方便描述,我们规定这种形式的分片叫做offload软分片。
Offload分片在使用虚拟设备传输TCP数据时的处理流程如图2。 分片的时机见图2中的Soft Segment。
图2:TCP协议的offload分片的作用效果图
图2中,用户层发送的数据大小是64K。虚拟设备桥设备中,启用了TSO,UFO等功能。而最底层的网卡设备eth1没有启用TSO。则在发送到网卡驱动程序之前,会对大包进行分片,即图中的[Soft Segment]。如果最底层的网卡设备eth1启用TSO,则不需要[Soft Segment]这个操作,而是由网卡本身对数据包进行分片。对于UFO而言,则肯定是要执行软分片的。这里需要注意一点,TSO,UFO的offload分片效果是不一样的。分片后的TCP报文是单独的报文,即数据包的IP头部不存在分片相关的信息。而UFO,则模拟了和IP分片,因此UDP包的IP头部仍然存在分片相关的信息。
也许你会对GSO这个特性存在疑问,这个选项是做什么用的呢。其实,从某个版本的内核开始(也许是2.6.32内核),对于TCP协议和DCCP协议而言,TSO和GSO这两者中只要任何一个特性上打开的,则都可以发送大数据包。GSO与UFO没有任何关系。