`
104zz
  • 浏览: 1507816 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

Android之网络丢包事件

 
阅读更多
有那么一个应用,同样的服务器端,同样的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享受了同等的待遇。

总结:

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

相关推荐

    Android网络监控(监控Http速度、扫描Rssi、ping实现、Ftp实现)

    Ping 测量发包、丢包、发送时延等数据 Rssi 扫描周边的AP信息,并展示出来 Ftp 实现Ftp客户端的上传和下载,如需使用此功能,需要自己在代码中填写服务器地址、端口号、用户名和密码,否则该功能不可用,现在代码里...

    openfire防丢包插件及源码

    《Openfire防丢包插件及其源码解析》 Openfire是一款开源的即时通讯服务器,以其高效、稳定和可扩展性赢得了广泛的应用。在实时通信中,丢包问题常常是影响用户体验的重要因素,为此,开发者们设计了一款专门针对...

    Android 抓包分析

    总之,使用`tcpdump`进行Android网络抓包分析是一项实用技能,它可以帮助我们更好地理解和调试应用程序的网络行为,提高开发和测试效率。同时,这也是一种对网络安全进行基本评估的方法,尤其是在涉及敏感数据传输时...

    非常好用的tcp/udp有人网络调试助手apk,android安卓应用

    4. 进行性能测试,了解网络延迟和丢包情况。 5. 支持串口通信,对物联网设备进行调试。 总的来说,这款“非常好用的tcp/udp有人网络调试助手apk”为Android开发者提供了便捷的网络调试工具,能够有效提升开发和调试...

    android wifi网络摄像头源代码

    开发者需要对网络编程有深入的理解,能够处理TCP/IP协议、套接字编程以及可能的网络延迟和丢包问题。 至于文件"7299c1c0e54745e9b0b1f6ad5a7481df",这很可能是源代码的某一部分,可能包含关键的类或函数定义,如...

    samsung android ble4.0 手机放丢源码及ble sdk包

    标题中的“samsung android ble4.0 手机放丢源码及ble sdk包”指的是一个针对三星(Samsung)智能手机的Android应用开发项目,该应用利用蓝牙低功耗(Bluetooth Low Energy, BLE)技术实现手机防丢功能。BLE 4.0是...

    android DHCP获取IP失败分析解决.pdf

    然而,在某些情况下,Android 设备可能无法通过 DHCP 获取 IP 地址,导致连接 Wi-Fi 网络失败。本文将对 Android 中 DHCP 获取 IP 失败的原因和解决方法进行分析。 一、Android 中 DHCP 获取 IP 的流程 在 Android...

    android解决wifi断线不稳定文件

    在Android系统中,Wi-Fi连接的稳定性是用户体验的重要组成部分。当Wi-Fi连接出现频繁断线、不稳定的现象时,用户可能会遭遇网页加载缓慢、在线游戏延迟、视频播放卡顿等问题,严重影响了日常使用。针对这一问题,这...

    HoloWAN Recorder Pro 网络丢包延迟抖动测试工具-V4.2.8 版本

    HoloWAN Recorder 是一款可以测量网络的延迟、丢包以及网络抖动的网络环境测量工具。支持 Android、Linux、Windows、Mac。 测量结果可以通过图表展现网络状况。 并且可以录制一段时间内的网络状况,录制结果以txt...

    iperf3 网络测试工具 win64+android apk

    网络测试过程中,你可能会遇到的问题包括网络拥塞、丢包、延迟过高以及不稳定的吞吐量。iperf3可以帮助定位这些问题,从而对网络配置进行优化,例如调整路由器设置、选择更合适的网络协议或者排查硬件故障。 总的来...

    magic iperf Android app

    5. **结果展示**:测试完成后,"magic iperf"会提供详细的报告,包括上传速度、下载速度、丢包率等,这些数据有助于用户分析网络状况。 6. **易于使用**:界面简洁直观,即使是对技术不太了解的用户也能轻松操作。 ...

    android ping 网络

    它允许开发者或用户测试设备与特定IP地址之间的连通性,通过发送Internet控制消息协议(ICMP)回显请求来检查网络延迟和丢包情况。以下是关于"android ping 网络"的相关知识点: 1. **ping命令原理**: - Ping工作...

    Android-一个用于Android的P2P库

    UDP(用户数据报协议)是一种无连接的协议,它提供快速的数据传输服务,适用于需要高效传输但可以容忍一定程度丢包的场景,比如P2P网络中的节点发现。在节点发现阶段,设备通过UDP广播或多播来寻找网络中的其他节点...

    Android-NetworkManager:Android上可用的用于检查网络的库,该库使用ping或请求url来获取真实的网络状态

    Android上可用的用于检查网络的库,该库使用ping或请求url来获取真实的网络状态。 设置 Gradle依赖 在您的模块build.gradle添加以下内容 dependencies { compile 'com.yan.netmanager:netmanager:1.2.0' } 如何...

    Android 即时通讯开发包

    增加流媒体传输过程中丢包率统计功能并提供查询API接口; Windows平台支持Java语言开发,并提供示例程序源代码; 新增Android 4.1平台支持,并兼容更多Android设备; 修正切换声卡,或是切换音频工作模式时可能...

    Android应用源码http、udp、tcp网络交互组件.zip

    源码中可能包含发送和接收UDP数据报的示例,以及如何处理丢包和乱序的问题。 学习这些源码时,你需要关注以下几个关键点: 1. HTTP请求的构建,包括设置URL、请求头、请求体等。 2. 请求的异步处理,例如使用...

    android studio写的ping程序app

    在Android系统中,ping命令用于检查设备与网络上其他主机之间的连通性,通过发送ICMP(Internet Control Message Protocol)回显请求来测试网络连接的延迟和丢包情况。 描述中提到“直接可以用”,意味着这个app...

    android h263硬编码rtp打包

    在实际应用中,可能会遇到各种问题,如网络丢包、延迟、带宽波动等。因此,优化RTP打包策略、使用适当的错误恢复机制以及适应网络变化的流控策略是必要的。 最后,提供的链接...

    Android应用源码之sipdroid语音及视频通话-IT计算机-毕业设计.zip

    在进行毕业设计或论文研究时,你可以通过分析SipDroid的源码来学习如何处理网络连接问题,如何优化音频和视频的质量,以及如何处理不同网络环境下的延迟和丢包问题。这将帮助你深入理解Android的网络编程和多媒体...

    android udp传输实例

    5. **丢包与重传**:由于UDP的不可靠性,应用层可能需要自己处理丢包和重传机制。 6. **广播与多播**:UDP支持广播和多播,可以通过设置`DatagramSocket`的广播标志或加入多播组来实现。 在"Interphone"这个文件名...

Global site tag (gtag.js) - Google Analytics