一个ping大包不通问题的解决过程
1、问题描述
存在问题: 深圳的采集机MQ程序无法与应用服务器进行通讯,表现为:获取小数据时正常,获取大数据时超时
场景图如下

2、数据下载测试
使用SCP工具和FTP工具进行数据下载测试,主要是想排除采集机上MQ与应用服务器上应用的问题
2.1、在深圳采集机1上执行命令从应用服务器取数据
数据走向:应用服务器->深圳采集机1
结果:失败

2.2、在深圳采集机2上执行命令从应用服务器取数据
数据走向:应用服务器->深圳采集机2
结果:失败

2.3、在河源采集机上执行命令从应用服务器取数据
数据走向:应用服务器->河源采集机
结果:成功

2.4、在深圳采集机1上执行命令把数据传到应用服务器
数据走向:深圳采集机1->应用服务器
结果:成功

2.5、在深圳采集机1上执行命令从河源采集机取数据
数据走向:河源采集机->深圳采集机1
结果:成功

分析:
- 应用服务器->深圳采集机,数据传输不正常,出现"stalled"情况
- 应用服务器->河源采集机 数据传输正常,耗时1秒
- 深圳采集机->应用服务器 数据传输正常,耗时10秒
- 河源采集机->深圳采集机 数据传输正常,耗时4秒
从以上得出结论
- 排除采集机MQ的问题----使用scp和ftp工具都出现相同的问题
- 排除应用服务器应用的问题-----深圳采集机传输到应用服务器正常
- 排除深圳采集机服务器问题----河源采集机传数据到深圳采集机正常
通过这些测试,感觉到是中间网络的问题,但是仔细想想,又好像不对,应用服务器->深圳采集机方向就有问题,深圳采集机->应用服务器就没问题,结合出现问题的现象:获取小数据时正常,获取大数据时超时,于是接下来进行ping大包数据测试
3、ping测试
同时,我也发现一个现象,从深圳采集机1上去ping应用服务器大包,超过1468byte后就不通了,在别的十多个地市采集机测试,同样的包大小都能通,于是我尝试在深圳和河源两个地市进行ping然后在两端抓包分析,进行对比
3.1、在深圳采集机上对应用服务器发起大包ping--超过1486byte就ping不成功
发起一个2000Byte字节大小的包测试。注:此处的120.83.3.10是应用服务器的另一个IP地址
ping -s 2000 120.83.3.10 -c 1
在深圳采集机上1的抓包结果为如下:有三个帧,两个为去的,一个为返回的,有一个途中丢失了(结合下面在应用服务器收到了两个帧,可分析出一个帧从应用服务器到采集机的途中丢失了)

上图解析:
- 采集机到达应用服务器的大包拆成了2个帧,分别是1514和562
- 应用服务器按道理应该返回相同的数据量,但是只收到了一个562的帧,有一个1514的包在途中丢失了
注:因为链路层的MTU值为1500,所以包要拆分为两个帧,MTU为1500的时候对应的length为1514

在应用服务器上的抓包结果为:收到了深圳采集机过来的2个帧

仔细分析应用服务器到采集机这个包的内容:里面的一个字段为flags为:0x02(Don’t Fragment),引起了我的注意

3.2、在河源采集机上对应用服务器发起大包ping--可以ping成功
河源采集机上的抓包结果为(这里有4个数据包,两个为去的,两个为返回的)

应用服务器这边的抓包结果为:成功收到采集机发过来的两个帧

也仔细分析应用服务器到河源采集机这两个包的内容:里面的一个字段为flags:分别是0X03和0X02


