文档章节

抓包分析Andriod偶尔无法连接服务器

北游
 北游
发布于 2013/08/22 18:26
字数 1424
阅读 2123
收藏 29

现象:andriod无法连接服务器,iphone可以连接服务器

      在公司抓包分析过一次Andriod 偶尔无法与服务器建立连接的问题,起初的测试反映,当运维过去查看的时候,又可以访问,而用iphone手机访问也没有问题,故没有引起重视,而是认为是wfii的原因,因为那片区域全是测试,每个测试双有好几个手机,故在那片加了几个ap接入点,而没有过多久,测试还是抱怨不断,而后认真的得抓包分析了一下,终于重现到了问题。

      先说一下公司的环境

               办公司环境(网段172)--路由器(nat)--公网--防火墙(nat)--机房内网(网段10)

       为什么每次andriod偶尔无法访问,而iphone确没有碰到过,只能对二个设备访问服务器时抓包对比分析。


以下是andriod无法连接时的异常抓包:
    219.143.2.115.54047 > 10.2.8.10.http: Flags [S], cksum 0xb237 (correct), seq 1325015326, win 14600, options [mss 1460,sackOK,TS val 457758 ecr 0,nop,wscale 2], length 0
15:57:39.710510 IP (tos 0x0, ttl 63, id 32009, offset 0, flags [DF], proto TCP (6), length 60)
    219.143.2.115.51688 > 10.2.8.10.http: Flags [S], cksum 0x1981 (correct), seq 2323482410, win 14600, options [mss 1460,sackOK,TS val 457852 ecr 0,nop,wscale 2], length 0
15:57:42.921079 IP (tos 0x0, ttl 63, id 9660, offset 0, flags [DF], proto TCP (6), length 60)
    219.143.2.115.57349 > 10.2.8.10.http: Flags [S], cksum 0x2149 (correct), seq 518181460, win 14600, options [mss 1460,sackOK,TS val 458492 ecr 0,nop,wscale 2], length 0
15:57:42.925062 IP (tos 0x0, ttl 63, id 10422, offset 0, flags [DF], proto TCP (6), length 60)
    219.143.2.115.53499 > 10.2.8.10.http: Flags [S], cksum 0x0063 (correct), seq 1103880027, win 14600, options [mss 1460,sackOK,TS val 458492 ecr 0,nop,wscale 2], length 0
15:57:45.260916 IP (tos 0x0, ttl 63, id 55517, offset 0, flags [DF], proto TCP (6), length 60)
    219.143.2.115.54047 > 10.2.8.10.http: Flags [S], cksum 0xad85 (correct), seq 1325015326, win 14600, options [mss 1460,sackOK,TS val 458960 ecr 0,nop,wscale 2], length 0
15:57:45.660809 IP (tos 0x0, ttl 63, id 18309, offset 0, flags [DF], proto TCP (6), length 60)
    219.143.2.115.45331 > 10.2.8.10.http: Flags [S], cksum 0x0e2b (correct), seq 1938537879, win 14600, options [mss 1460,sackOK,TS val 459040 ecr 0,nop,wscale 2], length 0
15:57:45.733034 IP (tos 0x0, ttl 63, id 32010, offset 0, flags [DF], proto TCP (6), length 60)
    219.143.2.115.51688 > 10.2.8.10.http: Flags [S], cksum 0x14cd (correct), seq 2323482410, win 14600, options [mss 1460,sackOK,TS val 459056 ecr 0,nop,wscale 2], length 0

以下是iphone抓包的结果

16:36:03.770763 IP 219.143.2.115.13386 > 10.2.8.10.http: Flags [S], seq 2604085590, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 672936356 ecr 0,sackOK,eol], length 0
16:36:03.870792 IP 219.143.2.115.13386 > 10.2.8.10.http: Flags [S], seq 2604085590, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 672936456 ecr 0,sackOK,eol], length 0
16:36:03.970639 IP 219.143.2.115.13386 > 10.2.8.10.http: Flags [S], seq 2604085590, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 672936556 ecr 0,sackOK,eol], length 0
16:36:04.070785 IP 219.143.2.115.13386 > 10.2.8.10.http: Flags [S], seq 2604085590, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 672936656 ecr 0,sackOK,eol], length 0
16:36:04.173111 IP 219.143.2.115.13386 > 10.2.8.10.http: Flags [S], seq 2604085590, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 672936756 ecr 0,sackOK,eol], length 0
16:36:04.274707 IP 219.143.2.115.13386 > 10.2.8.10.http: Flags [S], seq 2604085590, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 672936855 ecr 0,sackOK,eol], length 0
16:36:04.475541 IP 219.143.2.115.13386 > 10.2.8.10.http: Flags [S], seq 2604085590, win 65535, options [mss 1460,sackOK,eol], length 0
16:36:04.475557 IP 10.2.8.10.http > 219.143.2.115.13386: Flags [S.], seq 3500626396, ack 2604085591, win 14600, options [mss 1460,nop,nop,sackOK], length 0
16:36:04.505347 IP 219.143.2.115.13386 > 10.2.8.10.http: Flags [.], ack 1, win 65535, length 0
16:36:04.505563 IP 219.143.2.115.13386 > 10.2.8.10.http: Flags [P.], seq 1:350, ack 1, win 65535, length 349

      从二次抓包结果看出,andriod多次syn后,服务器始终没有响应,而iphone多次syn后,连接成功了,但是不合理是为什么syn重试这么次才连建立成功。

      初步简单的对比了一下这二种的包的区别,发现是Tcp扩展选项的占的字节数不样,为了32位对齐,andriod就一个nop填充(wscale 3个字节,填充了一个nop,andriod使用了linux内核,合并了timestamp和sack),iphone确有5个填充(wsack 3个字节,填充一个字节,sack二个字节,填充二个字节,timestamp十个字节,填充二个字节)。


      当时第一感觉是不是防火墙因为tcp选项的不同而有什么动作,为什么iphone没有影响,干脆我打开andriod的控制台,手工关了rfc 1323定义的tcp扩展选项。把以三个选项全部置0。
