IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

R u ok--客户端网络优化实践

五四陈科学院 2015-06-04 09:56:04 累计浏览 2,454 次
本机暂存

   当愤怒的用户,张牙舞爪地告诉你他遇到问题的时候,往往已经病入膏肓。--题记

   作者同全国各地愤怒的用户亲密接触了很长的时间之后,做出了以下总结,希望对后来的人们能够有一点启发。

一、用户IP是个不可靠的东西

  • 在实际的案例中,使用用户的IP地址去IP库里找用户属于哪个地域哪个运营商。

  • 不幸的是,IP库有可能不准。

  • 更不幸的是,连IP地址都可能是错的。实际案例中,我们遇到了运营商级别的流量劫持,用户本来是浙江移动,在某些服务器取得的IP居然是江苏电信。

  • 解决的办法:尽量不依赖IP,用smartDNS。或者多渠道纠正IP地址,使用本地客户端的运营商识别能力+电话号码地域识别。

  • 二、用户不是傻子,他其实都知道自己网络是好是坏

  • 许多案例,用户都会告诉你,他的QQ是好的、微信是好的,为什么你不行?你不行!

  • 看用户日志,感觉用户在撒谎。

  • 然而这并没有什么卵用。

  • 知道真相眼泪掉下来:用户在坏网络下时并不会反馈,而从坏网络->好网络时,你如果还在原来的状态下,你不行,用户就愤怒了。

  • 解决的办法:维护好socket的connect init->connecting->connected状态,任何用户的手动操作,1)天线没变,除了connected状态外,都要转圈; 2)天线变了,除了connected状态外,都要重新开始。

  • 三、用户的愤怒,还因为反应慢

  • 当socket正在创建时,用户手动重发一个数据,往往是采取转菊花和感叹号两个办法。

  • 对用户的行为硬碰硬(立即感叹号),会立即引发用户的愤怒。

  • 对用户的行为超过一定时间的转对抗(菊花),超过10秒即会引发用户的愤怒。

  • 解决的办法:设置合适的timeout值。wifi下:connect timeout 1s,send data timeout 1s(明显的大数据包要区别对待)。4g/3g/2g下:connect timeout 1s,send data timeout 10s(明显的大数据包要区别对待)

  • connect timeout的情况处理:重新发起connect。换IP。

  • send data timeout的情况处理:重新发数据2次。reconnect new ip。

  • 四、遇到了localDNS问题-不解析、乱解析

  • dns问题最好的办法:方案中不用dns。退而选之,少用dns。

  • 五、遇到了运营商加广告

  • 一般运营商只对http加广告

  • 二逼运营商还对tcp加广告

  • 解决的办法:parse数据失败时,reconnect新的地方。

  • 六、遇到了协议、端口拦截

  • 常见问题

  • 一个协议不行,换另一个。tcp|udp->http->websocket

  • 一个端口不行,换另一个。80->443->8080->14000

  • 七、遇到了EPIPE\ECONNRESET

  • 与服务器的连接中断后,send一次数据过去,如果能够到服务器,且服务器已经关了,会回一个RST,RST到了客户端,客户端此时read数据,将遇到ECONNRESET。

  • 与服务器的连接中断后,send数据时时如果已经通过RST得到对方关了,返回EPIPE。

  • 以功夫网为例,ECONNRESET的原因,是海外势力被发现后根本收不到数据或者数据乱了,就从server上关掉了socket,再过去的包就会回RST,我们再读就会显示ECONNRESET。

  • 解决办法:只有timeout值得重试,其他都reconnect吧。

  • 八、总结

  • 要想用户不愤怒,网坏时可坏,但网好要他也好。(迅速恢复)

  • 客户端各种适应环境。

   想快点找到作者也可以到Twitter上留言: @54chen

   或者你懒得带梯子上墙,请到新浪微博:@54chen

同分类推荐文章

  1. 「置顶」我做了什么 (2026-05-05 12:13:28)
  2. 万字长文推演:手机不再从 App 开始,Agent OS 如何接管任务入口 (2026-04-28 14:57:22)
  3. Android Perfetto 系列 10 - Binder 调度与锁竞争 (2025-11-16 15:33:30)

查看更多 移动开发 文章 →

建议继续学习

  1. Linux 性能监控、测试、优化工具 (累计阅读 13,011)
  2. 浅谈TCP优化 (累计阅读 11,081)
  3. 前端开发中Cookie那些事儿 (累计阅读 7,369)
  4. TSQ 的原理 (累计阅读 6,994)
  5. Java应用运维 (累计阅读 5,454)
  6. 加速scp传输速度 (累计阅读 5,393)
  7. beforeunload丢失率统计 (累计阅读 5,038)
  8. web业务尽快升级到centos 6.4的理由 (累计阅读 4,297)
  9. 如何查看mysqld进程的Profiler (累计阅读 4,165)
  10. 网络方面一些经验 (累计阅读 4,094)