點擊上方↑↑↑藍字[協議分析與還原]關注咱們緩存
「 介紹TCP排序方法,分享一個Windows版的TCP排序工具。」網絡
在分析協議的過程當中,不可避免地須要抓包。tcp
不管抓包條件如何優越,不管Windows下使用wireshark仍是Linux下使用tcpdump,不管是在我的機器網卡仍是骨幹網絡的分光分流口,當pcap被保存,當pcap文件被打開,都會碰到報文亂序、重傳的狀況,有時報文狀況會至關的糟糕,而且至關的廣泛,這是一種正常的技術現象,只要是抓包就會碰到的現象。工具
在協議解析系統中,首先要處理的就是TCP亂序重傳的問題,不然,不少信息就解析不出來。spa
在協議分析過程當中,也要處理TCP亂序重傳問題,不然,分析就會遇到不少困難。命令行
畢竟人腦並行處理的能力有限,當TCP報文的亂序嚴重影響到分析過程的時候,最好的解決方案是將報文的順序調整正確,即對pcap內的報文進行排序。若是報文數量較少,可使用WireEdit工具手動對pcap包內的報文進行調整,對一個個數據幀進行剪切、粘帖、刪除都很順手,雖然每次操做都會消耗必定的時間。排序
有須要WireEdit的朋友,請發送「wireedit」獲取下載地址。token
當一個pcap內報文數量不少時,手動調整就很不現實了,迫切須要有一個對TCP進行排序的工具對報文進行排序。在網上一直沒找到合適的工具。接口
一個可正常使用的還原解析系統,通常都實現了TCP排序及讀包處理的過程,若是系統的TCP排序模塊留有接口,讀入pcap文件,輸出排序好TCP的pcap文件,那咱們就能夠藉助解析系統來實現TCP排序。但不少時候,因爲不少緣由,協議還原解析系統並不能很好地知足須要,所以在這裏提供一個簡單的對pcap內的TCP排序的工具,發送「tcpsort」獲取下載地址。進程
本文將首先介紹TCP排序原理,而後介紹下這款簡單的排序工具的使用方法,它能知足大部分的TCP排序需求。
01
—
TCP排序基本原理
咱們知道,TCP協議是有鏈接的協議,數據的傳輸具有可靠性,在協議控制層對數據傳輸過程及內容的正確性及可靠性進行保證。
對TCP IP協議的介紹可參考以前的文章:
TCP排序就是利用TCP協議的可靠性特徵,來使數據包的順序正確,從而不影響協議的分析與解析過程。
一個常見的TCP報文,在以太頭、IP頭以後,就是TCP協議頭了,TCP頭格式以下:
熟悉TCP協議的同志應該知道,TCP頭內的seq及ACK兩個整數就是用來進行可靠性保證的關鍵字段。
每一個報文根據以前已傳輸的數據內容體的長度,有一個本身的seq,固然,seq不必定惟一,由於有空包的存在,同時,seq從syn包的seq開始,同一個TCP流內,同一個方向的seq是遞增的,遞增值與TCP包內傳輸的內容體長度字節數相關。在咱們使用wireshark看報文的時候,會在TCP頭的解析內,看到一個nextseq值,這個值在報文中並不存在,是根據當前報文長度算出來的,咱們在TCP排序過程當中也會事先算好nextseq值。就像下面這個例子:
另外,seq值的遞增,須要注意,根據協議標準,syn包的下一個包,seq值是加一的,而不會由於syn包內沒有數據內容而相等,上下行都是這樣子。
對於ACK,通常是標明所迴應的另外一側的報文的序號,即對應報文的seq,ACK在雙向報文具有嚴格的交互關係時,須要保證上下行TCP報文的順序的TCP排序中須要用到,但應用面有限,更多的涉及到協議應用層數據的處理,同時會使複雜性大增,咱們在對pcap的TCP排序中就能夠簡化掉,不須要額外處理了。
通常來講,簡單的TCP排序只須要處理seq的變化就能夠了,當一個方向指望的nextseq與比當前seq要小時,能夠認爲中間丟包了,就將當前報文緩存起來,等待中間報文的出現。
處理了亂序,固然要順便簡單處理下重傳的數據了。爲何說是簡單處理呢?由於嚴格按協議來處理太複雜了。
TCP頭中有一個字段叫checksum,就是校驗和,是報文內容的CRC32值,理論上咱們能夠用它來判斷是否存在報文的重傳,但對排序的實現而言,須要保存以前的checksum值,太不合算了,因此實際實現過程當中沒有選取它來判斷重傳。
同時,TCP協議的重傳,是能夠重傳某一部分數據的,這在理論上,會致使重傳相關的兩個報文內容出現部分包含的狀況,這種重傳在實際抓包過程當中出現不多,咱們在排序中就不處理了。
把複雜狀況排除,剩下的場景就簡單了,只須要根據seq,nextseq,ack這幾項tcp頭內的特徵,與前一個已經排序好的報文相比,值小的話就判斷是重傳便可。
另外,排序還需考慮鏈接報文從中間開始的狀況,此時,直接認爲第一個包就是排序好的包。
本文介紹的對pcap內TCP排序的工具就是按照上面的方法實現的。
02
—
TCP排序工具介紹
這款工具是在Windows下使用vs2012開發的,名稱爲「sortpcap」。
工具主要使用到了winpcap庫,所以使用的機器最好能裝winpcap庫,若是裝了wireshark,默認該庫就已經裝上了,就不須要額外安裝。
工具的主要功能是,讀入一個pcap文件,對文件內的TCP報文進行排序處理,最終輸出排序好的pcap文件。
工具比較簡單,使用命令行進行交互,但已知足了大部分的需求。使用過程很簡單,能夠選擇在進程啓動時參數中帶文件名使用,像這樣:
sortpcap.exe test3.pcap
回車後會馬上對文件進行排序,輸出結果。
也能夠在啓動後再輸入須要排序的文件:
其中的test3.pcap爲輸入的待排序文件名稱,可帶路徑。
最終輸出的排序好的pcap文件被命名爲「sort.原輸入文件名」,存在運行目錄下:
排序過程當中程序窗口會有些過程打印,原本是能夠去掉的,但留着或許會有用,排序結束會輸出提示:按任意鍵就會退出程序窗口。
下面一個pcap排序先後的內容對比,這裏用的是一個只有一條連接的pcap文件。
排序前的文件內容:
排序後的文件內容:
排序效果肉眼可見,排序後文件內錯誤的是一些0字節報文和checksum校驗錯誤。
這款工具基本能上知足了協議分析的需求,若是須要的話發送「tcpsort」獲取下載地址,源碼恕不公開,若是確實須要源碼,可與我聯繫。
須要注意,這個工具僅針對協議分析過程當中的TCP排序需求實現,沒有考慮其它的應用場景,因此若是須要在大型解析系統中使用的話,還需考慮特定狀況。
TCP排序工具的介紹到此就結束了,歡迎擴散,共同提升。
長按進行關注,時刻進行交流。
點擊右下方「在看」,與朋友們一塊兒分享吧↘