华为交换机查看mac地址漂移命令_什么是最大传输单元MTU

华为交换机查看mac地址漂移命令_什么是最大传输单元MTU导语 VPN是一种通过公网连接两个或多个私网站点的专用网络,使得这些站点仿佛是通过专线连接在一起。IPSec是一套协议框架,用于保证数据传输的私密性,完整性,真实性。但是VPN网络经常会带来一些连通性

一次MTU问题导致的RDS访问故障

导语

VPN是一种通过公网连接两个或多个私网站点的专用网络,使得这些站点仿佛是通过专线连接在一起。IPSec是一套协议框架,用于保证数据传输的私密性,完整性,真实性。但是VPN网络经常会带来一些连通性上的问题,通常与MTU设置的不合理有关。本文通过一个实际案例,来具体分析解决这个问题。

作者:陆信宇

一、环境拓扑

  1. 链路中,各个设备接口的MTU为1450

    MTU是数据链路层的概念,限制的是数据链路层payload的大小,即上层协议大小(包括上层协议头),例如设置主机接口mtu为1450。则在一个TCP报文中,1450 = 20字节IP头 + 20字节TCP头 + 1410TCP数据。

  2. RDS为京东智联云云数据库实例,实例中创建有400个数据库。

  3. SH_MariaDB_VM是一台上海地域的云主机,部署了mariadb服务,数据和RDS实例相同。

  4. BJ_VPNGW和SH_VPNGW分别是北京VPC和上海VPC的vpn网关

  5. bj_client所在子网和RDS所在子网通信时,下一跳为各自所在地域的vpn网关

华为交换机查看mac地址漂移命令_什么是最大传输单元MTU

二、现象描述

  1. bj_client通过BJ_VPNGW连接RDS。执行show databases时,一直卡住无返回。

  2. bj_client通过BJ_VPNGW连接SH_MariaDB_VM。执行show databases正常,没有卡住的现象。

三、排查过程

  1. bj_client可以ping通RDS,telnet RDS 3306端口正常,使用mysql客户端也可以正常连接。

  2. 在BJ_VPNGW和SH_VPNGW上抓包分析。发现RDS回包正常到达SH_VPNGW,但是没有到达BJ_VPNGW。数据包在SH_VPNGW被丢弃。怀疑是MTU问题,导致丢包。

  3. 继续抓包分析RDS和SH_MariaDB_VM回包的区别。发现SH_VPNGW都给RDS和SH_MariaDB_VM回了一个IMCP Error报文,报文中指定了MTU next hop: 1374。但是RDS的重传报文中,ip层的Total Length一直是1450。SH_MariaDB_VM在首次被丢包后,重传报文的Total Length为1374。判断ICMP Error报文没有被正常转发给RDS服务端。后核实RDS前面还有一层LB,该LB没有转发ICMP Error。

  4. 调整bj_client接口mtu为1374之后,问题解决。

四、问题原因

由于bj_client、RDS、SH_MariaDB_VM的mtu都是1450,所以bj_client与RDS、SH_MariaDB_VM进行TCP三次握手时,协商的MSS大小为1410(MTU – 20B ip头 – 20B tcp头)。即后续发送的TCP报文的数据部分,最大不能超过1410字节,且IP头中DF置位,不允许报文分片。

bj_client连接RDS执行show databases命令。由于请求包较小,所以请求报文可以正常通过vpn网关到达RDS。RDS收到报文后开始响应。由于RDS中数据库很多,所以响应报文会拆分成多个进行发送,每个报文的TCP数据部分是1410字节。报文到达VPN网关后,VPN网关在原数据包基础上再次封装ESP、UDP、IP,封装之后的报文大小超过了VPN网关出接口的mtu值,又因为数据包不允许分片,导致VPN网关丢弃报文。VPN网关丢弃报文之后,会向RDS发送一个ICMP Error,指明mtu of next hop: 1374 ,告知RDS以1374为最大mtu发包。但是因为RDS实例前面还有一层LB,且这个LB不会转发ICMP Error报文,导致ICMP Error报文并没有到达真正的RDS服务端,最终导致RDS没有调整数据包大小就直接重传,数据包再次被vpn网关丢弃,进入死循环。

五、解决方案

根据以上分析,有三种解决方法。

  1. 调小服务端或者客户端mtu,让两端在建立三次握手协商mss时,以更小的mss收发数据。可以设置为ping探测的路径MTU值。

  2. 在VPN网关配置iptables -t mangle -A FORWARD -o eth0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu。两端建立三次握手的报文到达vpn网关时,修改MSS值,使MSS自适应PMTU(Path MTU)

  3. 保证icmp error报文可达

