Android之网络丢包事件

标签: Linux 网络和安全 Android | 发表时间:2013-03-01 10:51 | 作者:Litrin
出处:http://www.litrin.net

有那么一个应用,同样的服务器端,同样的Wi-Fi网络下,Android连接速度总是慢过iphone一个数量级。起先怀疑跟Android的硬件有关,无奈的是通过3G甚至于2G EDGE无线连接,速度均超过Wi-Fi。然后这个责任就一把归结到了“Android不如iPhone”,“Android七拼八凑”之类无休止的平台沙文主义之上了。

接手这个问题之后,起先也是渺无头绪。先从服务器端的结构说起吧。

服务器端,很具有中国特色的电信、联通、移动3入口结构,分别通过DNSpod指定到了3台Haproxy前端,通过这3台Haproxy主机发送请求到3台Server,理所当然的3台Server公用一套数据层。通讯协议并非通用协议,为自身设计的一套基于XML的数据通讯协议,所有的通讯都是TCP的持久连接。 服务器端结构

起初的弯路也是被平台沙文主义带到了一个误区,我总是觉得Android手机的问题很可能是硬件驱动对于wi-Fi的支持不好。于是找来了一部手机,几乎刷遍了所有能支持的通用Rom,无奈没有任何起色。(话说Android刷机真的会上瘾:mrgreen: )

然后就是怀疑Android的DNS跟iPhone的不同,无奈两部手机的DNS均是统一DHCP获得的。

回到网络层上来,通过在路由器上监控Android的连接,终于发现Android会有经常性的连接丢包,发起连接很容易失败。单由于是长连接的关系,一旦连接建立成功之后,后续的通许就会很畅通。

说实话,那个时候还是有偏见,认为可能是手机跟路由器的兼容有问题,于是更换了数个路由器,从802.11a一直测到802.11an!不加密的,WEP的,PSK的等等试了个遍,依旧没有进展。忽然发觉这种尝试很可笑,于是自己在内网中写了一个服务端模拟器,发觉没有出现丢包,连接通畅。于是在外网中试环境中,去掉了haproxy层,直连服务器,连接畅通!

问题已经大致上定位了,就是在Haproxy上!!难题才刚刚开始……

更换了多个版本的Haproxy,无效!

怀疑是Android的内核TCP设置有问题(比如滑动窗口,缓存之类的),由于Android本身就是一个Linux,直接Root之后(刷机积攒的经验啊!)把/proc/sys/net路径拷贝下来,一个个文件的对照,一个个配置的试了一天(触摸屏打字很痛苦啊),几乎已经按照服务器的要求配置了一台手机,毫无进展。

好吧,逼我动用终极手段了!数据截取!

刷回原版Rom,连接内网服务器模拟器,通过sniff对所有的通讯数据截包,区分iPhone和Android信包的不同。多次试验之后,发现iPhone和Android每次的信包大小均不一致。Android信包总是大个12字节,终于找到问题了!

net.ipv4.tcp_timestamps

这个内核开关的含义是会在每个信包前增加一个符合RFC 1323标准的时间戳,正好12位。这个配置中,基于Linux内核的操作系统包括Android是默认开启的,但BSD系统,包括iOS中类似的设置是关闭的。

把Rom刷回可root,直接修改内核这个配置,效果立竿见影!应该是解决问题了,但总不能告诉用户“如果你们用Wi-Fi连接不了主机就直接去修改内核配置!”。

分析下来整个问题应该如此:

Haproxy可能存在 bug,或者我们配置有误。Haproxy在转发时可能会出现畸变的数据包,导致数据无法被送达到服务层。但这种状况并不是每次都能被激发(我偏向解释为这是Haproxy的bug)。看了下Haproxy的文档,他们只能解包Http,对于非Http的tcp协议,更多的只是转发数据包而已。对于说为什么手机网络不会受这个影响,个人觉得Android并不是单纯的一个给手机准备的操作系统,移动网络配置并不是存在于内核之中的,电话也好,移动网络也好,是通过应用程序层实现的功能。

畸变的数据包

好吧,把Haproxy的主机全部设置为net.ipv4.tcp_timestamps=0,Android马上跟iPhone享受了同等的待遇。

总结:

  1.  Android是当前发行量最大的Linux版本。
  2. 纠结于“谁比谁强”之类的话题只会耽误事,把结论归结到类似的话题上更是无聊至极。只有用不好,没有不好用!
  3. 数据截取之类的所谓黑客技术,有时可以更快的找出问题。

相关 [android 网络 丢包] 推荐:

Android之网络丢包事件

