单体分层应用架构剖析-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 85542
  • 博文数量: 165
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1655
  • 用 户 组: 普通用户
  • 注册时间: 2022-09-26 14:37
文章分类

全部博文(165)

文章存档

2024年(2)

2023年(95)

2022年(68)

我的朋友
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: 架构设计与优化

2022-11-28 16:43:26

导语

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网关


二、现象描述


  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报文的数据部分,{banned}最佳大不能超过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为{banned}最佳大mtu发包。但是因为rds实例前面还有一层lb,且这个lb不会转发icmp error报文,导致icmp error报文并没有到达真正的rds服务端,{banned}最佳终导致rds没有调整数据包大小就直接重传,数据包再次被vpn网关丢弃,进入死循环。


五、凯发app官方网站的解决方案


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

  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{banned}最佳大报文段,是tcp中一个选项,用于在tcp连接建立时,收发双方协商通信时每一个报文段所能承载的{banned}最佳大数据长度(注意不包含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

windows: netsh interface ipv4 show subinterfaces


5 如何设置mtu

linux: ifconfig eth0 mtu xxx

windows: netsh interface ipv4 set subinterface "wlan" mtu=1450 store=persistent

阅读(229) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图