上网查找tcp/ip的协议的相关细节,原来这这个字段的值和含义如下:
用于标识数据帧分片是否发送完成,0X01代表“别着急,后面还有!”;0X00表示“好了,我是最后一个帧,所有帧都到齐了,你可以进行组装了”。除此 之外,Flags字段还有一种可能就是0X02,表示该IP数据包不允许进行拆分,这时如果IP数据包长度大于链路MTU值,就会直接丢包。还有一种情况为0X03,表示不允许拆分,后面还有分片。
1和2的分析汇总
- 当包大小超过1476byte的时候,会拆分为多个数据包发送出去
- 应用服务器能收到两个地市传过来的ICMP请求数据包
- 河源发起ping大包测试的时候收到应用服务器返回的数据包有两个
- 深圳发起ping大包测试的时候收到应用服务器返回的数据包只有一个,有一个length为1514byte的包从应用服务器返回的途中丢失了
结论分析:
- 应用服务器(solaris) 回应ping的request(即reply)的时候大包(2000byte)分成了两个数据包,数据包的flags字段不允许分段(0X02)
- 中间的网络中的一个端口的MTU值小于1500,导致包(length为1514的包)直接丢失
为了进一步验证是不是这样,从应用服务器发起对深圳采集机和河源采集机的ping情况
3.3、应用服务器发起对深圳采集机和河源采集机的ping大包--都能ping成功
还是2000byte的测试包
深圳采集机的抓包结果:注意此处,到深圳采集机竟然分成了三个帧?为什么

应用服务器抓包结果

河源采集机的抓包结果,注意此处,到河源采集机两个帧

应用服务器抓包结果

