Android libc中dns部分源码分析
文章平均质量分 68
本专栏旨在通过分析Android libc中dns部分的关键源代码,方便分析定位移动通信网络中常见的DNS无响应以及响应延时大的问题。
fanxiaoyu321
天道酬勤
展开
-
Android DNS之查询数据包的hash值
在Android之DNS查询结果缓存中有提到一个DNS查询时的行为:==如果当前已经有一个相同的查询发出,那么后来的查询请求实际上会block,等待前一次的查询返回,如果成功那么一起返回,失败则后面的请求还会及其发起。==这篇笔记就来看看到底是如何判断两个DNS查询请求是不是完全相同的。之所以要分析这个过程,是因为在实际问题定位过程中,如果看到两个对相同域名的DNS查询请求相隔不远,总会有疑问,...原创 2018-10-30 01:54:36 · 745 阅读 · 0 评论 -
Android DNS之查询库函数接口
概述这篇笔记总结下,为了实现域名<–>IP地址、服务名<–>端口号之间的转换,系统到底对外提供了哪些接口。域名<–>IP地址转换域名–>IP地址gethostbyname()struct hostent *gethostbyname(const char *name);getaddrinfo()int g原创 2018-09-17 00:40:12 · 1049 阅读 · 0 评论 -
Android DNS之gethostbyname()的实现
原型解读struct hostent *gethostbyname(const char *name);入参字符串name可取的值分为三种类型:十进制数字格式的IPv4地址十六进制数字格式的IPv6地址域名返回值返回值为指向struct hostent类型的指针,调用者显然没有提前分配它,那么该结构一定是有内部实现分配的,所以该函数是不可重入的。struct hostent结...原创 2018-09-17 23:53:41 · 4234 阅读 · 6 评论 -
Android DNS之查询过程分发: nsdispatch()
原型解读struct hostent *gethostbyname(const char *name);入参字符串name可取的值分为三种类型: 1. 十进制数字格式的IPv4地址 2. 十六进制数字格式的IPv6地址 3. 域名对于1和2,根本不需要发起真正的查询,直接内部转换成返回值需要的格式即可。返回值返回值为指向struct hostent类型的指...原创 2018-09-17 00:44:12 · 1169 阅读 · 0 评论 -
Android DSN之查询域名处理: res_search
res_nsearch()/* * Formulate a normal query, send, and retrieve answer in supplied buffer. * Return the size of the response on success, -1 on error. * If enabled, implement search rules until answ...原创 2018-09-18 23:36:07 · 2062 阅读 · 4 评论 -
Android DNS之发送查询报文: res_nsend()
res_nsend()@statp: resolver状态结构@buf:组装好的DNS查询报文@buflen:查询报文长度@ans:用户保存响应报文的缓存区@anssiz:响应报文的长度int res_nsend(res_state statp, const u_char *buf, int buflen, u_char *ans, int anssiz){ int gotsome...原创 2018-09-19 22:32:03 · 2456 阅读 · 0 评论 -
Android DNS之DNS参数设置
概述ConnectivityService会通过netd将DNS参数设置到解析库的cache中,设置接口是_resolv_set_nameservers_for_net(),后续在DNS查询过程中,解析库会从cache中获取设置的DNS服务器地址。数据结构Android中,将DNS信息保存到了resolv_cache_info中,该结构中与DNS有关的信息如下所示:struct resol...原创 2018-09-20 23:44:31 · 20190 阅读 · 12 评论 -
Android DNS之查询结果缓存
核心数据结构resolv_cache_info每个网卡都有一个该结构,用于保存该网卡相关的DNS配置信息,以及在该网卡上进行的DNS查询结果缓存信息,系统中所有网卡的该结构信息组织成一个单链表。struct resolv_cache_info { //网卡的netid unsigned netid; //DNS查询缓存结果 Ca...原创 2018-09-21 20:32:55 · 3969 阅读 · 0 评论 -
Android DNS之惩罚机制
数据结构统计信息同样是基于网卡的,所以理所当然的,这些信息保存在了resolv_cache_info中,该结构中与统计有关的信息如下:struct resolv_cache_info { struct __res_params params; //每个DNS服务器地址都有一个自己的统计信息 struct __res_stats nsst...原创 2018-09-22 20:36:32 · 1497 阅读 · 0 评论 -
Android DNS之getaddrinfo()的实现
这篇笔记分析了库函数getaddrinfo()的代码实现。原型解读int getaddrinfo(const char *hostname, const char *servname, const struct addrinfo *hints, struct addrinfo **res);hostname: 和gethostbyname()的入参hostname相同,要查询的域...原创 2018-09-23 20:27:47 · 7531 阅读 · 7 评论