淺談wireshark解析ceph網路通訊
一、安裝wireshark
wireshark從2.0版開始支援ceph協議解析
下載地址:https://www.wireshark.org/download/
二、ceph網路抓包
使用tcpdump在ceph叢集上抓包,e.g.:tcpdump -i ens33 -s 0 -w 3ceph.pcap host 172.16.134.95 and host 172.16.134.96 ,
ens33是網路介面名字,3ceph.pcap是儲存的抓包的檔名字,host 172.16.134.95 and host 172.16.134.96是在這兩個節點之間流動的資料包
注意:tcpdump抓包要從ceph叢集會話開始抓,否則在會話中間抓包,wireshark不識別。
三、wireshark架構
1、GUI處理在頁面上所有使用者的顯示包塊對話方塊,原始碼在ui/qt下面
2、core主要的“膠水”模組,把別的模組整合到一起,原始碼在根目錄下
3、Epan包分析引擎,用協議書的形式分析包。原始碼在epan目錄下
4、Wiretap用於讀、寫捕獲的檔案,原始碼在wiretap目錄下
5、Capture捕獲網路資料的介面模組,原始碼在capture下
參考:https://www.wireshark.org/docs/wsdg_html_chunked/ChWorksOverview.html
四、wireshark 解析包流程
當Wireshark從檔案載入資料包時,每個資料包都會被解析。 Wireshark嘗試檢測資料包型別,並從資料包中獲取儘可能多的資訊。在此執行中,只需要包列表窗格中顯示的資訊。
當用戶在資料包列表窗格中選擇特定資料包時,將再次解析該資料包。 這一次,Wireshark嘗試獲取每一條資訊並將其放入資料包詳細資訊窗格中。
每個解剖器解碼其協議的一部分,然後將解碼交給後續解剖器以獲得封裝協議。
參考:https://www.wireshark.org/docs/wsdg_html_chunked/ChapterDissection.html
五、wireshark dissector原始碼分析
wireshark根目錄下epan/dissectors/packet-ceph.c是分析ceph網路協議的原始碼
10514行,註冊解析器函式,
10516行,建立ceph_handle,如果有相應的包呼叫dissec_ceph_old函式解析.
10518行,在啟發式解析器中加添dissect_ceph_heur,dissect_ceph_heur判斷是不是ceph的網路包。wireshark分為普通字串表,整數表和啟發式解析表,
啟發式解析器的特點是:一旦特定“連線”的資料包被識別為屬於對於特定的協議,Wireshark應該始終直接呼叫該解析器解析此協議。
7091行,判斷是不是ceph網路協議,其中C_BANNER定義在830行,C_BANNER_SIZE_MIN定義在833行
可見wireshark根據網路包中的ceph v標誌,判斷是否為ceph網路協議。
7099行,如果判斷是ceph協議,呼叫ceph_handle處理。在10516行中建立了ceph_handle。
7081行,呼叫dissect_ceph函式,解析網路包
07019行,在網路包列表protocol欄位中,設定Ceph欄位
當在一個網路包列表中點選一個網路包時,下方的網路包詳細資訊中,以樹形詳細列出網路包的詳細資訊。
用proto_item_add_subtree註冊下層的協議
c_dissect_xxx解析子樹。