iOS仿抖音网络检测

当我们app的量级上去的时候,用户分布在全国各地。我们经常收到客服反馈的各种奇奇怪怪的问题。(小朋友你是否有很多问号?)

明明自己用的时候、测的时候好好的,怎么到用户手机各种问题?比如:登录时获取验证码失败,进入首页接口超时加载白屏等问题。通过我们埋点日志的收集,我们发现AFN一般报的错都是类似如下这种,只是告诉你超时了。

image.png

我们都知道网络不好的问题有太多方面的因素了(DNS解析出现问题啦,在大街上走到不好的位置,可能就断网了、或者切换基站了、或者被伪基站拦截了、或者切换到不能上网的免费wifi了、或者自己手机欠费了、还有各种弱网情况等等)。用户可能不知道,他就认为是你app有问题。

image.png

互联网本身是一个很复杂的一个系统,中间的传输会发生很多意想不到的情况。

因此究其原因。我们需要解决两个方面的问题。一方面有些时候是用户自己的网络有问题,这时候就需要进行温馨提示。但另一方面有,些时候手机网络看起来是好的,但是实际上客户端到达服务器需要很多道"关卡",例如路由器,电信服务器,防火墙等.其实说白了就是解决一个问题:客户端是否能够成功访问服务器,这就需要用到一些检测的手段,偶然间看到抖音的方案,觉得挺不错的。

image.png

image.png

让我们来看看,都检测了啥。开头的基本信息就不说了,包括app版本号,系统版本号,本地ip,当前网络类型,运营商等等。

接着解析抖音自己的域名,我们发现dns解析出来ip居然有10多个。。真的是比较夸张了。如果说用一台机器接收流量配合nginx,并发几十万也是比较轻松的。10多个什么概念,我算数不太好...

接着是ping自己域名 然后还ping了百度的域名进行对比,这个很不错,有对比就有伤害。

然后是路由追踪,每个路由分别发了3个包,并且统计了时间。

最后是检测上传速度和下载速度,这个我个人认为看需要吧,视频网站还是需要的,因为毕竟对网速要求还是比较高的。

众所周知,互联网嘛,就是抄嘛()

首先我们先找到各个方案的实现:

在IOS平台实现Ping 和 traceroute.

这篇原理是比较通俗易懂的,强烈推荐。

ping域名的原理就是通过DNS解析(socket.h支持)拿到ip,通过ICMP协议对目标主机进行发送包,目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。大多数的 TCP/IP 实现都在内核中直接支持Ping服务器,当应答报文返回时,使用当前时间值减去存放在ICMP报文数据中存放发送请求的时间值来计算往返时间。从功能上划分,ICMP属于网络层,TCP和UDP属于传输层,所以icmp的链路更短。

image.png

traceroute的原理(分udp和icmp两种,一般用icmp)是利用增加存活时间(TTL)值来实现功能的,每当一个icmp包经过一个路由器时,其存活时间值就会减1,当其存活时间为0时,路由器便会取消包发送,并发送一个ICMP TTL封包给原封包发出者。主叫方首先发出TTL = 1 的数据包,第一个路由器将 TTL 减1得0后就不再继续转发此数据包,而是返回一个ICMP超时报文,主叫方从超时报文中即可提取出数据包所经过的第一个路由器的地址。然后又发出一个TTL=2的ICMP数据包,可获得第二个路由器的地址,依次增加TTL便获取了沿途所有路由器位地址。 然后可以看到整条链路,死了话顺便还能看看死在哪了。

image.png

那么前面我们看到 “*” 都是节点不可达的点,这是因为有些节点没有把icmp协议放开或者别的原因,导致的超时,但是这不影响我们继续追踪,只要我们能拿到ip地址并且是我们的目标地址,那么追踪就结束了。当然也存在特殊情况,这个时候我们可以设置最多跳转的次数和超时次数(比如最多跳5次,都超时我也当结束了)。

细节:

这里的基本信息我写了个基础类

image.png

很多同学对当前网络类型一直很头疼,官方提供的Reachability虽然方便,但是较简单,2/3/4G切换的时候,Reachability虽然检测到了网络变化,但是类型还是蜂窝移动,不能给出具体的网络类型.我这里通过获取状态栏上的属性来判断。包括wifi强度也可以用相同方法。最后的示例图:

image.png

样例代码:https://github.com/Wbqqqq/NetWorkDiagnose

参考:

在IOS平台实现Ping 和 traceroute

iOS完美的网络状态判断工具

你可能感兴趣的:(iOS仿抖音网络检测)