速查:

  1. tso在网卡层面拆包,gro在网卡层面拼包

    • ethtool -k eth0

    • generic-receive-offload:ethtool -K eth0 gso on

    • tcp-segmentation-offload:ethtool -K eth0 tso on

    • tcpdump -i eth0 -s 0 -w s3_s.cap port 3001

  2. 默认tso:on,gso:on,gro:on

1 mysql测试

client:172.16.12.233

server:172.16.12.219

网卡: 都是单卡eth0

测试过程:client上发1000字节的SQL到server,client上发超过1500字节的SQL到server

测试SQL超过1480:

很长的SQL超过了1480字节

抓包

tcpdump -i eth0 -s 0 -w s2_s.cap port 3006

1.1自建mysql结果

结论一

交互的包上都有DF标志,简单的说就是报文不允许切分,如果一定要切(路由觉得包太大只能丢弃)分直接返回失败,所以需要让client切好了再发。

The DF flag is typically set on IP packets carrying TCP segments.

This is because a TCP connection can dynamically change its segment size to match the path MTU, and better overall performance is achieved when the TCP segments are each carried in one IP packet.

So TCP packets have the DF flag set, which should cause an ICMP Fragmentation Needed packet to be returned if an intermediate router has to discard a packet because it’s too large. The sending TCP will then reduce its estimate of the connection’s Path MTU (Maximum Transmission Unit) and re-send in smaller segments. If DF wasn’t set, the sending TCP would never know that it was sending segments that are too large. This process is called PMTU-D (“Path MTU Discovery”).

If the ICMP Fragmentation Needed packets aren’t getting through, then you’re dealing with a broken network. Ideally the first step would be to identify the misconfigured device and have it corrected; however, if that doesn’t work out then you add a configuration knob to your application that tells it to set the TCP_MAXSEG socket option with setsockopt(). (A typical example of a misconfigured device is a router or firewall that’s been configured by an inexperienced network administrator to drop all ICMP, not realising that Fragmentation Needed packets are required by TCP PMTU-D).

结论二

为什么MTU=1500但是wireshark看到的发包收包都有超过1500的呢?

原来在wireshark是在网卡层面以上抓的包,网卡根据tso和gro的配置自动拆/拼包,这两个概念后面介绍

2 TSO

查看参数配置:

ethtool -k eth0 | grep -E 'generic-segmentation-offload|tcp-segmentation-offload'tcp-segmentation-offload: off
generic-segmentation-offload: on# ethtool -K eth0 tso on
# ethtool -K eth0 tso off

为了降低 CPU 的负载,提高网络的出口带宽,TSO 提供一些较大的缓冲区来缓存 TCP 发送的包,然后由网卡负责把缓存的大包拆分成多个小于 MTU 的包。tcpdump 或者 wireshare 抓取的是网卡上层的包,所以我们可能会观察到大小超过 MTU 的包

  • generic-segmentation-offload必须打开后tso才能生效

  • tso关闭只需要关闭tcp-segmentation-offload

3 GRO

查看参数配置

ethtool -k eth0 | grep -E 'generic-receive-offload|large-receive-offload'generic-receive-offload: off
large-receive-offload: off [fixed]# ethtool -K eth0 gso off
# ethtool -K eth0 gso on

LRO 的核心在于:在接收路径上,将多个数据包聚合成一个大的数据包,然后传递给网络协议栈处理,但 LRO 的实现中存在一些瑕疵:

  • 数据包合并可能会破坏一些状态
  • 数据包合并条件过于宽泛,导致某些情况下本来需要区分的数据包也被合并了,这对于路由器是不可接收的
  • 在虚拟化条件下,需要使用桥接功能,但 LRO 使得桥接功能无法使用
  • 实现中,只支持 IPv4 的 TCP 协议

而解决这些问题的办法就是新提出的 GRO(Generic Receive Offload)

首先,GRO 的合并条件更加的严格和灵活,并且在设计时,就考虑支持所有的传输协议,因此,后续的驱动,都应该使用 GRO 的接口,而不是 LRO,内核可能在所有先有驱动迁移到 GRO 接口之后将 LRO 从内核中移除。

而 Linux 网络子系统的维护者 David S. Miller 就明确指出,现在的网卡驱动,有 2 个功能需要使用,一是使用 NAPI 接口以使得中断缓和 (interrupt mitigation) ,以及简单的互斥,二是使用 GRO 的 NAPI 接口去传递数据包给网路协议栈。

在 NAPI 实例中,有一个 GRO 的包的列表 gro_list,用堆积收到的包,GRO 层用它来将聚集的包分发到网络协议层,而每个支持 GRO 功能的网络协议层,则需要实现 gro_receive 和 gro_complete 方法。