六、其他

  1. 什么是MTU

    MTU是数据链路层的概念,限制的是数据链路层payload的大小,即上层协议大小(包括上层协议头)

    例如设置主机接口mtu为1450。则在一个TCP报文中,1450 = 20字节IP头 + 20字节TCP头 + 1410TCP数据。

  2. 什么是MSS

    MSS最大报文段,是TCP中一个选项,用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度(注意不包含TCP头部大小)

  3. 如何探测路径MTU值

    Linux主机中: 执行ping x.x.x.x -s 1422 -M do,x.x.x.x是目标地址,-s指明icmp报文的数据部分大小(不包含icmp 8字节头部)。-M do表示不允许分片。多试几次,找到临界点。以mtu为1450为例,1450 = 20字节IP头 + 8字节icmp头 + 1422数据,则-s指定为1422可以正常通过

    Windows主机中: 执行ping x.x.x.x -l 1472 -f,x.x.x.x是目标地址,-l指明icmp报文的数据部分大小(不包含icmp 8字节头部)。-f表示不允许分片。

  4. 如何查看MTU

    Linux: ifconfig

    华为交换机查看mac地址漂移命令_什么是最大传输单元MTUwindows: netsh interface ipv4 show  subinterfaces

    华为交换机查看mac地址漂移命令_什么是最大传输单元MTU

  5. 如何设置MTU

    Linux: ifconfig eth0 mtu xxx

    windows: netsh interface ipv4 set subinterface “WLAN” mtu=1450 store=persistent

原文地址:https://www.cnblogs.com/Jcloud/archive/2022/11/28/16931753.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/4487.html

(0)
上一篇 2023-06-17
下一篇 2023-06-17

相关推荐

  • Python数据挖掘入门指南

    Python数据挖掘入门指南近年来,数据挖掘成为了各行业的热门方向,Python语言在数据挖掘领域的应用已经越来越广泛,成为专业人士和研究者们的首选语言之一。

    2024-04-16
    78
  • oracle怎么更新索引_mysql索引失效

    oracle怎么更新索引_mysql索引失效MySQL使用存储的键分布基数来确定表连接顺序在决定对查询中的特定表使用哪些索引时,也会使用使用键分布基数 ANALYZE TABLE 表名 可以更新表的索引基数,使其更接近非重复的记录数,记录数可以

    2023-01-31
    170
  • Python中elif的用途和使用场景

    Python中elif的用途和使用场景在Python中,elif是一种条件语句,可以理解为“否则如果”的意思,用于在多个条件中进行选择执行。在if语句后面,我们可以使用若干个elif语句,最后可以选择使用一个else语句作为默认,来处理所有没有被if和elif语句覆盖的情况。

    2024-02-14
    104
  • MySql变量说明 – 自律即自由「建议收藏」

    MySql变量说明 – 自律即自由「建议收藏」1 #变量 2 /* 3 系统变量: 4 全局变量 5 会话变量 6 7 自定义变量: 8 用户变量 9 局部变量 10 11 */ 12 #一、系统变量 13 /* 14 说明:变量由系统定义,不是

    2023-03-26
    153
  • Python实现Excel合并单元格功能

    Python实现Excel合并单元格功能在Excel操作中,很多时候需要对表格进行整理和排版等处理,而合并单元格就是其中一个比较常用的功能。而在Python中,也可以通过调用相关的库实现Excel合并单元格的功能。本文将通过介绍Python中实现Excel合并单元格功能的方法及相关代码示例,帮助读者更好地掌握这个知识点。

    2024-09-04
    23
  • Python Debug Assertion Failure及如何解决

    Python Debug Assertion Failure及如何解决Python Debug Assertion Failure是指Python程序在运行过程中出现了某些问题,导致Python进程被迫退出,并在控制台输出了一些错误信息。这种错误一般都会带有一个Debug Assertion Failure的标志,提示开发者在代码中出现了一些断言错误。断言是一种常用的编程技巧,用来在代码运行过程中判断某些条件是否满足,从而确保代码的正确性。由于断言通常只在开发阶段用于调试,所以在生产环境中被禁用,也就不会出现Debug Assertion Failure错误。

    2024-02-29
    119
  • MongoDB 聚合表达式与阶段

    MongoDB 聚合表达式与阶段聚合表达式 1. 字段路径表达式 $field $field.subfield ###2. 系统变量表达式 $$variable ###3. 常量表达式 # $literal 用于表示常量,即此处的…

    2023-02-15
    145
  • MySQL8自增主键变化[亲测有效]

    MySQL8自增主键变化[亲测有效]MySQL8自增主键变化 醉后不知天在水,满船清梦压星河。 一、简述 MySQL版本从5直接大跃进到8,相信MySQL8一定会有很多令人意想不到的改进,如果不想只会CRUD可以看看。 比如系统表引擎的

    2023-05-12
    144

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注