searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

GRO、GSO……的精确解释

2023-06-28 07:44:08
225
0

关于GRO、GSO、TSO、UFO、LRO等概念,网上有很多解释,但个人感觉都解释得不很清楚。这里个人做个总结,希望能帮助到需要帮助的人。

缩写 概念 解释
TSO

TCP Segmentation Offload

利用网卡对TCP数据包进行分片,也叫做LSO。而当网卡支持TSO时,TCP层会逐渐增大mss(总是整数倍数增加),当TCP层向下发送大块数据时,仅仅计算TCP头,网卡接到到了IP层传下的大数 据包后自己重新分成若干个IP数据包,添加IP头,复制TCP头并且重新计算校验和等相关数据,这样就把一部分CPU相关的处理工作转移到由网卡来处理。 内核TCP/IP协议栈也必须考虑下发包数和实际包数不一致的情况,例如处理拥塞控制算法时必须做一些特殊的处理等等。

可见,TSO执行的是TCP分段,而不是分片!

UFO

UDP Segmentation Offload

利用网卡对UDP数据包进行分片。UFO全称是UDP fragmentation offload。从名字可以看出,这是针对UDP的优化。但是不像TCP,UDP没有Segmentation的过程,用户程序发给UDP多长的数据(当然要控制在64K以内),UDP都会转给IP层。IP层会根据MTU进行Fragmentation。UFO使得网络设备,例如网卡,可以将一个超长的UDP数据段(超过MTU),分成多个IPv4分片(fragment)。因为在网卡做了,所以,CPU的运算量被节省下来了。

注意:这里是IP层分片,并不复制UDP头。

GSO

Generic Segmentation Offload

GSO是TSO的增强 ,GSO不只针对TCP,对任意协议。比TSO更通用,推迟数据分片直至发送到网卡驱动之前,此时会检查网卡是否支持分片功能(如TSO、UFO),如果支持直接发送到网卡,如果不支持就进行分片后再发往网卡。

LRO

Large Receive Offload

通过将接收到的多个TCP数据聚合成一个大的数据包,然后传递给网络协议栈处理,以减少上层协议栈处理 开销,提高系统接收TCP数据包的能力。注意,这个也是段的聚合,而非片的聚合。

GRO

Generic Receive Offload

跟LRO类似,克服了LRO的一些缺点,更通用。后续的驱动都使用GRO的接口,而不是LRO。
看了
DPDK的代码:gro_tcp4_reassemble 里面其实只聚合分段,不聚合分片。

总结:

  1. 对于TCP而言,无论是TSO还是LRO,都是工作在4层的。是分段而不是分片。
  2. UFO被合并到了GSO。
  3. LRO由于不好实现,已经从很多网卡上删除了(也就是说,很多网卡是不支持LRO的,这部分功能在GRO中被覆盖)。
  4. GROGSO在虚拟机上同样有效。TCP在大量发包的情况下,可以看出效果。

  5. 当前多数硬件都不支持分片聚合,故,所谓的URO其实是不存在的。而对于TCP而言,也只是聚合分段,分片聚合一般也是不存在的。

参考链接:

https://zhuanlan.zhihu.com/p/44683790

https://blog.csdn.net/Wanli_Xing/article/details/102893871

https://rtoax.blog.csdn.net/article/details/108748689

0条评论
0 / 1000
李****一
10文章数
2粉丝数
李****一
10 文章 | 2 粉丝
李****一
10文章数
2粉丝数
李****一
10 文章 | 2 粉丝
原创

GRO、GSO……的精确解释

2023-06-28 07:44:08
225
0

关于GRO、GSO、TSO、UFO、LRO等概念,网上有很多解释,但个人感觉都解释得不很清楚。这里个人做个总结,希望能帮助到需要帮助的人。

缩写 概念 解释
TSO

TCP Segmentation Offload

利用网卡对TCP数据包进行分片,也叫做LSO。而当网卡支持TSO时,TCP层会逐渐增大mss(总是整数倍数增加),当TCP层向下发送大块数据时,仅仅计算TCP头,网卡接到到了IP层传下的大数 据包后自己重新分成若干个IP数据包,添加IP头,复制TCP头并且重新计算校验和等相关数据,这样就把一部分CPU相关的处理工作转移到由网卡来处理。 内核TCP/IP协议栈也必须考虑下发包数和实际包数不一致的情况,例如处理拥塞控制算法时必须做一些特殊的处理等等。

可见,TSO执行的是TCP分段,而不是分片!

UFO

UDP Segmentation Offload

利用网卡对UDP数据包进行分片。UFO全称是UDP fragmentation offload。从名字可以看出,这是针对UDP的优化。但是不像TCP,UDP没有Segmentation的过程,用户程序发给UDP多长的数据(当然要控制在64K以内),UDP都会转给IP层。IP层会根据MTU进行Fragmentation。UFO使得网络设备,例如网卡,可以将一个超长的UDP数据段(超过MTU),分成多个IPv4分片(fragment)。因为在网卡做了,所以,CPU的运算量被节省下来了。

注意:这里是IP层分片,并不复制UDP头。

GSO

Generic Segmentation Offload

GSO是TSO的增强 ,GSO不只针对TCP,对任意协议。比TSO更通用,推迟数据分片直至发送到网卡驱动之前,此时会检查网卡是否支持分片功能(如TSO、UFO),如果支持直接发送到网卡,如果不支持就进行分片后再发往网卡。

LRO

Large Receive Offload

通过将接收到的多个TCP数据聚合成一个大的数据包,然后传递给网络协议栈处理,以减少上层协议栈处理 开销,提高系统接收TCP数据包的能力。注意,这个也是段的聚合,而非片的聚合。

GRO

Generic Receive Offload

跟LRO类似,克服了LRO的一些缺点,更通用。后续的驱动都使用GRO的接口,而不是LRO。
看了
DPDK的代码:gro_tcp4_reassemble 里面其实只聚合分段,不聚合分片。

总结:

  1. 对于TCP而言,无论是TSO还是LRO,都是工作在4层的。是分段而不是分片。
  2. UFO被合并到了GSO。
  3. LRO由于不好实现,已经从很多网卡上删除了(也就是说,很多网卡是不支持LRO的,这部分功能在GRO中被覆盖)。
  4. GROGSO在虚拟机上同样有效。TCP在大量发包的情况下,可以看出效果。

  5. 当前多数硬件都不支持分片聚合,故,所谓的URO其实是不存在的。而对于TCP而言,也只是聚合分段,分片聚合一般也是不存在的。

参考链接:

https://zhuanlan.zhihu.com/p/44683790

https://blog.csdn.net/Wanli_Xing/article/details/102893871

https://rtoax.blog.csdn.net/article/details/108748689

文章来自个人专栏
小试牛刀
7 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0