一、層次化的數據包協議分析方法 IP
/ \
TCP UDP
/ \
HTTP TFTP
由於網絡協議種類很多,就WireShark所識別的500多種協議來說,爲了使協議和協議間層次關係明顯。從而對數據流裏的各個層次的協議能夠逐層處理。WireShark系統採用了協議樹的方式。上圖就是一個簡單的協議樹。如果協議A的所有數據都是封裝在協議B裏的,那麼這個協議A就是協議B是另外一個協議的兒子節點。我們將最低層的無結構數據流作爲根接點。那麼具有相同父節點的協議成爲兄弟節點。那麼這些擁有同樣父協議兄弟節點協議如何互相區分了?WireShark系統採用協議的特徵字來識別。每個協議會註冊自己的特徵字。這些特徵字給自己的子節點協議提供可以互相區分開來的標識。比如tcp協議的port字段註冊後。
Tcp.port=21就可以認爲是ftp協議, 特徵字可以是協議規範定義的任何一個字段。比如ip協議就可以定義proto字段爲一個特徵字。在WireShark中註冊一個協議解析器首先要指出它的父協議是什麼。另外還要指出自己區別於父節點下的兄弟接點協議的特徵。比如ftp協議。在WireShark中他的父接點是tcp協議,它的特徵就是tcp協議的port字段爲21。 這樣當一個端口爲21的tcp數據流來到時。首先由tcp協議註冊的解析模塊處理,處理完之後通過查找協議樹找到自己協議下面的子協議,判斷應該由那個子協議來執行,找到正確的子協議後,就轉交給ftp註冊的解析模塊處理。這樣由根節點開始一層層解析下去。 由於採用了協議樹加特徵字的設計,這個系統在協議解析上由了很強的擴展性,增加一個協議解析器只需要將解析函數掛到協議樹的相應節點上即可。 二、基於插件技術的協議分析器 myprot_handle = create_dissector_handle(dissect_myprot, 儘管WireShark是目前最好的開放源碼的網絡分析系統,但WireShark仍然有一些可以改進的地方,一個優秀的網絡分析器,儘可能的正確分析出數據協議和高效的處理數據是兩個重要的指標。在協議識別方面WireShark大多采用端口識別,有少量協議採用內容識別。這就讓一些非標準端口的協議數據沒有正確解析出來。比如ftp協議如果不是21端口的話,WireShark就無法識別出來,只能作爲tcp數據處理。另外對於內容識別式。WireShark是將所以內容識別的函數組成一張入口表。每次協議數據需要內容識別時,按字母順序逐個調用表裏的每個識別函數。比如對於識別yahoo massanger協議。主要是看數據前幾個字節是不是’ymsg’.由於協議名爲y開頭。所以當識別出協議時已經把所有內容識別函數調用了一遍。這些都是由於WireShark沒有實現tcp協議棧,無法做到流級別的識別。導致在協議識別方面有點缺陷。 |
wireshark源代碼的結構分析
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.