很明确的一件事是,IPv6不允许中间设备对报文分片。具体为什么这么设计,就是为了简单高效。因此,IPv6报头简洁了不少。

但TSO貌似并未违背取消IPv6分片的初衷,硬件把一些都处理的妥妥的,在路由软件层看来,一切好像没有发生过一样。

我先简单解释一下TSO和IP分片的区别:

我们来看一个简单的实验,用IPv6从服务端拉一个大文件,服务端和客户端的抓包如下:

在客户端看来,没有IP分片,因此它不需要做分片重组的动作,它实实在在就是收到了一个完整的7140字节的报文,就好像这个报文就是从服务端真实发出的一样,而实际上,服务器显然没有发送过这么大的报文,显然,这是客户端聚合了几个小包的结果。

因此,下面的结论是合理的:

  • 如果转发设备觉得一个IPv6数据包大于出口的MTU,并且如果它的载荷是TCP段的话,启用TSO将其分段而不是直接丢弃并发送ICMP too big,这并无不妥。

IPv6只是规定了中间设备不能分片,但是却没有规定必须保持原样传输啊。

然而,Linux内核是这么实现的吗?严格来讲,Linux对于上面的描述,仅仅实现了一半。

Linux内核做到了:

  • 即便是转发设备,只要使能了LRO/GRO,就会进行收包聚合,将多个小包尽可能聚合成一个大包,并且修改对应的IPv6头。
  • 即便是转发设备,在转发IPv6超过MTU大小的报文时,只要该报文元数据gso_size不大于MTU,就能成功转发,依靠GSO/TSO在发送时对其进行分段发送,重新分割成独立的小报文。

然而,这是不妥的。

gso_size可以认为是聚合前小报文的大小,在我看来,即便它大于出口MTU,也是可以利用TSO/GSO机制将其分段的啊!只是Linux没有实现而已。

具体看这段代码:

int ip6_forward(struct sk_buff *skb)
{...if (ip6_pkt_too_big(skb, mtu)) {/* Again, force OUTPUT device used as source address */skb->dev = dst->dev;icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);__IP6_INC_STATS(net, idev, IPSTATS_MIB_INTOOBIGERRORS);__IP6_INC_STATS(net, ip6_dst_idev(dst),IPSTATS_MIB_FRAGFAILS);kfree_skb(skb);return -EMSGSIZE;}...
}

当你看ip6_pkt_too_big的代码时,里面会找到这个不妥的逻辑。

这里没有必要抬杠说什么GSO的实现之类就是如此,我的意思是,只要指定一个出口的MTU,无论什么样的TCP包,底层TSO/GSO都会按照该MTU的大小将其分成小段,每一个小段都是一个独立完整的IPv6报文。这个和入口GRO设置的gso_size有个毛线关系啊!

但事实上,Linux内核对此的实现就是这么残!我用systemtap和bpftrace实地探测过的结论,后来我才看的代码。


浙江温州皮鞋湿,下雨进水不会胖。

IPv6的TSO/GRO/GSO及其Linux实现的不妥相关推荐

  1. 以太网卡TSO、GSO、LRO、GRO描述及相关配置

    文章目录 以太网卡TSO.GSO.LRO.GRO描述及相关配置 硬件包拆分与合并 TSO(TCP Segmentation Offload ) UFO(UDP Fragmentation Offloa ...

  2. 网络协议栈TSO/UFO/GSO/LRO/GRO/RSS特性

    作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 网卡多队列技术与RSS功 ...

  3. GSO/TSO/GRO等对VirtIO虚机的网络性能影响分析(by quqi99)

    作者:张华  发表于:2016-04-05 版权声明:能够随意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) IP ...

  4. TSO、GSO介绍与实现

    转载自:http://www.bsdmap.com/2012/02/22/转tso.ufo.gso.lro.gro和rss介绍/ 转载自:http://blog.chinaunix.net/uid-2 ...

  5. UDP 与 GRO, GSO

    不知道是不是因为 GSO, GRO 是 Linux 新增特性的原因, 在 google 上找了半天都没有找到一篇详细的介绍如何使用 GSO/GRO 的文章, 最后从 Linux 内核中与 GSO/GR ...

  6. TSO与GSO简单区分

    概念 TSO(TCP Segmentation Offload): 是一种利用网卡来对大数据包进行自动分段,降低CPU负载的技术. 其主要是延迟分段.通过硬件(网卡)实现. GSO(Generic S ...

  7. linux 网卡gso,linux内核网络协议栈学习笔记:关于GRO/GSO/LRO/TSO等patch的分析和测试...

    TSO,全称是TCP Segmentation Offload,我们知道通常以太网的MTU是1500,除去TCP/IP的包头,TCP的MSS (Max Segment Size)大小是1460,通常情 ...

  8. SmartNIC/DPU — TSO、GSO、LRO、GRO 卸载技术

    目录 文章目录 目录 网络功能卸载 TSO(TCP Segmentation Offload) GSO(Generic Segmentation Offload) LRO(Large Receive ...

  9. Linux 内核协议栈的 TSO、GSO

    Linux 内核的 TSO 会在真正将skb发送到网卡前做GSO的检查: 对于真实硬件设备,是在sch_direct_xmit中调用validate_xmit_skb_list检查 对于虚拟设备,则是 ...

最新文章

  1. iOS 进阶—— iOS内存管理
  2. TreeView数据绑定的方法
  3. OpenGL散射照明
  4. java ajax上传图片插件_java图片上传并预览,前台用jQuery插件AjaxFileUpload,后台用FileUtils.copyFile....
  5. 中职计算机说课稿三篇,2020精选中职计算机说课稿3篇(15页)-原创力文档
  6. access如何保存小数点后_如何把示波器当记录仪用
  7. GitHub在线开发工具上线,是时候卸载IDE了
  8. 全新版个人博客小程序,无需开发服务端接口即可使用
  9. 惠普计算机笔记本打印机官网,HP2621打印机驱动
  10. java sybase存储过程_sybase存储过程-----不定时更新
  11. 【Linux开发】Linux启动脚本设置
  12. java中使用事务案例_Java事务之四——成功的案例
  13. python调用opengl_python的opengl操作
  14. Spring之IOC容器
  15. SQL SERVER还原数据库时,如果C盘空间不足还原到其他盘的方法
  16. 虚拟IP人物,同时空出现——思念党的福音
  17. 手机寸照如何修改底色
  18. Airtest框架和Poco框架常见问题
  19. ubuntu 18.04 卸载firebox
  20. 小学数学测试软件报告,2017年小学数学期末考试质量分析报告

热门文章

  1. 若依@Excel注解自动获取导出字段,字典解析
  2. string find的用法详解
  3. setup time和hold time
  4. 伯克利创造出“可看到未来”的机器人,能帮助无人驾驶预测事故
  5. Android开发入门 - 简易开心消消乐界面设计
  6. 解决线上概率性异常 TransactionTooLargeException
  7. 中国有机微量矿物质天然饲料市场趋势报告、技术动态创新及市场预测
  8. 评委打分表模板_系高中英语作文模板——邀请信
  9. 【Docker】Docker安装
  10. linux微信卡,在UOS个人版中运行Wine QQ/微信/TIM很慢,很卡的处理