概念
TSO(TCP Segmentation Offload): 是一种利用网卡来对大数据包进行自动分段,降低CPU负载的技术。 其主要是延迟分段。通过硬件(网卡)实现。
GSO(Generic Segmentation Offload): GSO是协议栈是否推迟分段,在发送到网卡之前判断网卡是否支持TSO,如果网卡支持TSO则让网卡分段,否则协议栈分完段再交给驱动。 如果TSO开启,GSO会自动开启。 GSO通过软件来实现。
以下是TSO和GSO的组合关系:
1、GSO开启, TSO开启: 协议栈推迟分段,并直接传递大数据包到网卡,让网卡自动分段
2、GSO开启, TSO关闭: 协议栈推迟分段,在最后发送到网卡前才执行分段
3、GSO关闭, TSO开启: 同GSO开启, TSO开启
4、GSO关闭, TSO关闭: 不推迟分段,在tcp_sendmsg中直接发送MSS大小的数据包
目前,在linux-4.18之后UDP也开始GSO的支持,可参考此处 patch。
UFO(DDP Fragmentation Offload)是一种类似于IP分片的技术,拆包之后只有第一个分片有UDP头部。
参考
https://www.kernel.org/doc/Documentation/networking/segmentation-offloads.txt
http://blog.jobbole.com/111668/
https://www.mnstory.net/2017/07/10/network-tso-ufo-gso-lro-gro/