参考

https://www.ibm.com/developerworks/cn/linux/l-cn-network-pt/index.html

http://wsfdl.com/%E8%B8%A9%E5%9D%91%E6%9D%82%E8%AE%B0/2016/07/12/tcp_package_large_then_MTU.html

https://liqiang.io/post/tcp-segmentation-offload-introduction-and-operation-2f0b8949

Mysql报文理解mtu拆包依据(tso/gro)相关推荐

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

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

  2. MySQL——深入理解

    前言 MySQL--深入理解主要包括MySQL的存储引擎.索引以及索引对数据库操作的性能优化.SQL优化.视图.存储过程.存储函数.触发器.锁.innoDB引擎的结构原理和数据库的相关管理操作.在这篇 ...

  3. IPv6的TSO/GRO/GSO及其Linux实现的不妥

    很明确的一件事是,IPv6不允许中间设备对报文分片.具体为什么这么设计,就是为了简单高效.因此,IPv6报头简洁了不少. 但TSO貌似并未违背取消IPv6分片的初衷,硬件把一些都处理的妥妥的,在路由软 ...

  4. 浅谈mysql 平衡二叉树理解_浅析二分查找,二叉树,平衡二叉树,B树,B+树

    二分查找 二分查找是最基本的,后面的二叉树,平衡二叉树,B树,B+树都是基于二分查找演变而来的. 二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间,但它有一个 ...

  5. 网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解

    目录 前文链接(系列助学, 也为后文学习做铺垫, 可按需读取) 一. 再谈HTTP再理解 二. HTTP对比学习HTTPS HTTP和HTTPS的区别如下: 三.TCP协议  (三次握手四次挥手细节过 ...

  6. 从TCP报文理解三次握手

    目录 TCP报文 Source Port(源端口)/Destination Port(目标端口) Sequence Number(拆包序列号) Acknowledge Number(回应序号) Dat ...

  7. 个人对于MySQL的理解_MySQL锁的理解

    一.事务四要素:ACID原子性(Atomicity):要么做完,要么啥都不做,没有中间状态 一致性(Consistency):这个是个比较有争议的概念,个人理解是通过AID来保证数据正确性,保证从一个 ...

  8. 个人对于MySQL的理解_面试官:谈谈你对Mysql的MVCC的理解?

    MVCC(Mutil-Version Concurrency Control),就是多版本并发控制.MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问. 在Mysql的In ...

  9. mysql全套理解以及在php中的应用

    DB:数据库 DBMS:数据库管理系统(软件) SQL:用于 DB 和 DBMS 通信的语言(此为通用语言)这里主要学习 MySQL 数据库 1.开源免费 2.性能高 3.简单 4.可移植性好(可在w ...

最新文章

  1. 嗨:VSCode和IDEA都请安装上这个神奇的插件
  2. yxw.Permission.init
  3. 工厂方法(父类定义创建对象的接口,通过多态让子类来创建具体的对象)
  4. 求解第K个斐波那契质数
  5. 红黑树的理解与 Java 实现
  6. java 泛型 引用_Java嵌套自引用泛型
  7. long在C语言中是非法字符吗,C程序设计实践——实验指导
  8. Python Logging Formatter
  9. 分享我的Linux开发环境
  10. Kotlin:比 Java 做得更好
  11. Mariadb数据库设置及操作 一主多从 备份还原(实测笔记)
  12. vesamenu.c32:not a COM32R image报错解决方案
  13. 用Java实现【万年历】
  14. 2014.10.6模拟赛【魔兽争霸】
  15. 物联网现状及未来发展趋势
  16. HandBrake视频压缩工具
  17. 体验论文新神器!AMiner人工智能工具,自动溯源论文来龙去脉
  18. mysql5.1 优化_7. 优化 - [ MySQL 5.1参考手册 ] - 在线原生手册 - php中文网
  19. 优雅的数据库表ID的设计方案
  20. 常见的自然法则及管理启示

热门文章

  1. c语言程序设计年历显示,C语言程序设计报告《万年历》.doc
  2. Cortex-M3处理器内核与基于Cortex-M3的MCU关系
  3. Navicat Premium和Navicat for MySQL哪个好用?
  4. 域对抗(域适应)训练
  5. 互联网,因特网和万维网的区别是什么?
  6. 一文搞懂MD5、SHA-1、SHA-2、SHA-3,哪个算法比较安全
  7. 《阿凡达2》上映在即,3D渲染如何突破想象?
  8. CF1553I Stairs题解--zhengjun
  9. 老男孩javascript实战源码
  10. QtVtk-001-编译