Android第五次面试总结(网络篇)

发布于:2025-03-23 ⋅ 阅读:(27) ⋅ 点赞:(0)

一、引言:为什么需要 DNS?

在浏览器输入www.example.com的瞬间,一场跨越全球的数字接力赛悄然启动。DNS(域名系统)如同互联网的 “电话号码簿”,将人类可读的域名转化为机器可识别的 IP 地址。本文将以工程师的视角,拆解这一过程的技术细节。

二、DNS 解析全流程:7 大关键步骤

1. 本地缓存快速响应

  • 浏览器缓存:Chrome/Firefox 等会存储最近访问的域名(默认 5 分钟),可通过chrome://net-internals/#dns查看。
  • 系统 hosts 文件:优先级最高的本地配置(如C:\Windows\System32\drivers\etc\hosts),常用于本地开发或屏蔽广告。
  • 系统 DNS 缓存:Windows 通过ipconfig /displaydns查看,Linux/macOS 用dscacheutil -flushcache清除。

2. 递归查询本地 DNS 服务器

  • 运营商 DNS:通常为202.96.128.86等地址,客户端发送请求后,服务器全程负责解析(递归查询)。
  • 对比迭代查询:根服务器仅返回下一步查询的服务器地址列表,客户端需自己继续查询(如本地 DNS→根服务器的交互)。

3. 根服务器层级解析

  • 根服务器架构:全球 13 组根服务器(a.root-servers.netm.root-servers.net),通过 Anycast 技术实现分布式部署。
  • 顶级域名服务器(TLD)
    • .com由 Verisign 运营,.cn由中国互联网络信息中心管理。
    • 根服务器返回.com服务器地址(如a.gtld-servers.net)。

4. 权威服务器最终响应

6. 协议细节与安全扩展

7. 解析失败排查指南

2. DNSSEC:抵御中间人攻击

通过数字签名验证解析结果真实性,防止 DNS 劫持。权威服务器需配置 DS 记录,验证链如下:

三、核心技术深度解析

1. 递归查询 vs 迭代查询

类型 执行者 响应内容 适用场景
递归查询 本地 DNS 服务器 最终 IP 地址或错误 客户端→本地服务器
迭代查询 根 / TLD / 权威服务器 下一步查询的服务器地址列表 本地服务器→根 / TLD 服务器

  • 域名管理权限:由注册商(如阿里云 / GoDaddy)配置,存储A记录(IPv4)、AAAA记录(IPv6)等。
  • 查询路径示例
    本地DNS → 根服务器 → .com服务器 → example.com权威服务器

    5. 多级缓存机制优化

  • TTL(生存时间):权威服务器在响应中携带 TTL 字段(如TTL=86400表示缓存 1 天)。
  • 缓存层级:客户端、本地 DNS 服务器、递归过程中缓存所有中间结果。
  • 查询协议:默认 UDP 53 端口(速度快),超过 512 字节自动切换到 TCP。
  • 安全技术
    • DNSSEC:通过数字签名验证结果真实性。
    • DoH/DoT:加密查询流量(如 Chrome 默认启用 DoH)。
  • 常见错误码
    • NXDOMAIN:域名不存在
    • SERVFAIL:服务器内部错误
    • 超时:网络问题或服务器过载
  • 排查工具
    • Windows:nslookup www.baidu.com
    • Linux/macOS:dig @8.8.8.8 www.google.com
    • 路径追踪:traceroute -n www.qq.com

2. DNSSEC:抵御中间人攻击

通过数字签名验证解析结果真实性,防止 DNS 劫持。权威服务器需配置 DS 记录,验证链如下:

根服务器 → TLD服务器 → 权威服务器 → 域名记录

3. Anycast 技术:全球负载均衡

根服务器和 TLD 服务器通过 Anycast 技术,将相同 IP 映射到全球多个物理节点,实现就近响应。例如,访问a.root-servers.net会自动连接到最近的节点。