/proc/sys/net/ipv4/tcp_timestamps
/proc/sys/net/ipv4/tcp_sack
/proc/sys/net/ipv4/tcp_window_scaling
然后让测试用Andriod用这台手机测试,测试多次,问题没有重现。问题差不多可以定位在这个扩展,不同能去更改所有的Andriod手机的这几个选项,只能去调整服务器。


       在netstat -s 发现很多Timestamp(passive connections rejected because of time stamp)的Syn包丢失,突然想起之前网上看到timestamp引起包丢失的问题,在rfc1323文档也有定义,rfc1323定了timestamp扩展以后,为了防止syn重传,当一个tcp连接释放以后,如果开启tcp_tw_recycle,在timewait时间里,如果还有该ip syn包到达服务器,而且timestamp是之前的间,linux会认为是重试的syn包,故而会直接drop掉,这种情况通常发生在nat环境里,尤其一个公司通过nat多个共享上网,而且多人频繁访问同一个应用服务。为什么iphone的没有偶尔连接失败的情况,我再仔细分析iphone抓包时,才发现原因如下图,

       iphone在重试几次无法连接的时候,发现无法建立连接的时候,会自动的把包的Timestamp关掉。从这点可以看出,iphone tcp协议栈设计还是比linux考虑的全面。

解决方法:关闭服务器的tcp_tw_recycle

echo 0 > /proc/sys/net/ipv4/tcp_tw_recycle

© 著作权归作者所有

北游
粉丝 108
博文 13
码字总数 12180
作品 0
朝阳
系统管理员
私信 提问
加载中

评论(7)

各种打杂
各种打杂
看来内核参数在3G网络下调整一不小心就要被坑啊~
柚子模板网CTO
柚子模板网CTO
在运给朋友的帮助下,解决了这个问题之后,才看到这篇文章,好东西收藏一下。感谢运维colin@上海
碌木
碌木
不明觉厉
k
kongnan1900
这么回事啊
ahedy
ahedy
靠 这个问题 折腾了我小半年了
哎 还是知识不够啊 每次提是服务器问题 人家一句 iphone没问题。。。。 哥就没话说了。。
几年终于找到原因了。。。
万分感谢楼主。。。
舟
正好碰到这个问题,纠集中就看到了,试试是不是这个问题导致的
y
yangle
学习了!!!
tcp服务器不回应客户端的ACK包

tcp长连接推送服务器,最近可能因为长连接过多(大概50000+),经常出现外界无法与服务器tcp建链,抓包分析,三次握手中,客户端发SYN,服务器很快回应了SYN+ACK,客户端再发ACK,服务器没有回...

Castle.liu
2014/02/28
1K
6
求助,请教下linux上openvpn代理的一个故障问题

现在遇到难题想请教下:我在linux系统的服务器上安装了openvpn,使客户端能够访问某些业务(这些业务服务器只能通过linux服务器进行访问),平台centos6.2,现在碰到这样一个问题: 1.客户端...

yegee
2013/09/15
869
0
【原创】抓包分析之 “TCP Previous segment not captured”

前两天遇到了这样一个奇怪的现象:向某个服务发起 HTTP 请求,会概率性的出现丢包现象; 抓包截图如下: 在正常情况下,服务器在接收到 HTTP 请求后会迅速进行回应;并且 TCP 连接关闭是客户...

摩云飞
2016/12/12
10.3K
0
从 nginx 访问日志中的400错误说起

在研究 OSCHINA 也在遭受大量的无效请求 这个问题时找到的一篇文章,转载于此: 最近在整nginx+php+mysql的网站架设,发现nginx的access.log文件(也就是访问日志)中有大量的400错误,知道HTT...

红薯
2011/12/20
10K
9
企业级应用间歇性无法访问,急需网络诊断专家(TCP重传)

环境说明:1)企业级J2EE应用 2)部署在华为云北京ECS服务器上 3)访问点网络在北京广州的客户现场 问题说明: 在客户现场偶尔访问系统很卡顿,一旦客户现场出现系统卡顿,现场的其它笔记本也...

梅金龙
2018/07/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部