linux之网络子系统-GSO/GRO/TSO/UFO/LRO 机制的详解

一、网络分段卸载技术

先介绍 MSS:

MSS 是 TCP 数据段每次能够传输的最大数据分段的长度。为了达到最佳的传输效能,TCP 协议在建立连接的时候通常要协商双方的 MSS 值,这个值 TCP 协议在实现的时候往往用 MTU 值代替( MSS = MTU - IP 数据包包头大小20Bytes - TCP 数据段的包头大小20Bytes),所以在默认以太网 MTU 为 1500 bytes 时,MSS为 1460。

为什么需要segmentation offloading ??

 Linux 内核传输层和网络层都要做大量的计算工作,具体见上图,这些计算都在服务器的主 CPU 中进行。这里有一些网络协议栈计算所需要的 CPU 资源的一些参考数据。大体上,发送或者接收 1 bit/s 的数据需要 1 赫兹的 CPU 处理能力,也就是说,5 Git/s (625 MB/s) 的网络流量大概需要 5 GHz 的 CPU 处理能力,相当于此时需要 2 个 2.5 Ghz 的多核处理器。因为以太网是单向的,发送和接收 10 Gbit/s (吞吐量就是 20 10 Gbit/s)时,大概需要 8 个 2.5 GHz 的 CPU 内核。

   这些计算大概可以分为两类:

  • (1)数据计算,比如校验和计算和验证、分包和组包等,这个和所处理的 packets 的数量有关
  • (2)数据传输和上下文切换带来的 overhead,这个和传输和切换的次数有关。

  为了解决问题,考虑到越来越多的物理网卡具有较强的处理能力,就出现了两个思路:

  • (1)如果网卡能够支持某些 Linux 内核协议栈所承担的计算任务,那么就可以将这些计算从协议栈 offload (卸载)到物理网卡。
  • (2)如果网卡能支持这些计算,那么尽可能地将这些计算在 Linux 内核网络栈中延后(传输过程)和提前(接收过程)来减少 overhead。

以 TCP 分组或者 IP 分片为例,延迟该过程,可以减少在网络栈中传输和处理的 packets 的数目,从而减少数据传输和上下文切换所需要的主 CPU 计算能力。

目前内核新特性中,对分段卸载技术的应用:

        TSO/LRO/UFO需要硬件支持,TSO针对TCP发送,UFO针对UDP发送(早已废弃)LRO针对数据接收(从未进入主流,事实上已废弃,被内核实现的GRO所取代)。GSO/GRO由内核实现,GRO是早期硬件LRO的软件升级版,虽然GRO是由内核实现,但仍需修改网卡驱动以调用内核GRO接口,网卡才能真正支持GRO功能,目前绝大部分在用网卡驱动都已完成支持GRO的升级。

GSO/GRO号称更加通用,主要是两个特征,一是因为纯软件实现,不需要专用硬件支持,并且GRO实现较硬件来说,因身处内核,掌握信息更多,接收卸载更为准确,这也直接导致了纯硬件接收卸载(LRO)的没落;二是不仅支持TCP,未来还能支持UDP,然而GSO/GRO对UDP的支持迟迟没有实现。随着QUIC逐步被数据中心采用,内核从v4.18才开始支持UDP GSO,对UDP GRO的支持更是到v5.0才提供。尽管如此,GSO/GRO对UDP的支持力度还是不够,一是不像TSO,对网络应用是透明的,UDP GSO/GRO对网络应用不透明,需要应用程序重新编码并设置相应的socket选项以启用GSO/GRO。其次目前流行的各种虚拟网络通常建立在UDP隧道虚拟设备之上,而最初的UDP GSO/GRO实现对虚拟设备的支持还不够完善。        

  二、Segmentation offloading 技术

2.1 TSO (TCP Segmentation Offloading)
2.1.1 TCP Segmentation (TCP 分段)

MSS(Maxium Segment Size): MSS 是 TCP 数据段每次能够传输的最大数据分段的长度。为了达到最佳的传输效能,TCP 协议在建立连接的时候通常要协商双方的 MSS 值,这个值 TCP 协议在实现的时候往往用 MTU 值代替( MSS = MTU - IP 数据包包头大小20Bytes - TCP 数据段的包头大小20Bytes),所以在默认以太网 MTU 为 1500 bytes 时,MSS为 1460。

  TCP 分段:当网络应用发给 TCP 的 message 的长度超过 MSS 时,TCP 会对它按照 MSS 的大小将其分为多个小的 packet,并且在每个 packet 上添加 TCP Header 成为一个 TCP 段(segement)。

2.1.2 TSO 

   TSO 是一种利用网卡分割大数据包,减小 CPU 负荷的一种技术,也被叫做 LSO (Large segment offload) ,如果数据包的类型只能是 TCP,则被称之为 TSO,如果硬件支持 TSO 功能的话,也需要同时支持硬件的 TCP 校验计算和分散 - 聚集 (Scatter Gather) 功能。可以看到 TSO 的实现,需要一些基本条件,而这些其实是由软件和硬件结合起来完成的,对于硬件,具体说来,硬件能够对大的数据包进行分片,分片之后,还要能够对每个分片附着相关的头部。

  TSO 就是将由 TCP 协议栈所做的 TCP 分段交给具有这种能力的物理网卡去做,因此它需要如下支持:

  • 物理网卡支持。
  • Linux 网卡驱动支持。可以使用 ethtool -K ethX tso on 命令打开网卡和驱动对 TSO 的支持,如果返回错误则表示不支持。
  • 还需要 Net:TCP checksum offloading and Net:Scatter Gather 支持。

使用 TSO 以后,应用发出的大的数据块在不超过 64k 的情况下,将会直接经过Linux 网络栈发到网卡的驱动的 driver queue,然后在网卡中根据 skb 中的预设分组数据(主要是 MSS)对它执行 TCP 分段。

问题:目前在代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值