原文链接 http://www.litrin.net/2013/03/01/android%E4%B9%8B%E7%BD%91%E7%BB%9C%E4%B8%A2%E5%8C%85%E4%BA%8B%E4%BB%B6/

有那么一个应用,同样的服务器端,同样的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之网络丢包事件的更多相关文章

  1. 使用mtr来判断网络丢包和网络延迟

    转载自:https://mp.weixin.qq.com/s/UsjzMS1_rdxenw0TPlqwyQ 常用的 ping,tracert,nslookup 一般用来判断主机的网络连通性,其实 Li ...

  2. FEC(Forward Error Correction)前向纠错 UDP\RTP 中使用用于改善无线等网络丢包等问题--转

    FEC(Forward Error Correction)前向纠错 UDP\RTP 中使用用于改善无线等网络丢包等问题 算法暂不介绍. 思路:FEC ENCODE 增加冗余包,当无线等网络丢包之后,接 ...

  3. windows下网络丢包模拟软件(Network Emulator for Windows Toolkit)

    最近公司有一个直播的测试项目,需要模拟各种网络环境下的直播状态,最后找到一款这样的软件(如果有遇到更好的软件,望和网友多多交流) 介绍一款windows下的网络模拟器,可以模拟各种丢包或延迟的网络(N ...

  4. mac平台adb、tcpdump捕手android移动网络数据包

    在移动电话的发展app当我们希望自己的下才能看到app网络发出请求,这个时候我们需要tcpdump工具包捕获.实现tcpdump空灵,以下步骤需要: 在这里,在android 华为手机 P6对于样本 ...

  5. Fiddler抓取Android手机网络数据包

    也许你也有疑问,如果开发没有完备的接口文档,我如何知道他API的信息? 这时我们就得通过一些抓包工具抓取这些API信息. 常见抓包工具 HTTP抓包工具:Fiddler.Charles.Firebug ...

  6. 基于TcpDump和pcap文件分析的Android平台网络抓包程序设计与实现【随便】

    一.考虑使用Tcpdump,将抓到的包保存到cap文件中,然后手动分析.参考资料:1. http://www.cnblogs.com/tt-0411/archive/2012/09/23/269936 ...

  7. linux下使用tc(Traffic Control) 流量控制命令模拟网络延迟和丢包

    目录 TC案例 TC常用命令 TC安装 TC原理介绍 TC规则 TC操作原理 TC命名规则 TC单位 TC命令 TC案例 如何使用tc模拟网络延迟和丢包 修改网络延时:  sudo tc qdisc  ...

  8. linux 系统 UDP 丢包问题分析思路

    转自:http://cizixs.com/2018/01/13/linux-udp-packet-drop-debug?hmsr=toutiao.io&utm_medium=toutiao.i ...

  9. 浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)

    UDP数据包长度 UDP数据包的理论长度 udp数据包的理论长度是多少,合适的udp数据包应该是多少呢?从TCP-IP详解卷一第11章的udp数据包的包头可以看出,udp的最大包长度是2^16-1的个 ...

随机推荐

  1. Python学习-28.Python中的列表切片

    在实际的业务过程中,经常有这么一个操作:取一个列表的一部分进行操作,而不影响原来的列表.也就是将原来的列表复制一个部分副本并对其进行操作. 举个完整例子: list = ['a','b','c','d ...

  2. 在Azure DevOps Server (TFS) 中修改团队项目名称

    概述 [团队项目]: 在Azure DevOps Server (原名TFS)中,团队项目(Team Project)是一个最基本的数据组织容器,包含了一个团队或者信息系统中的所有信息,包括源代码.文 ...

  3. bootstrap-treeview + angular 使用

    bootstrap-treeview是什么 bootstrap-treeview是一款效果非常酷的基于bootstrap的jQuery多级列表树插件. 怎样使用bootstrap-treeview 插 ...

  4. 关于ORACLE的字符窜存储(未完善,欢迎补充)

    oracle中常见的用于存储字符串的数据类型有: 数据类型 是否定长 最多存储数 效率排行 备注 是否oracle特有 英文占位 中文占位 char 是 2000 比VARCHAR2稍高 char的长 ...

  5. C#跨线程操作UI

    WPF启动调度器 : Dispatcher.Invoke(new Action(() => { //你的代码 }));

  6. GSS1 - Can you answer these queries I(线段树)

    前言 线段树菜鸡报告,stO ZCDHJ Orz,GSS基本上都切完了. Solution 考虑一下用线段树维护一段区间左边连续的Max,右边的连续Max,中间的连续Max还有总和,发现这些东西可以相 ...

  7. linux常用命令大全(linux基础命令入门到精通+命令备忘录+面试复习+实例)

    作者:蓝藻(罗蓝国度) 创建时间:2018.7.3 编辑时间:2019.4.29 前言 本文特点 授之以渔:了解命令学习方法.用途:不再死记硬背,拒绝漫无目的: 准确无误:所有命令执行通过(环境为ce ...

  8. Hash Table-720. Longest Word in Dictionary

    Given a list of strings words representing an English Dictionary, find the longest word in words tha ...

  9. [JavaScript] 将字符串数组转化为整型数组

    var dataStr="1,2,3,4,5";//原始字符串 var dataStrArr=dataStr.split(",");//分割成字符串数组 var ...

  10. linux系统上内网ip和和外网ip的关系

    1.不同服务之间的访问需要使用公网IP+端口才能访问 2.服务器上一般都是域名访问,服务器会把ip+端口映射成固定的域名,所以如果想访问服务器上其他应用,就必须的放开应用限制 问题,在服务器上放开对某 ...