本文转载自图解网络Offload,将介绍TSO、GSO、LRO、GRO相关笔记。

网络应用程序如果要发送很大的数据包,经过内核协议栈的时,大包会被分片成多个不超过MTU长度的包。这个分片比较费CPU资源。Offload技术可以把这些分片和合并的工作进行优化处理,也可以直接Offload到网卡上。

MTU

MTU是一个二层的概念,即最大传输单元(Maximum Transmission Unit,MTU),它不包含二层以太网头尾数据。网卡发送数据包的大小都是限制在MTU内的。

Offload涉及到四个概念:TSO、GSO、LRO、GRO。(当然还有UDP的UFO,以及一些checksum的Offload,在这里不讨论。)

TSO

TSO(TCP Segmentation Offload)是一种利用网卡对大数据包进行分片,从而减小CPU负荷的一种技术。其作用通过两个图来对比:

TSO off和GSO off 状态数据包的发送过程:

TSO on状态数据包的发送过程:

一个大的网络包直到进入网卡内部后才由网卡进行了分片。

GSO

GSO(Generic Segmentation Offload)是延缓分片技术。它比TSO更通用,原因在于它不需要硬件的支持就可以进行分片。

其过程是:首先查询网卡是否支持TSO功能,如果硬件支持TSO则使用网卡的硬件分片能力执行分片;如果网卡不支持 TSO 功能,则将分片的执行,延缓到了将数据推送到网卡的前一刻执行。

网卡关闭TSO时,GSO on状态数据包的发送过程:

一个大的网络包直到进入网卡前的最后一步才进行了分片。

TSO和GSO对应数据发送过程,对应数据接收过程的是LRO和GRO。

LRO

LRO(Large Receive Offload)是将网卡接收到的多个数据包合并成一个大的数据包,然后再传递给网络协议栈处理的技术。这样可以提高系统接收数据包的能力,减轻CPU负载。

LRO off和GRO off 状态数据包的接收过程:

LRO on状态数据包的接收过程:

数据一进入网卡立刻进行了合并。

GRO

GRO(Generic Receive Offload)是LRO 的软件实现,只是GRO 的合并条件更加的严格和灵活。

GRO on状态数据包的接收过程:

以上的网络offload是网络协议栈配合网卡完成的,在现在的很多智能网卡上可以直接offload整个网络协议栈,即把网络协议的处理放到了智能网卡上。


参考资料:

  1. 图解网络Offload