Chinaunix首页 | 论坛 | 博客
  • 博客访问: 204116
  • 博文数量: 28
  • 博客积分: 1179
  • 博客等级: 上尉
  • 技术积分: 405
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-21 22:51
文章分类

全部博文(28)

文章存档

2012年(4)

2011年(8)

2010年(2)

2009年(6)

2008年(8)

分类: LINUX

2011-09-03 16:33:37

   众所周知,网络数据包得传输是受到链路的MTU的限制的。传统的TCP/IP协议中,IP层会根据PMTU(Path MTU)对数据包进行分片,并投递到链路上,最终发到目的地。目的地收到分片后,再组合成一个完整的数据包。本文章介绍了linux中分片的所有技术。


IP分片

   IP头部的定义见表1。分片的技术就是利用了IP头部中的认证,标志,和段偏移量这3个字段来完成的。属于同一个包的所有分片,认证字段必须是相同的。段偏移量则记录了该分片在原始包中的位置。这些字段在重组的时候也是必要要用到的。至于如何分片的不再讨论范围。


                                  表1. IP头部定义

0

4

8

12

16

19

24

31

版本

首部长度

服务类型

长度

认证

标志

段偏移量

TTL

协议

校验和

IP地址

目的IP地址

选项 ...

  

 图1给出了IP分片后的效果: 

                                  图1IP分片后的效果图



网卡分片

    高速网卡设备(千兆网卡以上)不仅可以自动的计算数据包的校验和,而且可以根据不同的协议自动的对数据包进行分片。由于MTU的限制,原先只能通过IP协议对大的数据包进行分片,现在网卡设备硬件本身就可以分片,并自动计算出校验和。同时,在接收处理方面,也有一些智能的功能,比如可以硬件确认数据包的校验和是否正确,可以接收大的数据包。

     通过ethtool命令,可以看到网卡所支持的特性,例如:


  1. david@david-Lenovo:~$ ethtool -k eth0
  2. Offload parameters for eth0:
  3. rx-checksumming: on
  4. tx-checksumming: on
  5. scatter-gather: on
  6. tcp-segmentation-offload: on
  7. udp-fragmentation-offload: off
  8. generic-segmentation-offload: on
  9. generic-receive-offload: on
  10. large-receive-offload: off
  11. rx-vlan-offload: on
  12. tx-vlan-offload: on
  13. ntuple-filters: off
  14. receive-hashing: on

在发送处理方面,提供了tcp-segmentation-offloadTSO),udp-fragmentation-offload(UFOgeneric-segmentation-offload(GSO)3个特性。

   UFO是专门针对UDP协议的,使用了这个特性,用户层就可以发送大的数据包(最大长度是64K),而不需要IP协议来分片。 UFOTSOGSO没有任何的联系,但是却需要tx-checksummingscatter-gather这两个特性的支持。遗憾的是,现在还没有看到有网卡支持UFO。所以,默认情况下,改功能的状态是off。当前UFO被应用在虚拟设备(比如虚拟的bridge设备,bond设备)上。

   TSO是专门针对TCP协议,DCCP协议的,与UFO一样,使用了这个特性,用户层就可以发送大的数据包。TSO的启用不需要GSO的支持,但是却需要tx-checksummingscatter-gather这两个特性的支持。

   GSO是针对所有协议而设计的。但是,与UFOTSO不同的是,分片的动作不是硬件来完成的,而是以软件的方式来完成的。从用户层的角度看,用户仍然是可以发送大数据包。GSOTSOUFO没有任何的联系,同样需要tx-checksummingscatter-gather这两个特性的支持。

当前的网卡更多的是针对TCP协议进行功能强化,当前的网卡只支持TSO,而不支持UFO3个特性中只有TSO是纯硬件的功能。

这个分片和IP分片相比有如下的优势:

1) 硬件分片,速度更快;

2) 每个分片后的包是一个单独的TCP包,即每个分片包都包含TCP头部。

       且IP头部不包含任何的与分片相关的值。避免了分片包的丢失,而导致所有的分片

       包被重传。

3) 对于接收端而言,则省去了重组分片的工作。减轻了接收端的工作负荷。 


Offload软分片


UFO现在更多的是在虚拟化技术中被广泛使用。虚拟技术中使用最多的是网桥设备。而网桥设备默认是开启UFO的。虚拟设备中不会依赖真实设备的offload特性,自己也是可以提供offload功能的,效果类似于网卡的分片。区别是这个是由内核以软件的方式来完成的,与IP协议的分片没有任何关系。为了方便描述,我们规定这种形式的分片叫做offload软分片。

   Offload分片在使用虚拟设备传输TCP数据时的处理流程如图2。 分片的时机见图2中的Soft Segment


2:TCP协议的offload分片的作用效果图



    图2中,用户层发送的数据大小是64K。虚拟设备桥设备中,启用了TSOUFO等功能。而最底层的网卡设备eth1没有启用TSO。则在发送到网卡驱动程序之前,会对大包进行分片,即图中的[Soft Segment]。如果最底层的网卡设备eth1启用TSO,则不需要[Soft Segment]这个操作,而是由网卡本身对数据包进行分片。对于UFO而言,则肯定是要执行软分片的。这里需要注意一点,TSO,UFO的offload分片效果是不一样的。分片后的TCP报文是单独的报文,即数据包的IP头部不存在分片相关的信息。而UFO,则模拟了和IP分片,因此UDP包的IP头部仍然存在分片相关的信息。


    也许你会对GSO这个特性存在疑问,这个选项是做什么用的呢。其实,从某个版本的内核开始(也许是2.6.32内核),对于TCP协议和DCCP协议而言,TSOGSO这两者中只要任何一个特性上打开的,则都可以发送大数据包。GSO与UFO没有任何关系。



阅读(4914) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~