深入理解Android Wi-Fi 第二章笔记

深入理解Android Wi-Fi,NFC and GPS 学习笔记

  • [第2章 深入理解Netd](#第2章 深入理解Netd)
    • [2.1 概述](#2.1 概述)
    • [2.2 Netd工作流程](#2.2 Netd工作流程)
    • [2.2.3 NetlinkManager](#2.2.3 NetlinkManager)
    • [2.2.3 CommandListener 分析](#2.2.3 CommandListener 分析)
    • [2.2.4 DnsProxyListener 分析](#2.2.4 DnsProxyListener 分析)
    • [2.2.5 MDnsSdLinstener 分析](#2.2.5 MDnsSdLinstener 分析)
    • [2.3 CommandListener中的命令](#2.3 CommandListener中的命令)
    • [2.3.1 iptables、tc和ip命令](#2.3.1 iptables、tc和ip命令)
    • [2.3.3 InterfaceCmd命令](#2.3.3 InterfaceCmd命令)
    • [2.3.4 IpFwd和 FirewallCmd 命令](#2.3.4 IpFwd和 FirewallCmd 命令)
    • [2.3.5 ListTtysCmd和PppdCmd命令](#2.3.5 ListTtysCmd和PppdCmd命令)
    • [2.3.6 BandwidthControlCmd和IdletimerControlCmd命令](#2.3.6 BandwidthControlCmd和IdletimerControlCmd命令)
    • [2.3.7 NatCmd命令](#2.3.7 NatCmd命令)
    • [2.3.8 TetherCmd和SoftapCmd命令](#2.3.8 TetherCmd和SoftapCmd命令)
    • [2.3.9 ResolverCmd命令](#2.3.9 ResolverCmd命令)
    • [2.4 NetworkManagementService介绍](#2.4 NetworkManagementService介绍)

第2章 深入理解Netd

2.1 概述

Netd是Android系统中专门负责网络管理和控制的后台daemon程序,其功能主要分三部分。

  • 设置防火墙(Firewall)、网络地址转换(NAT)、带宽控制、无线网卡软接入点(Soft Access Point)控制、网络设备绑定(Tether)等
  • Android 系统中DNS信息的缓存和管理
  • 网络服务搜索(Net Service Discovery,NSD)功能,包括服务注册(Service Registration)、服务搜索(Service Browse)和服务名解析(Service Resolve)等

Netd的工作流程和Vold类似,其工作可分为两部分

  • Netd接收并处理来自Framework层中NetworkManagementService或NsdService的命令。这些命令最终由Netd中对应的Command对象去处理
  • Netd接受并解析来自Kernel的UEvent消息,然后再转发给Framework层中对应Service去处理

2.2 Netd工作流程

Netd启动时将创建三个TCP 监听socket,其名称分别为netd、dnsproxyd和mdns

  • Framework层中的NetworkManagementService和Nsd-service将分别和netd即mdns监听socket建立连接并交互
  • 每一个调用和域名解析相关的socket API(如getaddrinfo或gethostbyname)的进程都会借由dnspxoxyd监听socket与netd建立连接

Netd的main 函数非常简单,主要是创建几个重要成员并启动相应的工作,这四个重要成员分别如下:

  • Netlinkmanager:接收并处理来自Kernel的UEvent消息。这些消经NetlinkManager解析后将借助它的Broadcaster发送给Framework层的NetworkManagementService
  • CommandListener、DnsProxyListener、MDnsSdListener:分别创建名为 netd、dnsproxyd、mdns 的监听 socket,并处理来客户端的命令

2.2.3 NetlinkManager

NetlinkManager(以后简称NM)主要负责接收并解析来自Kernel的UEvent消息。其核心代码在start函数中

NM的start函数主要是向kernel注册三个用于接受UEvent事件的socket,这三个UEvent分别对应于以下内容

  • NETLINK_KOBJECT_UEVENT:代表kobject事件,由于这些事件包含的信息由ASCII字符串表达,故上述代码中使用NETLINK_FOMRAT_ASCII。它表示将采用字符串解析的方法去解析接收到的UEvent消息。kobject一般用来通知内核中某个模块的加载或卸载。对于NM来说,其关注的是/sys/class/net下相应模块的加载或卸载消息

  • NETLINK_ROUTE:代表kernel中routing或link改变时对应的消息。NETLINK_ROUTE包含很多子项,上述代码中使用了RTMGRP_LINK项。二者结合起来使用,表示NM希望收到网络链路断开或接通时对应的UEvent消息。由于对应UEvent消息内部封装了nlmsghdr等相关结构体,故上述代码使用了NETLINK_FORMAT_BINARY来指示解析UEvent消息时将使用二进制的解析方法

  • NETLINK_NFLOG:和带宽控制有关。Netd中的带宽控制可以设置一个预警值,当网络数据超过一定字节数就会触发Kernel发送一个警告。该功能属于iptables的扩展项。NETLINK_NFLOG相关socket的设置并非所有Kernel版本都支持。同时,NFLOG_QUOTA_GROUP的值是直接定义在Netlinkmanager.cpp中的,而非和其他类似系统定义一样定义在系统头文件中,这也表明NFLOG_QUOTA_GROUP的功能比较新

  • NetlinkHandler和 CommandListener均间接从SocketListener排成。其中,NetlinkHandler收到的socket消息将通过onEvent回调处理

  • NetlinkManager分别注册了三个用于接受UEvent的socket,其对应的NetlinkHandler分别是mUeventHandler、mRuoteHandler和mQuotaHandler

  • NetlinkHandler接收到的UEvent消息会转换成一个NetlinkEvent对象。NetlinkEvent对象封装了对UEvent消息的解析方法。对于NETLINK_FOMRAT_ASCII类型,其parseAsciiNetlinkMessage函数会被调用,而对于NETLINK_FOMRAT_BINARY类型,其parseBinaryNetlinkMessage函数会被调用

  • NM处理流程的输入为一个解析后的NetlinkEvent对象。NM完成相应工作后,其处理结果将经由mBroadcaster对象传递给Framework层的接收者,也就是NetworkManagementService

  • CommandListener从FrameworkListener派生,而FrameworkListener内部有一个数组mCommands,用于存储注册到FrameworkListener中的命令处理对象

2.2.3 CommandListener 分析

Netd中第二个重要成员是CommandListener(以后简称CL),其主要作用是接收来自Framework层NetworkManageService的命令。从角色来看,CL仅是一个Listener。它在收到命令后,只是将它们转交给对应的命令处理对象去处理。CL内部定义了许多命令,而这些命令都有较深的背景知识。

CL定义了11个和网络相关的Command类。这些类均从NetdCommand派生(注意,为保持绘图简洁,这11个Command的派生关系由1个派生箭头表达)。CL还定义了10个控制类,这些控制类将和命令类共同完成相应的命令处理工作。

2.2.4 DnsProxyListener 分析

1 Android DNS 简介

DNS(Domain Name System,域名系统)主要作用是在域名和IP地址之间建立一种映射。简单来说,DNS的功能类似于电话簿,它可将人名映射到相应的电话号码。在DNS中,人名就是域名,电话号码就是IP地址。域名系统的管理由DNS服务器来完成。全球范围内的DNS服务器共同构成了一个分布式的域名-IP数据库。

对软件开发者来说,常用的域名解析socket API 有两个

  • getaddrinfo:根据指定的host名或service名得到对应的IP 地址
  • getnameinfo:根据指定的IP 地址得到对应的host 或 service的名称

2 getaddrinfo 函数分析

Android平台中的getaddrinfo会调用其定制的android_getaddrinfo_proxy函数完成一些特殊操作

3 DnsProxyListener 命令 简称(DPL)

GetAddrInfoHandler最终的处理还是交由Bionic C的getaddrinfo函数来完成。根据前文所述,由于Netd进程设置了ANDROID_DNS_MODE环境变量,故Netd调用的getaddrinfo将走正常的流程。这个正常流程就是Netd进程将向指定的DNS服务器发起请求以解析域名。

2.2.5 MDnsSdLinstener 分析

MDnsSd是Multicast DNS Service Discovery的简称

MDnsSdListener对应的Framework层服务为NsdService(Nsd为Network ServiceDiscovery的缩写),它是Android 4.1新增的一个Framework层Service

2.3 CommandListener中的命令

2.3.1 iptables、tc和ip命令

  1. iptables 命令

    iptables是Linux系统中最重要的网络管控工具。它与Kernel中的netflter模块配合工作,其主要功能是为netfilter设置一些过滤(flter)或网络地址转换(NAT)的规则。当Kernel收到网络数据包后,将会依据iptables设置的规则进行相应的操作。举个最简单的例子,可以利用iptables设置这样一条防火墙规则:丢弃来自IP地址为192.168.1.108的所有数据包。

  2. tc命令

    TC是Traffic Control的缩写。在Linux系统中,流量控制是通过建立数据包队列(Queue),并控制各个队列中数据包的发送方式来实现的

  3. ip命令

    ip命令是Linux系统中另一个强大的网络管理工具,主要功能如下。

  • 可替代ifconfig命令。即通过ip工具可管理系统中的网络接口,包括配置并查看网络接口情况、使能或禁止指定网络接口。
  • 可替代route命令。即ip工具支持设置主机路由、网络路由、网关参数等。
  • 可替代arp命令。即ip工具支持查看、修改和管理系统的ARP缓存等。

2.3.3 InterfaceCmd命令

InterfaceCmd用来管理和控制系统中的网络设备,其支持较多的控制选项。另外,InterfaceCmd除了和控制对象InterfaceController交互外,还会和ThrottleController、SecondaryTableController交互。

2.3.4 IpFwd和 FirewallCmd 命令

  1. IpFwd 命令
    IpFwd命令比较简单,主要是控制内核ipforward功能,其支持三个选项。
  • status:用于判断ipforward功能是否开启。
  • enable和disable:分别用于启动和禁止ipforward功能。
  1. FirewallCmd命令
    FirewallCmd用于防火墙控制。它支持以下命令选项。
  • enable和is_enabled:用于启动防火墙和判断防火墙是否已经启动。
  • set_interface_rule:针对单个或多个NIC设备设置防火墙规则。
  • set_egress_source_rule和set_egress_dest_rule:基于源IP和目标IP地址设置防火墙。
  • set_uid_rule:根据uid设置单个进程的防火墙。

2.3.5 ListTtysCmd和PppdCmd命令

(1)TTY和 ptmx编程

TTY是Linux系统(更确切地说是UNIX)中终端设备的统称,该词源于TeleTYpewriter(电传打字机),是一个通过串行线用打印机键盘通过阅读和发送信息的设备。不过随着计算机技术的发展,这类设备早就被键盘和显示器替代了。

(2)PPP 和 pppd

PPP(Point-to-Point Protocol,点对点协议)是为在同等单元之间传输数据包这样的简单链路设计的链路层协议。这种链路提供全双工操作,并按照顺序传递数据包。设计目的主要是通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案。

2.3.6 BandwidthControlCmd和IdletimerControlCmd命令

  1. BandwidthControlCmd 命令

    bwcc用于Android系统中的带宽控制。目前4.2系统中的带宽控制可针对设备、某个应用。另外还可以设置预警值,当带宽使用超过该值时会收到相应的通知(见2.2.2节中的NETLINK_NFQLOG)。

    和流量控制类似,带宽控制的实现也是利用iptables。它利用了iptables中扩展模块libxt_quota2的功能,属于iptables的高级用法。这些内容对于非从事网络管理专业工作的人来说难度相当大。考虑到这个因素,本节将把bwcc当做一个黑盒,仅介绍其提供的各项功能。想深入研究的读者可在此基础上结合参考资料进一步了解。

  2. IdletimerControlCmd命令

    icc利用了iptables另一个扩展模块libxt_idletimer,其对应的iptables命令格式如下。

2.3.7 NatCmd命令

NAT分为两种,分别是源NAT(SNAT)和目的NAT(DNAT),顾名思义,SNAT就是改变转发数据包的源地址,DNAT就是改变转发数据包的目的地址。Linux系统上的NAT操作是通过iptables的nat表来完成,该表有三条默认Chain,它们分别如下。

2.3.8 TetherCmd和SoftapCmd命令

TetherCmd和SoftapCmd命令都和手机中一项名为绑定(Tether)的功能相关。简单来说,绑定功能即把手机当成Modem用。智能手机一般都有多种连接网络的方式,例如使用Wi-Fi或

3G。在某些环境下如高铁列车上,差旅人士只要把手机接到笔记本上,然后开启3G和Tether,笔记本就可以利用手机上网了(在智能机普及前,类似的场景中就需要使用3G上网卡)。

2.3.9 ResolverCmd命令

ResolverCmd和Android系统中DNS的实现有关,用于给不同NIC设备配置不同的DNS。其主要支持四个选项。

  • setdefaultif:设置DNS查询时默认的NIC。和Android中DNS的实现有关。
  • setifdns:设置不同NIC的DNS配置信息。
  • flushdefaultif、flushif:清空默认或某个NIC的DNS配置信息。

2.4 NetworkManagementService介绍

根据前文所述,NetworkManagementService(以后简称NMService)将通过"netd"socket和Netd交互

相关推荐
CYRUS_STUDIO12 分钟前
利用 Linux 信号机制(SIGTRAP)实现 Android 下的反调试
android·安全·逆向
CYRUS_STUDIO30 分钟前
Android 反调试攻防实战:多重检测手段解析与内核级绕过方案
android·操作系统·逆向
黄林晴4 小时前
如何判断手机是否是纯血鸿蒙系统
android
火柴就是我4 小时前
flutter 之真手势冲突处理
android·flutter
法的空间5 小时前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
循环不息优化不止5 小时前
深入解析安卓 Handle 机制
android
恋猫de小郭5 小时前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
jctech5 小时前
这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感
android·开源
用户2018792831675 小时前
为何Handler的postDelayed不适合精准定时任务?
android
_落纸5 小时前
三大基础无源电子元件——电阻(R)、电感(L)、电容(C)
笔记