nDPI-dev分析
目前在
分为两个层次:其一是应用分析,学会如何使用;其二是原理分析,看懂它如何实现。
1. 打包该数据帧,搜集l3、l4层报头信息
2. 查询链接跟踪(如果已被标识,则直接获取到该数据帧所属协议类型)
3. 从链接跟踪中未获取流量所属协议类型,则进入深度报文分析过程
4. 率先进行协议猜测,调用相应的协议分析器分析
5. 猜测协议错误、此时ndpi会分类遍历相关类型的协议分析器进行分析,直至分析出结果或遍历完所有相关的协议分析器
6. 将分析出的协议类型标记到链接跟踪中,以便下次可直接从连接跟踪中拿到协议类型
ndpi_set_proto_defaults函数是设置每个协议号对应的属性:协议标号,名称,默认端口范围,breed属性分类,类型分类,是否有子协议
u_int16_t tcp_master_protoId[2], u_int16_t udp_master_protoId[2] 不知道什么用?
nDPI综合了各种识别方式
IP list ASN分配的
默认端口范围port
Host URL关键字,模式匹配
开放了一个内容匹配的接口,但是未使用。
ndpi_guess_protocol_id() 针对flow提到的端口信息在默认端口协议树中guess protocol id,体现在flow->guessed_protocol_id上。
ndpi_guess_host_protocol_id()针对flow的IP Layer在IP List中查找配置的协议号,体现在flow->guessed_host_protocol_id上。
guessed_category这个猜测根据什么,貌似目前没用到。
guessed_header_category这个是来源ndpi_fill_ip_protocol_category()函数返回,是从IP划分的分类方式。
用户自定义的端口识别优先级最高。
原则:
1. 如果根据端口guess猜测出来的协议号是自定义协议(用户加载配置进来的),那么此时就直接判定该flow是此协议,返回的
ndpi_protocol.master_protocol = NDPI_PROTOCOL_UNKNOWN,
ndpi_protocol.app_protocol = flow->guessed_protocol_id
ndpi_protocol.category是该协议在加载时配置的分类
2. 如果端口guess出来的协议号是非自定义的,或者是unknown的,那么就用IP guess出来的判断,如果Ip guess 出来的是自定义协议号,那么
3. tcp流最多判断10条包,udp流最多判断8条,就不再检测。
一条流flow在什么时候停止继续识别?
1. A TCP flow,whose first packet is NOT a SYN,no protocol has been detected,We don't see how future packets can match anything,hence we giveup here.