背景
安卓客户端上报出不少UnknownHostException,引起了大家的重视,于是决定深入研究一番。
UnknownHostException是个什么异常?让我们来谷歌的源代码是怎么说的:
/**
* Thrown when a hostname can not be resolved.
*/
原来就是说域名无法被解析的时候会抛这个异常啊。那我就先来大致了解一下域名解析在客户端是怎么做的吧。
基本原理
通常客户端在进行接口调用、页面访问的时候都会通过域名来定位目标主机,从而与目标主机中的服务进行通信。不过,要定位一个进程,需要的是IP+端口号。所以我们要先把域名解析成IP形式。
这个过程大致是:客户端向域名服务器发送一个UDP请求,查询域名相对应的IP。服务器收到查询请求后,向客户端返回相应的IP。好吧,没有这么简单,实际过程要复杂得多。
我们这次会把注意力集中在客户端一侧,至于如何递归查询就不深入讨论了。下面我们抓包举例,这是友盟sdk在向它的服务器上传数据的开始过程。