网络卸载技术

网络卸载技术

网络卸载(Offload)技术指的是在操作系统中将数据包的处理尽量向下层移动,避免 CPU 消耗大量的计算资源用于处理网络包。

网络卸载技术当前主要应用于三个层面:硬件层面驱动层面操作系统层面

硬件层面

TSO / UFO

TSP 全称 (TCP 分段卸载技术, TCP Segmentation Offload);UFO 全称(UDP 分片卸载技术,UDP Fragmentation Offload)。

开启 TSO 能力后,OS 可将一个不超过 64K 字节(包含 TCP 头部)的任意大小的TCP报文传给网卡,由网卡执行TCP分段、Checksum 计算和包头、帧头生成以及封装等工作,这样就消除了 TCP 分段工作带给 CPU 的负担。被 TCP 分段后的每个 TCP Segment,都需要封装 TCP 头,TCP 头部中有 Checksum(校验和),因此TSO通常需要 Checksum Offload 支持,即由网卡同时完成TCP校验工作。

工作流程如图所示:

image-20231121125755959

RSC

RSC 全称(接受侧合并技术,Receive Side Coalescing (RSC) or hardware LRO)。

RSC 允许网卡在接收同一个连接的数据包时,将多个数据包拼接为一个大的网络包(不超过64kb)再传递到操作系统进行处理。

RSC 工作流程如图所示:

image-20231121145725597

网卡驱动层面

LRO/LSO

LRO 全称大段接收卸载技术, Large Receive Offload;LSO 全称大段分片卸载技术,Large Segment Offload。原理和上面硬件层面的技术类似,只不过这个发生在网卡驱动层面。

原理如图所示:

image-20231122091321264

操作系统层面

GSO/GRO

GSO(Generic Segmentation Offload) 和 GRO(Generic Receive Offload),比 LSO 和 LRO 更通用。

网卡驱动在注册时会告诉 GSO/GRO 自身支持的能力。因此 GSO/GRO 能够自动选择是交给网卡进行包处理还是自身进行包处理。

在 Linux 环境下,可以通过 ethtool -K eth0 gso/gro off/on 进行 GSO/GRO 能力的开关。

流程如图所示:

image-20231122092137474

实验

利用 iperf3 进行灌包测试。

未启用 TSO

  • 带宽:

    image-20231122102230865

  • 数据包总量:

    image-20231122102508309

  • 数据包分析:image-20231122100353526

启用 TSO

  • 带宽:

    image-20231122102322675

  • 数据包总量:

    image-20231122102406118

  • 数据包分析:

    image-20231122102550791

实验分析

根据实验结果可以发现,未 TSO 时,TCP 连接会根据协商的 MSS=1460进行数据包构造,因此在系统网络栈中会构造大量的数据包;在启用了 TSO 之后,数据包的长度超过了协商的 MSS=1460,最大数据长度来到的 64kb。

大包让操作系统不用去构造大量的数据包,减少了 CPU 在数据包构造上面的花销。因此会发现测试出来的带宽比未开启 TSO 时大了许多。

参考资料:

Licensed under CC BY-NC-SA 4.0
最后更新于 May 16, 2024 11:09 +0800
使用 Hugo 构建
主题 StackJimmy 设计