分享

linux内核网络路径数据包分片功能介绍

 只夕 2018-01-26

众所周知,网络数据包的传输是受到链路的MTU限制的。传统的TCP/IP协议中,IP层会根据PMTU(Path MTU)对数据包进行分片,并投递到链路上,最终发到目的地。目的地收到分片后,再组合成一个完整的数据包。现在linux的实现中,充分利用了硬件网卡的校验功能,对数据包延迟分片,提升性能。本章主要介绍linux内核中的这个技术,并重点介绍了offload软分片技术。分别对应TCP,UDP这两个传输层协议来介绍TSO(Tcp Segmentation Offload),UFO(Udp Fragmentation Offload)。最后给出实验数据,说明这个特性的优势。

IP分片

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

linux内核网络路径数据包分片功能介绍

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

linux内核网络路径数据包分片功能介绍

网卡分片

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

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

david@david-Lenovo:~$ ethtool -k eth0

Offload parameters for eth0:

rx-checksumming: on

tx-checksumming: on

scatter-gather: on

tcp-segmentation-offload: on

udp-fragmentation-offload: off

generic-segmentation-offload: on

generic-receive-offload: on

large-receive-offload: off

rx-vlan-offload: on

tx-vlan-offload: on

ntuple-filters: off

receive-hashing: on

在发送处理方面,提供了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[1]协议的,与UFO一样,使用了这个特性,用户层就可以发送大的数据包。TSO的启用不需要GSO的支持,但是却需要tx-checksumming,scatter-gather这两个特性的支持。

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

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

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

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

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

    包被重传。

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

  4. 减少了sk_buff(内核使用这个来管理数据包)的使用,并降低了CPU的使用率。从tcpdump捕获的数据包中可以看出TSO启用后的效果。一个数据包可以包含11824个字节,远远超过MTU。

linux内核网络路径数据包分片功能介绍

Offload软分片

GSO(generic-segmentation-offload)选项则提供了另一种类型的分片,我们把这种技术叫做offlaod软分片。其原理是:在数据包发往网卡驱动之前,对大数据包进行分片,分片完成后则将一个个分片包分发给网卡,最终发送到链路上。GSO能够支持更多的传输层协议,并且对IPv6也有支持。对于TCP报文而言,软分片后的TCP报文中的IP头部是不包含分片信息的;但软分片后的UDP报文中的IP头部是包含分片信息的。

Offload软分片技术也应用在虚拟化技术中。虚拟技术中更多的是使用虚拟网桥设备来联系host主机和guest主机。网桥设备默认是开启UFO/TSO的。虚拟设备中不会依赖真实设备的offload特性,自己也是可以提供offload功能的,效果类似于网卡的分片。而真实网卡是不支持UFO的,这时就会用软分片技术对报文进行分片。

对于TCP协议而言,Offload分片在使用虚拟设备传输数据时的处理流程如图3。 分片的时机见图3中的Soft Segment。

linux内核网络路径数据包分片功能介绍

图3中,用户层发送的数据大小是64K。虚拟设备桥设备中,启用了TSO功能。而最底层的网卡设备eth1没有启用TSO。则在发送到网卡驱动程序之前,会对大包进行分片,即图中的[Soft Segment]。如果最底层的网卡设备eth1启用TSO,则不需要[Soft Segment]这个操作,而是由网卡本身对数据包进行分片。对于UFO而言,与TSO处理相同,由于现在没有网卡支持UFO,所以肯定是要执行软分片的。

Q&A

1. 问:怎么查看我的网卡是百兆网卡还是千兆网卡?

答:Ethtool命令可以查看。

# ethtool eth0

.....

Speed: 1000Mb/s

......

2. 问:我的网卡是否支持TSO?

答:执行ethtool命令,如果tcp-segmentation-offload显示on则支持,否则不支持。

# ethtool -k eth0

Offload parameters for eth0:

......

tcp-segmentation-offload: on

3. 问:如何关闭TSO选项。

答:执行ethtool命令。

# ethtool -K eth0 tso off

# ethtool -K eth0 gso off(这个是必须的。因为tlinux上只要tso,gso任何一个是on,则内核就认为)

4. 问:如何启用TSO选项。

答:执行ethtool命令。

# ethtool -K eth0 tso on

(完)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多