2019寒假訓練營寒假做業(三) 程序題部分

文章狀態:已完成!
python


熱身題部分

題目

  • 一、安裝虛擬機(可參考Vmware、Virtual Box等)
  • 二、安裝ubuntu系統(推薦安裝16.04版本)
  • 三、寫一個helloworld程序,在ubuntu系統上編譯運行(你可能須要瞭解linux系統的終端和一些基本命令、文本編輯工具nano、如何編譯代碼、運行程序)


做業實現

實驗環境:VMware上的ubuntu系統
使用Linux指令建立main.c源代碼:
使用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實現文件處理:
IPmessage.py實現文件處理
獲得處理之後的Request文件:
獲得處理之後的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

github上使用的源文件

測試時跑通的代碼

(須要手動輸入,C++/C混編)

處理數據包格式

(python)

須要讀取文件的代碼

(只須要Request.txt文件便可,C++/C混編)

實現名單過濾的改進代碼

文章狀態:已完成! P.s. 如有各類其餘問題,還望指教。

相關文章
相關標籤/搜索