四、典型案例:解析www.example.com

  1. 本地缓存未命中,客户端向本地 DNS 服务器发起递归查询。
  2. 本地 DNS 服务器向根服务器查询.com服务器地址。
  3. 根服务器返回.com顶级服务器 IP(如a.gtld-servers.net)。
  4. 本地 DNS 服务器向.com服务器查询example.com权威服务器地址。
  5. .com服务器返回example.com权威服务器 IP。
  6. 权威服务器返回www.example.com对应的 IP(如93.184.216.34)。
  7. 本地 DNS 服务器缓存结果并返回客户端,浏览器通过 IP 访问网站。

Android 中的 DNS 实现与网络解析全攻略

一、Android 系统 DNS 配置体系

1. 系统级 DNS 设置

  • 获取方式:通过 DHCP 协议从路由器获取(如192.168.1.1
  • 存储路径/system/etc/dnsmasq.conf(系统级)、/data/misc/dns/(用户级)
  • 切换逻辑:当连接到不同 Wi-Fi 时,系统会自动更新 DNS 服务器地址

2. 应用层 DNS 策略

// 获取系统默认DNS服务器
List<InetAddress> dnsServers = NetworkCapabilities.getDnsServers(network);
// 设置自定义DNS(需系统权限)
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest request = new NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
    .setDnsServers(InetAddress.getAllByName("1.1.1.1"))
    .build();
cm.requestNetwork(request, new ConnectivityManager.NetworkCallback() { ... });

二、Android DNS 解析流程深度剖析

1. 系统层解析流程

 

2. 应用层解析方案对比

方案 实现方式 适用场景 优缺点分析
Java 原生 InetAddress.getAllByName() 基础网络请求 简单易用,但无缓存控制
OkHttp 自定义 Dns 实现 需要灵活控制解析行为 支持同步 / 异步解析,可配置缓存策略
WebView Chromium 内置解析 混合开发场景 与浏览器解析逻辑一致,性能优化好

三、Android DNS 优化实践

1. 缓存策略优化

 

// OkHttp自定义DNS缓存
public class CachedDns implements Dns {
    private final Dns delegate;
    private final LruCache<String, InetAddress> cache = new LruCache<>(1024);

    public CachedDns(Dns delegate) {
        this.delegate = delegate;
    }

    @Override
    public List<InetAddress> lookup(String hostname) throws UnknownHostException {
        if (cache.get(hostname) != null) {
            return cache.get(hostname);
        }
        List<InetAddress> addresses = delegate.lookup(hostname);
        cache.put(hostname, addresses);
        return addresses;
    }
}

2. 连接复用与性能提升

  • TCP 长连接:通过ConnectionPool管理持久连接
  • 预解析技术:在应用启动时预解析关键域名
  • HTTP/2 推送:利用服务端推送技术减少 DNS 延迟

四、Android DNS 安全实践

1. DoH/DoT 支持

// Android 9+启用DoH
NetworkRequest request = new NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .setDnsOption(NetworkCapabilities.DNS_TLS)
    .setDnsServers(InetAddress.getAllByName("1.1.1.1"))
    .build();

2. 防止 DNS 劫持

  • 证书固定:验证服务器证书链
  • 加密传输:强制使用 HTTPS
  • DNSSEC 验证:通过DnsResolver接口实现验证逻辑

五、常见问题诊断方案

1. 解析失败排查

# 通过adb查看系统DNS请求
adb shell
logcat -b events | grep "dns_.*query"

2. 性能分析工具

  • Netstat:监控网络连接状态
  • Traceroute:追踪路由路径
  • Network Profiler:Android Studio 内置网络分析工具

六、最佳实践总结

  1. 缓存策略:实现二级缓存(应用层 + 系统层)
  2. 协议选择:优先使用 DoH/DoT 加密解析
  3. 性能监控:建立 DNS 解析耗时统计体系
  4. 容灾方案:配置备用 DNS 服务器(如 114.114.114.114)
  5. 版本适配:针对 Android 8 以下系统进行兼容性处理

  通过深入理解 Android DNS 解析机制,开发者可以构建更健壮、更安全的网络连接方案。未来随着 5G 网络的普及和边缘计算的发展,DNS 解析将在移动应用中扮演更加重要的角色,需要持续关注技术演进并进行针对性优化。

感谢观看!!!