- - 开源小站
有那么一个应用,同样的服务器端,同样的Wi-Fi网络下,Android连接速度总是慢过iphone一个数量级. 起先怀疑跟Android的硬件有关,无奈的是通过3G甚至于2G EDGE无线连接,速度均超过Wi-Fi. 然后这个责任就一把归结到了“Android不如iPhone”,“Android七拼八凑”之类无休止的平台沙文主义之上了.

Linux网络丢包排查 - 墨天轮

- -
工作中遇到的服务器,最常用的操作系统就是linux系统,linux 系统使用网络适配器和外部进行数据交换. 当在高速链路或异常环境下进行网络通信时,就有可能出现网络数据丢包现象,接下来我主要要说的是:网路丢包的故障定位思路和解决方法. 、网络消息的收发(报文收发过程). 在说丢包故障定位之前,我先来了介绍“网络报文收发过程”.

android执行网络操作

- - ITeye博客
本篇我们会介绍连接到网络中涉及的基本任务,监测的网络连接(包括连接更改),并给予用户控制应用程序的网络使用情况. 还介绍了如何解析和使用XML数据. 这个类包含一个示例应用程序来说明如何执行常见的网络操作. 您可以下载示例(在右边),并用它作为自己的应用程序源代码的可重用代码. 在mainfest中声明权限,代码如下:.

Android之网络通信

- - 博客园_首页
由于一个项目的需要,我研究了一下android的网络通信方式,大体和java平台的很相似. android平台也提供了很多的API供开发者使用,请按示例图:. 首先,介绍一下通过http包工具进行通信,分get和post两种方式,两者的区别是:. 1,post请求发送数据到服务器端,而且数据放在html header中一起发送到服务器url,数据对用户不可见,get请求是把参数值加到url的队列中,这在一定程度上,体现出post的安全性要比get高.

dropwatch 网络协议栈丢包检查利器

- - 系统技术非业余研究
原创文章,转载请注明: 转载自 系统技术非业余研究. dropwatch 网络协议栈丢包检查利器. 在做网络服务器的时候,会碰到各种各样的网络问题比如说网络超时,通常一般的开发人员对于这种问题最常用的工具当然是tcpdump或者更先进的wireshark来进行抓包分析. 通常这个工具能解决大部分的问题,但是比如说wireshark发现丢包,那深层次的原因就很难解释了.

android 应用的网络请求工具

- - ITeye博客
       Android应用开发中一般会用到访问网络请求,可以使用socket,webservice等. 这里我只是用java中URL,传送数据方式采用json,不考虑数据加密问题. 封装的工具类很简单,只提供post,get方法. 由于androidUI主线程中不允许启动线程,这里使用FutrueTask启动线程获得返回结果.

七款免费Android网络电台应用

- kobe - Solidot
Cam Davies 写道 "网络电台是通过互联网提供的音频服务,提供个性化的在线音乐播放,多用于帮助促进唱片销售. 网络电台有两类,一种是传统FM和AM广播网络版;一种是专业或业余的网络电台,可通过SHOUTcast和Icecast等软件收听,其中SHOUTcast收录了全世界大约2.5万个网络电台.

DoCoMo将要求谷歌修改Android减轻网络压力

- - 奶味网-IT人- 最新RSS订阅
《日经新闻》报道称,日本移动运营商DoCoMo将要求谷歌修改Android操作系统,减轻Android智能手机对移动运营商网络的压力. 《日经新闻》称,DoCoMo认为一款免费的语音通信Android应用是周三出现的网络故障的罪魁祸首. 即使没有在运行,部分Android应用每隔3至5分钟也会发出控制信号,相当于普通手机数据流量的10倍,给网络造成很大压力.

实时监控Android设备网络封包

- - UC技术博客
对Android网络抓包分析,一般是使用tcpdump抓个文件,再到PC用Wireshark打开分析. 能不能达到直接使用Wireshark的效果. 答案是可以的,至少已经非常接近了. 实现起来很简单,原理就是将tcpdump的数据重定向到网络端口,再通过管道(pipe)转到wireshark就可以了.

Android利用Fiddler进行网络数据抓包

- - 编程语言 - ITeye博客
要 介绍Android及IPhone手机上如何进行网络数据抓包,比如我们想抓某个应用(微博、微信、墨迹天气)的网络通信请求就可以利用这个方法. 相对于tcpdump配合wireshark抓包的优势在于: (1)无需root (2)对Android和Iphone同样适用 (3)操作更简单方便(第一次安装配置,第二次只需设置代理即可) (4)数据包的查看更清晰易懂,Fiddler的UI更简单明了 (5) 可以查看https请求.