再进一步情况汇总:
- 从应用服务器上是可以ping通深圳采集机和河源采集机的(因为应用服务器的request包flags字段为0X01:允许分段
- 通过在深圳采集机上和河源采集机上的抓包对比,也可以发现从应用服务器至河源采集机的包划分为了3个数据帧,最大的一个数据帧length为1506,很明显小于1514,少了8Byte,而且多了一个60Byte的帧
结论分析:
- 应用服务器主动发起的包允许分段
- 应用服务器->深圳采集机的包分成了三个数据帧,1514分成了1506和8,为什么拆分了8字节的数据出来,分析是中间经过一个MPLS网络,加了8字节的载荷
- 从上一条结论延伸下:ICMP包的载荷是52(很明显60-8=52),IPv4包的载荷是24(很明显:1514-(2000-(562-52))=24),但是为什么一个2000字节的包切割为一个IPv4和一个ICMP的包?
回到那个scp传输数据有误的问题,进行抓包,发现各个数据包中的flags字段为0X02,也是不允许进行拆分包,所以传输有问题。

4、最终原因分析
- 服务器返回的包不允许分片是其中一个原因
- 中间经过mpls组网架构的网络,会加上两个标签(8字节)的mpls包头。通过以上针对ping大包、scp数据下载不了的分析,刚开始判断路径中有一台设备的端口的MTU值为1492,后来深圳检查了深圳侧的设备,各个端口的MTU值为1500。我估计是我们设备通往深圳的的采集机路径中经过一个mpls组网架构的网络,在这个网络的的入口侧pe会给数据包打上两个标签(每个标签4字节),这样数据包的大小就会大过1500,端口直接把包给丢弃。
所以出现ping大包不通现象,同时也是导致采集程序无法与应用服务器通讯的原因。
5、解决办法
有三种解决方法
1、修改操作系统的限制,允许分片
2、排查应用服务器至深圳采集机服务器通过的mpls网络节点路径的进出端口,修改这些接口的MTU值为1508以上
3、修改应用服务器的网卡的MTU值为1492(因为中间多了8Byte的数据,从源端分片的时候预留这8Byte就行啦,目前采用了这种解决方法)
存在风险: 对于一个基于网络的应用来讲,如果应用穿过网络的MTU与网络上的最小MTU相等,那么应用穿过网络的效率最高,原因是有效的避免了分片和重组。MTU从1500降到1492,在数据传输的效率上会有影响,但很小。
一个ping大包不通问题的解决过程的更多相关文章
- 一个关于 ie 浏览器的 bug 解决过程和思考
首先我们测试了老师反馈的异常情况.这所中学使用的是 IE8 浏览器.IE8 浏览器提交作文评分的情况是:一直停留在“正在提交系统评分”的页面,停留了很长时间以后,页面空白. 换用火狐浏览器,可以正常评 ...
- 一次线上http接口调用不通相关的解决过程
2016-05-25 08:58:34 昨天线上小白系统因为调用外部http接口,超时不释放,导致页面反应很慢,时间一长,报502错误. 上网查了下,502错误是因为服务对于客户的请求没有得到及时的反 ...
- 这几天帮一个朋友解决了一点小问题(RF的有些小问题及解决过程)
最近涉猎自动化太少了,以至于都不经常更新了.最近一个朋友在做移动端自动化的时候遇到了一些小问题来找我解决.本人也不是很精通,只是接触的时间长了一点了.下面就是一些问题和解决过程: 1.她刚过来的时候, ...
- android一个下拉放大库bug的解决过程及思考
android一个下拉放大库bug的解决过程及思考 起因 项目中要做一个下拉缩放图片的效果,搜索了下github上面,找到了两个方案. https://github.com/Frank-Zhu/Pul ...
- .NET平台开源项目速览(7)关于NoSQL数据库LiteDB的分页查询解决过程
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑) 与 .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB中,介绍了LiteDB的基本使用情况以及部 ...
- 启动Tomcat一闪而过——分析及解决过程
启动Tomcat一闪而过--分析及解决过程 嗯,昨天将有关JDK的知识稍微整理了一下,现在稍微整理一下有关Tomcat的! 1:Tomcat是什么? Tomcat是当今世界上使用最为广泛的.开源免费的 ...
- nginx负载下站点错误响应会导致其他节点重复响应问题的解决过程
目录 前言 问题来了 问题又来了 问题分析 困惑 转机 后续 前言: 这是我上周工作过程中的一次解决问题的过程.解决的是nginx负载下站点错误响应导致其他节点重复响应. 我在整理这个记叙文时,在给这 ...
- 再记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)
在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一些障碍,这一次希望可以记 ...
- 记录linux /bin被误删除的解决过程
1.事因: 执行shell测试时,shell中rm -rf $path/* 变量$path为空,结果执行的命令是rm -rf / 事发时及时ctrl+c中断,导致只有/bin /boot目录删除 2. ...
随机推荐
- ProtoBuf3 C++使用篇
protobuf 是用于结构化数据串行化的灵活.高效.自动化的解决方案.又如 XML,不过它更小.更快.也更简单.你只需要按照你想要的数据存储格式编写一个.proto,然后使用生成器生成的代码来读写这 ...
- 安装sqlserver后 服务启动过几秒就自动停止
今天安装sqlserver2014后 发现启动2014的服务,过几秒就会自动停止 通过查看windows日志发现是系统库路径报错~ google了下 发现 "重新生成系统库"就能解 ...
- 【云计算】IaaS、PaaS和SaaS
1. SaaS:Software-as-a-Service(软件即服务) 提供给客户的服务是运营商运行在云计算基础设施上的应用程序,用户可以在各种设备上通过客户端界面访问,如浏览器.消费者不需要管理或 ...
- 【转载】多模式串匹配之AC自动机
原文地址:https://www.cnblogs.com/codeape/p/3845375.html 目录 [隐藏] 一.概述 二.AC算法思想 三.字典树tire的构造 四.搜索路径的确定 附录: ...
- Git:git diff 命令详解
工作目录 vs 暂存区 $ git diff <filename> 意义:查看文件在工作目录与暂存区的差别.如果还没 add 进暂存区,则查看文件自身修改前后的差别.也可查看和另一分支的区 ...
- 终于把eShopOnContainer部署成功了。
先上图说明一下,然后把步骤一部一部写上来吧.
- C# Aspose.Cells.dll Excel操作总结
简介 Aspose.Cells是一款功能强大的 Excel 文档处理和转换控件,不依赖 Microsoft Excel 环境,支持所有 Excel 格式类型的操作. 下载 Aspose.Cells.d ...
- Linux下的at定时执行任务命令详解
之前说了使用crontab实现定时执行任务,假如我们只是想要让特定任务运行一次,那么,这时候就要用到at监控程序了.一.at服务 cron是一个linux下 的定时执行工具,可以在无需人工干预的情况下 ...
- codeforces R 493 div2
我蓝了!蓝了!!!蒟蒻的蓝色.日常点开friend发现竟然没几个人打??然后去div1看了一下果然学长全都去打div1了呜呜呜. 看到了久违的黄大仙,以为他今晚要上grandmaster,结果打完发现 ...
- 非常实用的使用eclipse的快捷键和技巧
解决代码的自动提示问题: 1.打开 Eclipse -> Window -> Perferences 2.找到Java 下的 Editor 下的 Content Assist , 右边出现 ...