文章狀態:已完成!
python
熱身題部分
題目
- 一、安裝虛擬機(可參考Vmware、Virtual Box等)
- 二、安裝ubuntu系統(推薦安裝16.04版本)
- 三、寫一個helloworld程序,在ubuntu系統上編譯運行(你可能須要瞭解linux系統的終端和一些基本命令、文本編輯工具nano、如何編譯代碼、運行程序)
做業實現
實驗環境:VMware上的ubuntu系統
使用Linux指令建立main.c源代碼:
linux
編譯運行:
git
基本題
1、瞭解新技術
衆多sketch的技術中,Count-min sketch 經常使用也並不複雜,但你可能須要稍微瞭解一點點散列的知識。從它入手不失爲一個好選擇,把它記錄在你的技術博客上:github
- 一、簡單描述什麼是sketch
- 二、描述Count-min sketch的算法過程
做業實現
理論題部分
代碼:測試時可跑通的代碼【須要創建項目,手動輸入請求,信息格式「
+ <空格> + <請求大小> 」,如圖】
算法
2、實現新技術
- 一、克隆一種版本(python或者c語言)的代碼,大體瞭解如何使用這個代碼,在ubuntu系統上編譯。本身任意編寫一個小測試,成功運行這個代碼。
- 二、你也能夠本身實現Count-min sketch。
做業實現
備註
- 其中,上面的部分是修改之前的測試數據(「IPxxx格式」輸出的即爲超過閾值1500的);
- 下面的部分是改進之後的測試數據(「hackIP:xxx格式」輸出的即爲超過閾值1500的請求)。
- 爲了方便起見,IP並未按照規範輸入,可是也區分開了
- 能夠看出,低頻的數據是存在估計誤差的(並且其實還挺大的)
測試問題:
- 在windows上能夠跑動,可是在虛擬機上出現Segmentation fault(core dumped)問題,通常是內存操做有誤(例如數組越界,空指針解引用);
- 大數運算操做,最好分開;(調試了很久)
- 虛擬機會崩~(短暫性無響應狀態,讓它本身再運行一下子就恢復了);
- 這個代碼的原核心是C++我也是用C++修改和調試,測試部分本身用C重寫,不知道可不可行。
3、獲取用戶請求
- 一、安裝並使用抓包工具tcpdump
- 二、輸入tcpdump -n 獲取數據包的信息
- 三、使用linux 重定向的方法把該信息用文本文件存起來,文件命名爲 pakcet_capture.txt。
做業實現
抓取數據包而且重定向:
結果:
shell
問題
- 一、直接tcpdump -n還會獲得除了IP協議以外的數據包,例如arp協議,所以爲了格式上的統一使用了tcpdump ip -n
- 二、ctrl+c才能夠中止當前終端的運行並將數據重定向入文本文件中,不然使用」$ tcpdump ip -c + <須要抓取的數據包的數量> 」,能夠抓取指定數量的數據包
4、請求格式處理
- 一、使用程序把第一條請求處理成第二條請求的格式
- 二、使用linux 重定向的方法把該信息用文本文件存起來,命名爲Request.txt。
做業實現
IPmessage.py實現文件處理:
獲得處理之後的Request文件:
代碼:處理數據包格式的代碼ubuntu
各類問題
- 一、「request denied」,在unix/linux上若要直接運行.py文件:須要對.py文件添加特殊註釋->執行權限
- 二、「syntax error near unexpected token ‘ <字符> ’ 」、「$'\r': command not found」等shell腳本執行問題,由windows文件某些字符與Unix文件格式不兼容造,須要轉成unix格式:
安裝dos2unix-> $ dos2unix <文件名>
- 三、發現獲取的IP傳輸數據包有的length爲0,有的甚至不包含length(居然是一堆網址和雜亂的字母?),所以在代碼中過濾了這部分的信息,以減小後續的處理。
- 四、python的readlines()函數自帶'\n',因此在判斷最後一個數字是不是零的時候要考慮‘0\n’
5、測試新技術
- 用跑通的Count-min sketch程序讀文件,得到最後的處理結果,請求大小超過閾值T認定爲黑客,此處T本身定義。
做業實現
windows實現:
Ubuntu實現:
代碼:最終代碼windows
備註:數組
- 該實現的閾值T=1500
- 本次代碼有多個文件:有packet_capture, Request, output三個文本文件,以及其餘代碼(包括測試代碼和最終代碼);
- 從因爲是邊存邊算,因此實現該方法時,並未考慮對於重複IP的處理,因此如圖所示,輸出了屢次相同HackIP;
- ubuntu實現中,有一次core dumped錯誤出現是由於,我不當心貼了沒修改過的錯誤代碼,後來從新連接編譯了正確的代碼才完成。
開放題
理論題部分
做業實現
理論題部分
實驗題部分
做業實現
暫時有些個改進想法:
一、使用多線程可否會更快(這個靠現階段的知識暫時不可能實現了,一個線程讀,一個線程寫);
二、參照上一次的「創建一個黑名單名錄」,加速過濾。(這個仍是能夠實現的,可是開闢名單、查詢名單也算是一部分開銷吧)(二更:該點已實現)
三、邊讀邊寫,沒必要等它所有讀完再寫,算不算實時?仍是說,能夠模擬真實的網絡流環境,原始數據「接收、處理、判斷、拉黑」一條龍在線服務?實時的具體含義是什麼暫時沒搞懂。(後者可能能夠經過tcpdump -n + 直接屢次重定向,省略掉中間的packet_capture和Request文件的生成,直接實時性寫入output.txt中)
實驗部分:代碼改進
對於第二點——達成了中間處理過程的精簡可是容錯率上升
代碼:實現名單過濾的改進代碼
無需另外開闢名單,直接利用hash函數檢索,估計上一次是否超過閾值便可。
- 考慮到僅僅一次估測會出錯,不妨取三次估測值,若是至少兩次超過閾值,纔會跳過該IP的輸入,儘量提升已經下降的容錯率。若是增長前的估計已經超過閾值,那麼考慮到接下來還會繼續增長數據大小,絕大多數數據能夠和估計的偏差相抵消。(四次隨機文件讀取能夠看出對於低頻數據的偏差依舊難以抵消)
- 該點改進很重要,對比改進先後文件大小能夠看出:以前數據重複寫入的數量之多(output_pre是未改進的結果中文件,大小遠遠高出二次過濾之後的文件)。
Github_address
(須要手動輸入,C++/C混編)
(python)
(只須要Request.txt文件便可,C++/C混編)
文章狀態:已完成! P.s. 如有各類其餘問題,還望指教。