一、系統環境
借助官方的API快速開發鏈路層->IP層->TCP層->HTTP層的協議解析,這樣下來就有了很清楚的路線和理解,其他協議的分析就比較簡單、明了了。
三、核心數據結構(Hash)
考慮到應用層協議識別的對象不是以單個報文為單位,而是將流作為一個整體考慮。以此為目的,要對數據流進行協議識別,首先需要對
網絡數據包做分流處理。流表操作的性能,將直接影響整個系統的性能。流表通過對網絡流數據包的五元組信息(源IP地址、目的IP地址、源端口、
目的端口、協議號)進行解析,對五元組信息進行哈希計算,按照哈希值將數據包分為不同的流,從而達到對數據包分流的目的。分流后,將每個
流的基本信息保存在流表中,為應用層協議識別等提供數據支持。
1、流表的設計
2、流表的處理流程
3、hash設計和計算
h(key)=((源端口號& 0xff) |((目的端口號&0xff) << 8) |((源IP地址& 0xff) << 16) |((目的IP地址& 0xff) << 24)) % HASH_SIZE ;
很容易想到同一個流有兩個方向,所以為了提高效率,先將五元組按照IP地址和端口號大小進行排序,這里規定最終的順序為:小口地址、大IP地址、小端口號、大端口號、協議號。因此,同一個流的兩個方向只需要計算一次hash值,提高了效率。除TCP、UDP外,其它協議的端口號規定為零。
四、流量統計
主要用於將系統運行過程中統計出的ip數據包的數量、長度、當前識別流的總數量、被識別出每種應用層協議數據包的個數、數據量的大小、
流的個數等信息實時的進行統計。統計模塊主要划分為以下幾個部分:全局信息統計、流表信息統計、協議信息統計。
統計模塊:
將系統運行過程中統計出的ip數據包的數量、長度、當前識別流的總數量、被識別出每種應用層協議數據包的個數、數據量的大小、流的
個數等信息實時的進行統計。將統計模塊主要划分為以下幾個部分:全局信息統計、流表信息統計、協議信息統計。
全局信息統計
全局信息統計主要包括收包數目、發包數目,IP包數目、非lP包數目、TCP包數目、UDP包數目等在進入流表之前通過分析五元組就可以獲得
的和數據包相關的統計信息。
流表的信息統計
主要統計流的數量,如:建立流的數量、已結束流的數量、TCP流的個數、UDP流的個數等。
協議統計信息
此處統計只在流刪除時進行,當刪除流時,觸發統計機制,從而將此流的相關信息記錄在相應的協議信息統計位置。
全局信息、流表信息、協議信息的統計時機
主要分為以下三點:
l、分析出五元組並進入流表之前。主要統計全局信息,例如收發包數目、IP包數目、TCP包數目等信息。
2、流表建立時刻。統計建立流表數目、TCP流表數目、UDP流表數目等信息。
3、流表結束時刻。統計完成流表數目、協議相關統計等信息。
五、上行/下行速率計算
1、首先是抓包時間的計算,我們要用的應該是網卡抓包時的時間戳,而不是系統時間,否則會有誤差。pcap_loop調用的回調函數的第二個參數
struct pcap_pkthdr可以獲取該時間戳。每次調用回調函數時保存上一次的時間,相鄰兩次相減就是傳輸時間。
2、為了提高計算的准確性,總數據量在鏈路層統計,而不是網絡層,這樣就需要獲取本地Mac地址,並對數據幀的目的Mac和本地Mac比較確定
是上傳還是下載數據包。
可以參考:http://blog.csdn.net/fengyun1989/article/details/7384879的策略。
以下是一些流量統計(IP包數、丟包率、上行/下行平均速率等)的運行結果: