• 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.

    每走一步,都是新的开始!
  • 相关阅读:
    redisTemplate
    HttpURLConnection下载文件流
    Quartz集成springMVC 的方案二(持久化任务、集群和分布式)
    https请求
    将一个 JavaBean 对象转化为一个 Map
    Redis实现简单消息队列
    Spring Boot RestTemplate文件上传
    获取java栈异常
    获取 *.properties配置文件内容
    java格式化json串
  • 原文地址:https://www.cnblogs.com/shafei/p/10740692.html
Copyright © 2020-2023  润新知