目前在
分為兩個層次:其一是應用分析,學會如何使用;其二是原理分析,看懂它如何實現。
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.