深入理解Android Wi-Fi,NFC and GPS 学习笔记
第2 章深入了解Netd2.1 概述2.2 Netd 工作流程2.2.3 NetlinkManager2.2.3 CommandListener 分析2.2.4 DnsProxyListener 分析2.2.5 MDnsSdLinstener 分析2.3 CommandListener 命令2.3.1 iptables、tc 和ip 命令2.3.3 InterfaceCmd 命令2.3 .4 IpFwd 和FirewallCmd 命令2.3.5 ListTtysCmd 和PppdCmd 命令2.3.6 BandwidthControlCmd 和IdletimerControlCmd 命令2.3.7 NatCmd 命令2.3.8 TetherCmd 和SoftapCmd 命令2.3.9 ResolverCmd 命令2.4 NetworkManagementService 概述
第2章 深入理解Netd
2.1 概述
Netd是Android系统中的一个后台守护程序,具体负责网络管理和控制。其功能分为三个主要部分。
配置防火墙、网络地址转换(NAT)、带宽控制、无线网卡软接入点控制、网络设备绑定(Tether) 等在Android 网络服务搜索系统中缓存和管理DNS 信息(网络服务发现(NSD) 功能、包括服务注册、服务浏览和服务名称解析)。
Netd的工作流程与Vold类似,其工作可以分为两部分。
Netd接收并处理来自框架层的NetworkManagementService或NsdService的命令。这些命令最终由Netd中相应的Command对象来处理。 Netd接收来自内核的UEvent消息,进行解析,转发给框架层相应的服务进行处理。
2.2 Netd工作流程
当Netd启动时,它会创建三个TCP监听套接字,分别名为netd、dnsproxyd和mdns。
框架层的NetworkManagementService和NSD服务建立连接并与netd或mdns、监听套接字交互。所有调用与域名解析相关的套接字API(例如getaddrinfo和gethostbyname)的进程都与每个进程建立连接。通过dnspxoxyd 侦听套接字运行netd。
Netd的主要功能很简单,主要是创建几个重要的成员并开始相应的工作。这四位重要成员是:
Netlinkmanager:接收并处理来自内核的UEvent消息。这些消息经过NetlinkManager解析后,通过广播器发送到框架层的NetworkManagementServiceCommandListener、DnsProxyListener和MDnsSdListener。创建分别名为netd、dnsproxyd和mdns的监听套接字,用于处理来自客户端的命令。
2.2.3 NetlinkManager
NetlinkManager(以下简称NM)主要负责接收并解析来自内核的UEvent消息。其核心代码在start函数中
NM的start函数主要在内核中注册三个接受UEvent事件的socket。这三个UEvent对应于:
NETLINK_KOBJECT_UEVENT:表示一个kobject事件。这些事件中包含的信息以ASCII 字符串表示,因此上面的代码使用NETLINK_FOMRAT_ASCII。这表示采用字符串解析的方式来解析接收到的UEvent消息。 kobject 通常用于指示内核中特定模块的加载或卸载。对于NM,我们专注于加载或卸载位于/sys/class/net 中的相应模块的消息。
NETLINK_ROUTE:表示内核中某个路由或链接发生变化时对应的消息。 NETLINK_ROUTE包含许多子键,上面的代码使用了RTMGRP_LINK键。两者一起使用,表示当网络链路断开或连接时,NM希望接收相应的UEvent消息。由于对应的UEvent消息内部封装了nlmsghdr等相关结构,因此上述代码使用NETLINK_FORMAT_BINARY表示解析UEvent消息时采用二进制解析方式。
NETLINK_NFLOG:与带宽控制相关。 Netd 的带宽控制允许您设置预警值。当网络数据超过一定字节数时,会触发内核发送警告。此功能是iptables 的扩展。并非所有内核版本都支持NETLINK_NFLOG 相关套接字设置。同时,NFLLOG_QUOTA_GROUP值是直接在Netlinkmanager.cpp中定义的,而不是像其他类似的系统定义那样在系统头文件中定义。这也表明NFLLOG_QUOTA_GROUP 功能相对较新。
NetlinkHandler 和CommandListener 都是直接从SocketListener 入队的。其中,NetlinkHandler接收到的socket消息是通过onEvent回调进行处理的。
NetlinkManager注册了三个socket来接受UEvents,对应的NetlinkHandler分别是mUeventHandler、mRuoteHandler、mQuotaHandler。
NetlinkHandler 接收到的UEvent 消息将转换为NetlinkEvent 对象。 NetlinkEvent对象封装了解析UEvent消息的方法。对于NETLINK_FOMRAT_ASCII类型,调用parseAsciiNetlinkMessage函数;对于NETLINK_FOMRAT_BINARY类型,调用parseBinaryNetlinkMessage函数。
NM 处理流程的输入是已解析的NetlinkEvent 对象。一旦NM完成相应的工作,处理结果就通过mBroadcaster对象传递给框架层的接收者(NetworkManagementService)。
CommandListener 派生自FrameworkListener,FrameworkListener 内部有一个数组mCommands,用于存储向FrameworkListener 注册的命令处理对象。
2.2.3 CommandListener 分析
Netd的第二个最重要的成员是CommandListener(以下简称CL)。它的主要功能是接收来自框架层的NetworkManageService的命令。从角色角度来看,CL 只是一个监听者。接收到命令后,转发给对应的命令处理对象进行处理。 CL内部定义了很多命令,这些命令包含了深厚的背景知识。
CL定义了11个与网络相关的命令类。所有这些类都派生自NetdCommand(注意,为了简化绘图,这11个命令的派生关系用派生箭头表示)。 CL还定义了十个控制类,它们与命令类一起完成相应的命令处理任务。
2.2.4 DnsProxyListener 分析
1 Android DNS概述
DNS(Domain Name System)的主要功能是建立域名和IP地址之间的映射。简而言之,DNS 的工作原理就像一本电话簿,将人们的姓名映射到相应的电话号码。在DNS 中,人名是域名,电话号码是IP 地址。域名系统的管理由DNS 服务器完成。来自世界各地的DNS 服务器汇聚在一起,形成一个分散的域名和IP 数据库。
软件开发人员常用的域名解析套接字API有两种。
getaddrinfo:根据指定的主机名或服务名获取对应的IP地址getnameinfo:根据指定的IP地址获取对应的主机或服务名
2 分析getaddrinfo函数
Android平台上的getaddrinfo调用自定义的android_getaddrinfo_proxy函数来完成一些特殊操作。
3 DnsProxyListener命令缩写(DPL)
GetAddrInfoHandler的最终处理是由Bionic C的getaddrinfo函数完成的。根据上一篇文章,ANDROID_DNS_MODE环境变量是在Netd进程内设置的,因此从Netd调用getaddrinfo遵循正常流程。在这个正常的过程中,Netd进程会向指定的DNS服务器发起请求来解析域名。
2.2.5 MDnsSdLinstener 分析
MDnsSd 是多播DNS 服务发现的缩写。
MDnsSdListener对应的框架层服务是NsdService(Nsd代表Network Service Discovery),它是Android 4.1中新添加的框架层服务。
2.3 CommandListener中的命令
2.3.1 iptables、tc和ip命令
iptables命令
iptables是Linux系统上最重要的网络管理和控制工具。它与内核的netfilter模块配合工作,主要功能是在netfilter上配置一些过滤(fllter)或网络地址转换(NAT)规则。当内核收到网络数据包时,会根据iptables设定的规则执行相应的操作。在最简单的示例中,您可以使用iptables 设置防火墙规则,丢弃来自IP 地址192.168.1.108 的所有数据包。
TC命令
TC 是交通控制的缩写。在Linux系统中,流量控制是通过为数据包创建队列并控制每个队列内传输数据包的方式来实现的。
ip命令
ip命令是Linux系统另一个强大的网络管理工具。其主要特点是:
可以替代ifconfig命令。这意味着可以通过ip工具对系统中的网络接口进行管理,包括配置和查看网络接口的状态以及启用或禁用指定的网络接口。您可以替换root 命令。也就是说ip工具支持主机路由、网络路由、网关参数等配置。可以代替arp命令。换句话说,ip 工具可以帮助您查看、修改和管理系统的ARP 缓存等内容。
2.3.3 InterfaceCmd命令
InterfaceCmd用于管理和控制系统中的网络设备,支持多种控制选项。另外,InterfaceCmd不仅与控制对象InterfaceController交互,还与ThrottleController和SecondaryTableController交互。
2.3.4 IpFwd和 FirewallCmd 命令
IP转发命令
IpFwd命令比较简单,主要控制内核的ipforward功能。该命令支持三个选项。
status: 用于确定ipforward 功能是否启用。 Enable和disable:分别用于启用和禁用ipforward功能。
防火墙Cmd 命令
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(点对点协议)是一种链路层协议,设计用于简单链路,例如在对等单元之间发送数据包。该链路提供全双工操作并按顺序传送数据包。设计目的主要是建立点对点连接,用于通过拨号或租用线路传输数据,是各种主机、网桥和路由器之间简单连接的通用解决方案。
2.3.6 BandwidthControlCmd和IdletimerControlCmd命令
BandwidthControlCmd 命令
bwcc用于Android系统上的带宽控制。目前,4.2系统中的带宽控制可以针对设备和特定应用程序。此外,如果您的带宽使用量超过此值,您可以设置预警值(请参阅第2.2.2 节中的NETLINK_NFQLOG)。
与流量控制一样,带宽控制也是使用iptables 实现的。它使用iptables 扩展模块libxt_quota2 的功能,是使用iptables 的高级方式。对于那些不专门从事网络管理的人来说,这些主题可能相当困难。考虑到这一点,本节将bwcc 视为一个黑盒子,仅介绍它提供的功能。希望了解更多内容的读者应参阅参考资料以进一步了解。
IdletimerControlCmd 命令
icc使用另一个iptables扩展libxt_idletimer,对应的iptables命令格式如下:
2.3.7 NatCmd命令
NAT有两种:源NAT(SNAT)和目的NAT(DNAT),顾名思义,SNAT改变转发数据包的源地址,DNAT改变转发数据包的源地址。数据包。 Linux系统上的NAT操作是通过iptables中的nat表完成的。该表有三个默认链:
2.3.8 TetherCmd和SoftapCmd命令
TetherCmd 和SoftapCmd 命令都与称为Tether 的电话功能相关。简而言之,绑定功能将您的手机用作调制解调器。智能手机通常有多种方式连接到互联网,包括使用Wi-Fi 和Wi-Fi。
3G。在某些环境中,例如高铁,旅客只需将手机连接到笔记本电脑,打开3G 和网络连接,然后通过笔记本电脑使用手机访问互联网(智能手机正变得越来越流行)。在类似的场景中,我不得不使用3G来访问我的上网卡。
2.3.9 ResolverCmd命令
ResolverCmd与Android系统中的DNS实现相关,用于为不同的网卡设备配置不同的DNS。它主要支持四种选项。
setdefaultif: 设置DNS 查询期间的默认NIC。这与Android中的DNS实现有关。 setifdns: 设置各种网卡的DNS配置信息。 flashdefaultif、flushif: 清除默认或特定的NIC DNS 配置信息。
2.4 NetworkManagementService介绍
根据上一篇文章,NetworkManagementService(NMService)通过“netd”套接字与Netd交互。
以上深入了解#Android Wi的相关内容来源仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91593.html