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

第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交互

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值