关于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。 |
总结:
- 对于TCP而言,无论是TSO还是LRO,都是工作在4层的。是分段而不是分片。
- UFO被合并到了GSO。
- LRO由于不好实现,已经从很多网卡上删除了(也就是说,很多网卡是不支持LRO的,这部分功能在GRO中被覆盖)。
-
GRO、GSO在虚拟机上同样有效。TCP在大量发包的情况下,可以看出效果。
- 当前多数硬件都不支持分片聚合,故,所谓的URO其实是不存在的。而对于TCP而言,也只是聚合分段,分片聚合一般也是不存在的。
参考链接:
https://zhuanlan.zhihu.com/p/44683790