Android Netd
https://izobs.gitbooks.io/android-framework-development-guide/content/network/android_network.html
Netd是Android的网络守护进程。NetD是个网络管家,封装了复杂的底层各种类型的网络(NAT,PLAN,PPP,SOFTAP,TECHER,ETHO,MDNS等),隔离了底层网络接口的差异,给Framework提供了统一调用接口,简化了网络的使用。NetD主要功能是:
- 第一、接收Framework的网络请求,处理请求,向Framework层反馈处理结果;
- 第二、监听网络事件(断开/连接/错误等),向Framework层上报。
NetD程序的大概逻辑: [Kernel] <--Network Event--> (NetD) <--Command--> [Framework]。事件和命令传送采用跨进程通信机制(SOCKET).
Netd:
/System/netd
/system/core/libsysutils/src
/system/core/include/sysutils
Framework:
/frameworks/base/services/java/com/android/server
int main() {
CommandListener *cl;
NetlinkManager *nm;
DnsProxyListener *dpl;
MDnsSdListener *mdnsl;
FwmarkServer* fwmarkServer;
ALOGI("Netd 1.0 starting");
blockSigpipe();
//NetlinkManager是用于接收kernel中的uevent
if (!(nm = NetlinkManager::Instance())) {
ALOGE("Unable to create NetlinkManager");
exit(1);
};
//接收来自Framework层NetworkManageService的命令
cl = new CommandListener();
nm->setBroadcaster((SocketListener *) cl);
if (nm->start()) {
ALOGE("Unable to start NetlinkManager (%s)", strerror(errno));
exit(1);
}
// Set local DNS mode, to prevent bionic from proxying
// back to this service, recursively.
//对接frameworklistener
//GetAddrInfoCmd,和Bionic C库的getaddrinfo函数对应。
//GetHostByAddrCmd,和Bionic C库的gethostbyaddr函数对应。
setenv("ANDROID_DNS_MODE", "local", 1);
dpl = new DnsProxyListener(CommandListener::sNetCtrl);
if (dpl->startListener()) {
ALOGE("Unable to start DnsProxyListener (%s)", strerror(errno));
exit(1);
}
//MDnsSd是Multicast DNS Service Discovery的简称,它和Apple公司的Bonjour技术有关
//Bonjour使得局域网中的系统和服务即使在没有网络管理员的情况下也很容易被找到。
//举一个简单的例子:在局域网中,如果要进行打印服务,必须先知道打印服务器的IP地址。
//此IP地址一般由IT部门的人负责分配,然后他还得全员发邮件以公示此地址。有了Bonjour以后,
//打印服务器自己会依据零配置网络标准在局域网内部找到一个可用的IP并注册一个打印服务?
//名为“print service”之类的。当客户端需要打印服务时,会先搜索网络内部的打印服务器。
//由于不知道打印服务器的IP地址,客户端只能根据诸如"print service"的名字去查找打印机
mdnsl = new MDnsSdListener();
if (mdnsl->startListener()) {
ALOGE("Unable to start MDnsSdListener (%s)", strerror(errno));
exit(1);
}
//创建 FwmarkServer并启动监听,它将创建名为fwmarkd的监听
fwmarkServer = new FwmarkServer(CommandListener::sNetCtrl);
if (fwmarkServer->startListener()) {
ALOGE("Unable to start FwmarkServer (%s)", strerror(errno));
exit(1);
}
/*
* Now that we're up, we can respond to commands
*/
if (cl->startListener()) {
ALOGE("Unable to start CommandListener (%s)", strerror(errno));
exit(1);
}
// Eventually we'll become the monitoring thread
while(1) {
sleep(1000);
}
ALOGI("Netd exiting");
exit(0);
}
Netd的main函数主要是创建几个重要成员并启动相应的工作,这四个重要成员分别如下:NetlinkManager:接收并处理来自Kernel的UEvent消息。这些消息经NetlinkManager解析后将借助它的Broadcaster(也就是代码中为NetlinkManager设置的CommandListener)发送给Framework层的 NetworkManagementService。
CommandListener、DnsProxyListener、MDnsSDListener、FwmarkServer:分别创建名为netd、dnsproxyd、mdns、fwmarkServer的监听socket.
下面针对上面提到主要成员进行分析。