ntopng源码分析
参数初始化以及ntop主流程启动
#ifndef WIN32
if((argc == ) && (argv[][] != '-'))
rc = prefs->loadFromFile(argv[]);
else
#endif
//一般启动ntopng的命令: ntopng /etc/ntopng/ntopng.conf 上面的代码就是读取配置文件/etc/ntopng/ntopng.conf里的配置信息。
prefs->registerNetworkInterfaces(); if(prefs->get_num_user_specified_interfaces() == ) {
/* We add all interfaces available on this host */
prefs->add_default_interfaces();
}
//通过配置文件配置的interface信息注册可以使用的网卡信息:
//如果没有配置网卡,ntopng会调用pcap的接口去查找所有可用的网卡,并注册。 注:ntopng的配置文件跟命令行参数的输入是一样的 这种统一的配置方式非常方便,值得借鉴。
// enable all protocols
NDPI_BITMASK_SET_ALL(all);
ndpi_set_protocol_detection_bitmask2(ndpi_struct, &all);
// NetworkInterface类 初始化了协议检查的所有类型,并提供了报文分析的函数。 if(iface == NULL) {
try {
iface = new PcapInterface(ifName);
} catch(...) {
ntop->getTrace()->traceEvent(TRACE_ERROR, "Unable to create interface %s", ifName);
iface = NULL;
}
}
//ntopng 默认使用libpcap来处理网卡抓包,这里默认使用PcapInterface这个类,PcapInterface继承了NetworkInterface类。 iface->setCPUAffinity(core_id);
//如果是多核多网卡的服务器,则需要考虑到性能,设置CPU亲和度,保证每个网卡能有对应的CPU处理 ntop->start();
//至此,进入抓包解析流程
HTTPServer的初始化端口和lua CGI支持
ntop->registerHTTPserver(new HTTPserver(prefs->get_http_port(),
prefs->get_docs_dir(),
prefs->get_scripts_dir()));
//这里注册http服务器,以便后续的web监控使用。 callbacks.begin_request = handle_lua_request;
httpd_v4 = mg_start(&callbacks, NULL, (const char**)http_options);
//然后调用第三方的http库,启用多线程的httpserver。
//callbacks包含了处理http中请求lua脚本的功能函数。 来到third-party/mongoose/mongoose.c文件, 函数mg_start:
// Start master (listening) thread
mg_start_thread(master_thread, ctx); // Start worker threads
for (i = ; i < atoi(ctx->config[NUM_THREADS]); i++) {
if (mg_start_thread(worker_thread, ctx) != ) {
cry(fc(ctx), "Cannot start worker thread: %d", ERRNO);
} else {
ctx->num_threads++;
}
}
//master_thread负责监听,并将accept接受的socket缓存到ctx->queue中;
//worker_thread负责处理ctx->queue缓存的socket处理http请求。 static void prepare_lua_environment(struct mg_connection *conn, lua_State *L)
.....
// Register "print" function which calls mg_write()
lua_pushlightuserdata(L, conn);
lua_pushcclosure(L, lsp_mg_print, );
lua_setglobal(L, "print"); // Register mg_read()
lua_pushlightuserdata(L, conn);
lua_pushcclosure(L, lsp_mg_read, );
lua_setglobal(L, "read");
//上面的代码注册了lua脚本使用的print和read函数。
//prepare_lua_environment函数使得httpserver支持lua脚本作为CGI语言。
//后续就可以通过lua脚本来回应web客户端的各种request;
//lua又通过lua c api的扩展来获取后面报文分析的结果来填充网页的请求。
抓包和报文分析主流程
下面的代码是在src/ntopng.cpp start函数:
for(int i=; i<num_defined_interfaces; i++) {
iface[i]->allocateNetworkStats();
iface[i]->startPacketPolling();
}
//allocateNetworkStats 初始化网络统计功能
//开始抓包
//startPacketPolling 注意是一个虚函数,这里是多态,实际是PcapInterface的startPacketPolling 函数。
下面来到src/PcapInterface.cpp文件:
void PcapInterface::startPacketPolling() {
pthread_create(&pollLoop, NULL, packetPollLoop, (void*)this);
pollLoopCreated = true;
NetworkInterface::startPacketPolling();
} //startPacketPolling函数创建了一个线程,线程主要处理函数是packetPollLoop。
//static void* packetPollLoop(void* ptr), 就定义在PcapInterface.cpp文件里。 //packetPollLoop函数开始了报文复制和分析的过程
FILE *pcap_list = iface->get_pcap_list();
......
hdr->caplen = min_val(hdr->caplen, iface->getMTU());
iface->dissectPacket(hdr, pkt, &shaped, &p);
//dissectPacket 是NetworkInterface类的成员函数,里面开始了复杂的报文解析流程。。。
//bool dissectPacket(const struct pcap_pkthdr *h, const u_char *packet, bool *shaped, u_int16_t *ndpiProtocol);
//分析出报文的类型之后,将报文传给processPacket函数处理和统计
bool processPacket(const struct bpf_timeval *when,
const u_int64_t time,
struct ndpi_ethhdr *eth,
u_int16_t vlan_id,
struct ndpi_iphdr *iph,
struct ndpi_ipv6hdr *ip6,
u_int16_t ipsize, u_int16_t rawsize,
const struct pcap_pkthdr *h,
const u_char *packet,
bool *shaped,
u_int16_t *ndpiProtocol); inline void incStats(time_t when, u_int16_t eth_proto, u_int16_t ndpi_proto,
u_int pkt_len, u_int num_pkts, u_int pkt_overhead) {
ethStats.incStats(eth_proto, num_pkts, pkt_len, pkt_overhead);
ndpiStats.incStats(ndpi_proto, , , , pkt_len);
pktStats.incStats(pkt_len);
if(lastSecUpdate == ) lastSecUpdate = when; else if(lastSecUpdate != when) updateSecondTraffic(when);
};
//因涉及到pcap抓包,所以有些常量是pcap定义的
#define DLT_NULL 0 /* BSD loopback encapsulation */
#define DLT_EN10MB 1 /* Ethernet (10Mb) */
#define DLT_EN3MB 2 /* Experimental Ethernet (3Mb) */
#define DLT_AX25 3 /* Amateur Radio AX.25 */
#define DLT_PRONET 4 /* Proteon ProNET Token Ring */
#define DLT_CHAOS 5 /* Chaos */
#define DLT_IEEE802 6 /* 802.5 Token Ring */
#define DLT_ARCNET 7 /* ARCNET, with BSD-style header */
#define DLT_SLIP 8 /* Serial Line IP */
#define DLT_PPP 9 /* Point-to-point Protocol */
#define DLT_FDDI 10 /* FDDI */ /*
* These are types that are different on some platforms, and that
* have been defined by <net/bpf.h> for ages. We use #ifdefs to
* detect the BSDs that define them differently from the traditional
* libpcap <net/bpf.h>
*
* XXX - DLT_ATM_RFC1483 is 13 in BSD/OS, and DLT_RAW is 14 in BSD/OS,
* but I don't know what the right #define is for BSD/OS.
*/
#define DLT_ATM_RFC1483 11 /* LLC-encapsulated ATM */ #ifdef __OpenBSD__
#define DLT_RAW 14 /* raw IP */
#else
#define DLT_RAW 12 /* raw IP */
#endif
ntopng源码分析的更多相关文章
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
- java使用websocket,并且获取HttpSession,源码分析
转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...
- ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...
- ABP源码分析三:ABP Module
Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...
随机推荐
- C#算两个时间段相差的时间
在数据中经常算两个时间差或者在某个时间段的内容 在数据库中设计表字段类型的时候设计为varchar类型,然后进行可以再Sql语句中书写>=或者<=这样的进行比较就可以查询出某个时间段的内容 ...
- windows下搭建Cygwin环境
windows下搭建Cygwin环境 在上一篇博文<Android学习——windows下搭建NDK_r9环境>中,我们详细的讲解了在windows下进行Android NDK开发环境的配 ...
- KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态
KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态获取 <寒江独钓>内核学习笔记(5) 继续我们的线程相关的数据结构的学习.接下来我们学习 KTH ...
- D11
=-=感觉今天的题目好难... 主要是没有碰到过,所以会觉得不懂怎么写.. 其实现在想想,T1,T2,T3其实都好水..T1其实没有做过还真不会,有做过的话就是个大水题了 T2找最小环..超级裸的,但 ...
- ASP.NET MVC相关
Orchard源码分析(7):ASP.NET MVC相关 概述 Orchard归根结底是一个ASP.NET MVC(以后都简称为MVC)应用,但在前面的分析中,与MVC相关内容的涉及得很少.MVC提供 ...
- SQL Server跨网段(跨机房)FTP复制
SQL Server跨网段(跨机房)FTP复制 2013-09-24 17:53 by 听风吹雨, 273 阅读, 0 评论, 收藏, 编辑 一. 背景 搭建SQL Server复制的时候,如果网络环 ...
- Java 快速开发平台 WB 6.8 发布
WebBuilder是一款开源的可视化Web应用开发和运行平台. 基于浏览器的集成开发环境,采用可视化的设计模式,支持控件的拖拽操作,能轻松完成前后台应用开发: 高效.稳定和可扩展的特点,适合复杂企业 ...
- cocos2d-x 3.0 cocos run Couldn't find the gcc toolchain.
出现这个错误是NDK_ROOT环境变量没有设置好,要么设置错了,要么没有重启终端(也就是环境变量还没有生效).我就是因为没有重启终端坑了一个晚上,我只能帮你到这了,玩cocos2d-x 3.0的朋友, ...
- Scrapy 通过登录的方式爬取豆瓣影评数据
Scrapy 通过登录的方式爬取豆瓣影评数据 爬虫 Scrapy 豆瓣 Fly 由于需要爬取影评数据在来做分析,就选择了豆瓣影评来抓取数据,工具使用的是Scrapy工具来实现.scrapy工具使用起来 ...
- Fragment与Activity交互(使用接口)
在Fragment中: 1. // 定义一个回调接口,该Fragment所在Activity需要实现该接口// 该Fragment将通过该接口与它所在的Activity交互 { public void ...